【导读】⾯对⽇益复杂的IT环境,如何⾼效分析监控数据并快速响应已成为运维工作中的关键挑战。本文深入探讨了DeepSeek与Zabbix结合的创新性应用,包括一键式智能告警分析、Zabbix文档知识库助手功能以及钉钉告警增强功能。通过详尽的部署指南和实用脚本,展示了DeepSeek如何助力提升故障排查效率,为运维工程师与系统管理员提供高效解决方案。
【作者】程哲,Zabbix开源社区代表,2024Zabbix中国峰会演讲嘉宾,Zabbix7.0中文手册译者
1 前置准备(部署zabbix7.0及准备DeepSeek模型API)
关于Zabbix的详尽安装步骤,本文不再展开讨论。笔者所构建的运行环境基于Zabbix 7.0、Nginx以及MySQL 8.0版本,且文中提及的所有应用场景均已在该特定配置环境下通过了实际验证。
1.1 私有化采用Ollama工具部署DeepSeek-R1模型(物理资源满足需求时参考)
Ollama是一款强大的私有化部署大模型工具,专为简化AI模型的部署和管理而设计,在满足物理资源需求的前提下私有化部署DeepSeek-R1模型时可采用ollama部署,在Linux环境中部署流程参考如下:
① 下载一键安装Ollama脚本并执行:
curl -fsSLhttp://113.141.80.105:9999/install.sh| sh
② 下载并运行deepseek-r1,按照自己硬件环境选择不同参数量的模型下载并运行即可
ollama run deepseek-r1:14b
DeepSeekR1各版本使用场景及参考硬件配置如下:
1.2 申请DeepSeek-R1官网API(建议)
官方API申请地址:https://platform.deepseek.com/sign_in
推荐大家使用DeepSeek官方API,不仅能提供稳定可靠的服务,而且成本极低,每百万tokens仅需8元。实际测试显示,调用API 30次仅消耗约20,000 tokens,费用约为0.1元,性价比非常高。申请后,请务必妥善保管您的API密钥。
2 场景一:Zabbix前端一键调用DeepSeek-API智能分析告警
通过在Zabbix前端集成DeepSeek分析功能,用户可以实现一键智能分析告警,快速生成详细的故障解析和解决方案建议。这一功能可以大幅提升故障排查的效率,还降低了运维人员的工作负担,确保系统稳定运行的同时,节省宝贵的时间和资源。
2.1 Zabbix 前端创建全局脚本
① 进入Zabbix首页路径:导航至 “ 告警 > 脚本 > 创建脚本”。
② 配置脚本信息:
名称:可自定义设置。 范围:选择 “手动执行事件操作”。 菜单路径:自定义菜单路径,便于快速找到。 类型:选择 “脚本”。 执行位置:选择 “zabbix proxy或server”。
③ 命令栏内输入:
/etc/zabbix/scripts/send_alert_to_ai.sh "{TRIGGER.NAME}" "{TRIGGER.SUBJECT}""{HOST.NAME}" "{HOST.IP}" "{EVENT.TIME}" "{TRIGGER.SEVERITY}"
2.2 zabbix - server 服务器内新建调取 API 脚本
① 修改 zabbix - server 配置文件,打开全局脚本
vi /etc/zabbix/zabbix_server.conf
将 EnableGlobalscripts 设置为 1 以启用全局脚本:
EnableGlobalscripts=1
然后重启zabbix服务
systemctl restart zabbix-server
② 在zebbix-server上创建本地脚本
mkdir /etc/zabbix/scripts && cd /etc/zabbix/scripts,注意,如前端提示无法找到脚本文件,请尝试将脚本移至nginx代理的目录下。
vi send_alert_to_ai.sh
③ 调用deepseek官方api脚本如下,注意DeepSeek KEY请替换为您的API_KEY
#!/bin/bash
# DeepSeek API配置
API_URL="https://api.deepseek.com/chat/completions"
API_KEY="xxxxxxxxxxxxxxxxxxxx"
# 获取传递的参数作为告警信息
TRIGGER_NAME="$1"
ALERT_SUBJECT="$2"
HOSTNAME="$3"
HOST_IP="$4"
EVENT_TIME="$5"
TRIGGER_SEVERITY="$6"
# 构建更简洁的告警信息JSON格式
alert_info=$(cat <<EOF
{
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "你是一个专注于快速响应系统告警的助手。"},
{"role": "user", "content": "收到以下告警信息:\n\n触发名称: $TRIGGER_NAME\n告警主题: $ALERT_SUBJECT\n告警主机: $HOSTNAME\n主机IP: $HOST_IP\n告警时间: $EVENT_TIME\n警报等级: $TRIGGER_SEVERITY\n\n请以简短专业的语言告诉我发生告警的原因和处理措施,字数控制在300字以内。"}
],
"stream": false
}
EOF
)
# 发送POST请求并捕获响应和HTTP状态码
response=$(curl -s -w "\n%{http_code}" -X POST "$API_URL" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d "$alert_info")
# 分离HTTP状态码和响应体
http_code=$(echo "$response" | tail -n1)
response_body=$(echo "$response" | sed '$d')
# 解析并提取content字段
if [ "$http_code" -eq 200 ]; then
# 使用jq工具解析JSON
if ! command -v jq &> /dev/null; then
echo "jq could not be found, please install it first."
exit 1
fi
# 提取content字段并格式化输出
content=$(echo "$response_body" | jq -r '.choices[0].message.content')
echo -e "分析结果:\n$content"
else
echo "错误: HTTP 状态码 $http_code, 响应: $response_body"
fi
④ 调用私有化ollama部署的api脚本如下,注意脚本内api地址请替换为您的地址,model类型请更换为您运行的deepseek模型版本
#!/bin/bash
# Ollama API配置
API_URL="http://xxx.xxx.xxx.xxx:11434/api/chat"
# 使用函数来转义特殊字符
escape_json() {
if [ -z "$1" ]; then
echo '""'
else
python3 -c "import json, sys; print(json.dumps(sys.argv[1]))" "$1"
fi
}
# 获取传递的参数作为告警信息
TRIGGER_NAME=$(escape_json "$1")
ALERT_SUBJECT=$(escape_json "$2")
HOSTNAME=$(escape_json "$3")
HOST_IP=$(escape_json "$4")
EVENT_TIME=$(escape_json "$5")
TRIGGER_SEVERITY=$(escape_json "$6")
# 构建更简洁的告警信息JSON格式
alert_info=$(jq -n \
--arg model "deepseek-r1:14b" \
--arg role "user" \
--arg content "$(printf '收到以下告警信息:\n\n触发名称: %s\n告警主题: %s\n告警主机: %s\n主机IP: %s\n告警时间: %s\n警报等级: %s\n\n请以简短专业的语言告诉我发生告警的原因和处理措施,字数控制在300字以内。\n' "$TRIGGER_NAME" "$ALERT_SUBJECT" "$HOSTNAME" "$HOST_IP" "$EVENT_TIME" "$TRIGGER_SEVERITY")" \
'{
"model": $model,
"messages": [{
"role": $role,
"content": $content
}]
}')
# 发送POST请求并捕获响应和HTTP状态码
response=$(curl -s -w "\n%{http_code}" -X POST "$API_URL" \
-H "Content-Type: application/json" \
-d "$alert_info")
# 分离HTTP状态码和响应体
http_code=$(echo "$response" | awk 'END{print $NF}')
response_body=$(echo "$response" | sed '$d')
if [ "$http_code" -eq 200 ]; then
# 使用jq工具解析JSON
if ! command -v jq &> /dev/null; then
echo "jq could not be found, please install it first."
exit 1
fi
content=$(echo "$response_body" | jq -r '.message.content // empty')
# 删除分析结果前的文字(如果有)
clean_content=$(echo "$content" | sed '/^<think>/,/^<\/think>$/d' | tr -d '\n' | sed 's/^\s*//;s/\s*$//')
if [ -z "$clean_content" ]; then
echo "无法从响应中提取内容"
else
echo -e "分析结果:\n$clean_content"
fi
else
echo "错误: HTTP 状态码 $http_code, 响应: $response_body"
fi
赋予脚本执行权限:
chmod +x /etc/zabbix/scripts/send_alert_to_ai.sh
注意:脚本依赖jq处理和解析 JSON 数据,用来过滤、映射、聚合以及格式化 JSON 数据。如果您的系统上没有安装 jq,可以通过以下命令进行安装:
对于 Debian/Ubuntu 系统:
apt-get update
apt-get install jq
对于 CentOS/RHEL 系统:
yum install epel-release
yum install jq
2.3 Zabbix 仪表盘进行调用效果展示
完成上述步骤后,就可以在 Zabbix 仪表盘的当前问题小组件中直接调用展示,直观地查看告警分析结果。
执行后效果如下:
2.4 可选优化项目
① 执行后发现输出框较小,浏览不方便,我们可以通过修改前端css文件实现优化:
cd /usr/share/nginx/html/assets/styles/ && cp blue-theme.css blue-theme.css.bak
vi /usr/share/nginx/html/assets/styles/blue-theme.css
然后,在文件末尾添加:
#execution-output {
height: 500px; /* 调整为你希望的高度 */
width: 540px; /* 可选:根据需求调整宽度 */
overflow-y: auto; /* 当内容超出设定高度时显示滚动条 */
}
保存退出编辑器后,清除浏览器缓存,重新加载页面,最终显示如下:
② 执行一键分析脚本后输出反应慢如何优化?
在实测中,预计返回300字结果的时间约为20~30秒。您也可以通过调整脚本中的预置提示词来提高响应速度,但这会降低分析内容的丰富度。因此,建议根据实际需求调整脚本提示词中的回复字数,以平衡速度与内容深度。
3 场景二:基于DeepSeek构建Zabbix官方文档知识库问答系统
通过集成Zabbix+Maxkb+DeepSeek,可以轻松构建一个Zabbix官方文档的知识库问答系统。该系统能够自动解析和理解Zabbix官方文档内容,并为用户提供精准的问答服务。无论是查找特定配置指南、故障排查步骤,还是获取最佳实践建议,用户只需输入问题,系统即可快速返回准确答案。不仅可以提升信息检索的效率,还大幅减少了运维人员查阅文档的时间,确保问题得以迅速解决,提升整体工作效率。
3.1 系统架构
Zabbix:需提前部署完Zabbix,建议5.0以上版本。
Maxkb:一款基于大语言模型的开源知识库问答系统,支持快速上传文档、自动爬取在线文档,并能无缝嵌入第三方业务系统,为企业提供智能问答和信息管理的高效解决方案。
Deepseek:建议调用deepseek官方api,也可本地采用ollama工具私有部署。
3.2 安装并配置Maxkb
部署环境选用Linux系统,安装Maxkb前请提前安装好Docker,Docker安装Maxkb命令如下:
docker run -d --name=maxkb -p 8080:8080 -v ~/.max
通过浏览器访问 MaxKB:
http://目标服务器 IP 地址:8080
默认登录信息
用户名:admin
默认密码:MaxKB@123..
3.3 配置模型参考一(DeepSeek官方-API)
进入系统管理-模型设置-添加模型列表中,列出了所有可调用模型,选择添加deepseek模型,模型名称填写deepseek-api,模型类型选择大语言模型,基础模型选择“deepseek-chat”,最后将申请到的API Key填入即可。
3.4 配置模型参考二(基于Ollama私有化部署的deepseek)
进入系统管理-模型设置-添加模型列表中,选择添加Ollama模型,名称可填写deepseek-api,模型类型选择大语言模型,基础模型手动输入“deepseek-r1:7b”(以实际部署模型版本为准),API域名填写部署ollama的服务器ip+11434端口号,API Key未设置的话可输入任意字符,点击确定即可。
3.5 新建知识库并配置
点击创建知识库,按需填入知识库名称及描述等必填。
注意创建知识库时您可以选择两种类型:通用型和Web站点型。
通用型允许您上传或手动录入文档。例如,您可以上传本地的Zabbix 7.0手册PDF文件。
Web站点型则可以直接同步网站文本数据。对于Zabbix官方文档,您可以使用以下网址进行同步:_https://www.zabbix.com/documentation/7.0/zh/manual_
无论选择哪种方式,上传完成后系统将自动进行索引并进行向量化处理。只需等待索引完成即可。
3.6 新建应用并配置
随后,选择“应用”并创建新应用。输入自定义名称和描述后,选择“简单配置”即可快速完成设置。如果需要更复杂的流程,您也可以进行高级编排,但本文不再展开讨论这部分内容。
在设置中,根据实际需求修改AI模型和自定义开场白,并关联已上传的知识库。您可以在参数设置中调整检索模式和召回分段,通过测试不断优化,直至达到满意的效果。
3.7 嵌入至Zabbix前端
您还可以将助手添加到Zabbix前端,以便在页面上随时调用。具体步骤为:进入“应用” -> “Zabbix知识库小助手” -> “概览” -> “嵌入第三方”。
找到浮窗模式,复制所有代码,编辑Zabbix前端文件,根据zabbix安装路径查找,需要编辑page_footer.php和layout.htmlpage.php两个前端文件,具体行数可能因版本不同有所差异,此处仅以笔者环境为例:
vi /usr/share/zabbix/include/page_footer.php +62
在第62行加入
echo ' *******(此处为maxkb中复制的代码)';
vi /usr/share/zabbix/app/views/layout.htmlpage.php +96
在第96行加入
echo ' *******(此处为maxkb中复制的代码)';
最后重启zabbix即可
systemctl restart zabbix-server
3.8 效果展示
4 场景三:为钉钉告警添加DeepSeek深度分析
通过集成DeepSeek深度分析功能,钉钉推送告警信息时能自动解析告警,提供精准故障诊断和解决方案,助力运维人员快速定位并解决问题,提高系统维护效率。
4.1 钉钉告警群添加机器人
在钉钉群中创建机器人,并在安全设置中勾选关键词“告警”。然后获取 webhook 地址并妥善保存。
4.2 编辑告警脚本
脚本使用Python3解释器执行,需要确保系统上已安装Python 3以及对应的python库、工具
对于Ubuntu/Debian系统
apt update
apt install python3 python3-pip
pip3 install requests
对于CentOS/RHEL系统
dnf install python3
pip3 install requests
然后编辑脚本:
vi /usr/lib/zabbix/alertscripts/deepseekdingding.py
脚本内容如下,请将脚本中的钉钉 Webhook 地址和 DeepSeek API 密钥替换为您的实际值:
#!/usr/bin/env python3
#coding:utf-8
import requests
import sys
import json
class DingTalkBot(object):
# 发送消息
def send_news_message(self, webhook_url, subject, content, ai_response):
url = webhook_url
data = {
"msgtype": "markdown",
"markdown": {
"title": subject,
"text": f"{subject}\n{content}\n\n【DeepSeek分析】:\n\n{ai_response}"
}
}
headers = {'Content-Type': 'application/json'}
response = requests.post(url, headers=headers, data=json.dumps(data))
return response
if __name__ == '__main__':
WEBHOOK_URL = 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx'# 钉钉Webhook地址
API_URL = 'https://api.deepseek.com/chat/completions'
API_KEY = 'sk-xxxxxxxxxxxxxx'# DeepSeek API密钥
if len(sys.argv) < 3:
print("Error: Not enough arguments provided.")
sys.exit(1)
subject = str(sys.argv[1])
content = str(sys.argv[2])
print(f"Received subject: {subject}")
print(f"Received content: {content}")
try:
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json',
}
payload = {
"model": "deepseek-chat",# 使用指定的DeepSeek模型
"messages": [
{"role": "user", "content": f"你是一个专业的IT运维专家,请使用简洁且专业的语言告诉我发生这些告警的原因和处理建议,字数控制在100字以内{content}"}
]
}
ai_response = requests.post(API_URL, headers=headers, json=payload)
ai_response.raise_for_status()# 确保请求成功
ai_response_content = ai_response.json().get('choices', [{}])[0].get('message', {}).get('content', '')
except Exception as e:
ai_response_content = "\n接口调用超时或出错,请检查配置后重试"
bot = DingTalkBot()
response = bot.send_news_message(WEBHOOK_URL, subject, content, ai_response_content)
if response.status_code == 200:
print("消息发送成功")
else:
print(f"消息发送失败: {response.text}")
保存退出后给脚本赋予执行权限
chmod +x deepseekdingding.py
4.3 编辑Zabbix前端
① 新建告警媒介并添加消息模板
进入告警-媒介-创建媒介类型,填写内容如下:
名称ai-钉钉
类型 脚本
脚本名称 deepseekdingding.py
脚本参数
{ALERT.MESSAGE}
{ALERT.SUBJECT}
② 新建告警动作
进入告警-动作-触发器动作-创建动作,名称可填写钉钉告警-deepseek,条件按需要勾选
在动作中的操作选项,编辑如下:
Send to media typeai-钉钉
主题故障告警: {EVENT.NAME}
消息
【Zabbix告警通知】
告警组:{TRIGGER.HOSTGROUP.NAME}
告警主机:{HOSTNAME1}
主机IP:{HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
警报等级:{TRIGGER.SEVERITY}
问题信息:{TRIGGER.NAME}
事件ID: {EVENT.ID}
更新确认即可。
③ 给用户配置通知权限
进入用户-用户-告警媒介中新增一条如下:
添加后,点击更新即可。
4.4 效果展示
5 场景四:一键进行系统服务深度分析
通过结合Zabbix前端一键脚本调用系统服务状态、配置文件、日志文件,可以实现针对某项特定服务的深度巡检分析,效果展示如下:
6 后记:DeepSeek与Zabbix结合的实践与感想
通过整合DeepSeek的智能分析能力与Zabbix的强大监控功能,我们成功实现Zabbix前端一键智能告警分析、构建高效的知识库问答系统,增强钉钉告警机制,并探讨了一键进行系统服务深度分析。这些应用场景的集成不仅可以提高故障诊断的速度与准确性,还能有效缓解运维团队的工作压力。智能化监控与分析的应用,使我们在面对复杂且多变的IT环境时能够迅速响应并解决问题,从而确保系统的高可用性和稳定性。