前置条件:已部署zabbix7.0

私有化部署ollama或申请deepseek官方api如下:

 Ⅰ私有化采用Ollama工具部署DeepSeek-R1模型(物理资源满足需求时参考)

Ollama是一款强大的私有化部署大模型工具,专为简化AI模型的部署和管理而设计,在满足物理资源需求的前提下私有化部署DeepSeek-R1模型时可采用ollama部署,在Linux环境中部署流程参考如下:

① 下载一键安装Ollama脚本并执行:

curl -fsSL  http://113.141.80.105:9999/install.sh  | sh

② 下载并运行deepseek-r1,按照自己硬件环境选择不同参数量的模型下载并运行即可

ollama run deepseek-r1:14b

DeepSeekR1各版本使用场景及参考硬件配置如下:

Ⅱ 申请DeepSeek-R1官网API(建议)

官方API申请地址:https://platform.deepseek.com/sign_in

推荐大家使用DeepSeek官方API,不仅能提供稳定可靠的服务,而且成本极低,每百万tokens仅需8元。实际测试显示,调用API 30次仅消耗约20,000 tokens,费用约为0.1元,性价比非常高。申请后,请务必妥善保管您的API密钥。

通过集成Zabbix+Maxkb+DeepSeek,可以轻松构建一个Zabbix官方文档的知识库问答系统。该系统能够自动解析和理解Zabbix官方文档内容,并为用户提供精准的问答服务。无论是查找特定配置指南、故障排查步骤,还是获取最佳实践建议,用户只需输入问题,系统即可快速返回准确答案。不仅可以提升信息检索的效率,还大幅减少了运维人员查阅文档的时间,确保问题得以迅速解决,提升整体工作效率。

通过在Zabbix前端集成DeepSeek分析功能,用户可以实现一键智能分析告警,快速生成详细的故障解析和解决方案建议。这一功能可以大幅提升故障排查的效率,还降低了运维人员的工作负担,确保系统稳定运行的同时,节省宝贵的时间和资源。

1.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}"

1.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

1.3 Zabbix 仪表盘进行调用效果展示

完成上述步骤后,就可以在 Zabbix 仪表盘的当前问题小组件中直接调用展示,直观地查看告警分析结果。

执行后效果如下:

1.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秒。您也可以通过调整脚本中的预置提示词来提高响应速度,但这会降低分析内容的丰富度。因此,建议根据实际需求调整脚本提示词中的回复字数,以平衡速度与内容深度。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐