智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表 原创

发布于 2025-8-18 08:04
浏览
0收藏

在人工智能技术飞速迭代的今天,大模型正以惊人的速度渗透到各行各业,从金融风控到医疗诊断,从智能制造到内容创作,通用人工智能的能力边界不断被拓展。随着技术的成熟,各行业不再满足于通用大模型的基础能力,而是开始将其与垂直领域深度融合,通过定制化开发解决行业痛点 —— 运维领域同样迎来了这场智能化变革。

在日常的 IT 运维工作中,Zabbix 作为广泛使用的监控系统,时刻守护着服务器、网络设备和业务系统的稳定运行。当 CPU 利用率突增、内存占用异常或服务响应延迟时,它能第一时间捕获异常数据并触发告警。但面对海量的监控指标和告警信息,运维人员往往需要花费大量时间分析根因、制定对策,效率瓶颈逐渐显现。

今天,我们通过一个案例,探索全新的协同模式:通过 DeepSeek 大模型与 Zabbix 的技术融合,搭建一套智能分析报表应用,让 AI 自动解析监控数据、生成专业分析报告,为运维决策提供精准支持。

为了让大家对案例有一个整体的认识,会详细描述程序安装、具体操作、代码执行的每个步骤。包括: Zabbix 安装、Server 与 Agent 关联,设置媒介、触发器与动作,以及DeepSeek处理监控参数并生成报表等四大部分,全程干货大家坐稳扶好,我发车。

一、安装 Zabbix

Zabbix 是一款开源的企业级监控解决方案,由 Zabbix Server 和 Zabbix Agent 两部分核心组件构成。Server 作为监控中枢,负责接收、存储监控数据并触发告警,支持分布式部署以应对大规模监控场景;Agent 则部署在被监控设备上,实时采集 CPU、内存、磁盘等硬件及系统指标,通过主动或被动模式将数据推送至 Server。

二者协同工作,可实现对服务器、网络设备、应用程序等 IT 基础设施的全面监控,凭借灵活的触发器配置和丰富的可视化功能,成为运维人员掌握系统状态的重要工具。接下来我们需要通过 Docker 的方式安装二者,并在其基础上进行报警的设置和智能报表的生成。

前置条件

在开启 Zabbix 与 DeepSeek 的智能报表开发之旅前,需先安装好 Docker。Docker 是一款开源的应用容器引擎,能助力开发者将应用及其依赖便捷打包至可移植的容器内,实现跨环境快速部署,具有轻量、高效等优势。前往 ​Docker 官网​,依据自身操作系统(Windows、Mac、Linux 等),下载对应版本,按安装向导提示完成操作,具体的安装步骤比较简单,在这里就不赘述了。

通过如下命令确认安装。

docker --version

如果看到如下输出:

Docker version 28.1.1, build 4eba377

说明 Docker 已经安装好了。

下载 Zabbix docker yaml 文件

完成了 Docker 安装之后,我们开始Zabbix 的安装,首先就是 Zabbix Server 了。 由于 Zabbix Server 部署涉及 server、mysql、frontend 等多个镜像,逐个用 docker 命令安装配置繁琐且易出错。推荐通过 Docker Compose一键部署,Docker Compose 是 Docker 官方推出的容器编排工具,专为简化多容器应用的部署与管理而生。其核心原理是通过一个 YAML 配置文件,集中定义应用所需的所有容器、网络、存储等资源及其关联关系,比如 Zabbix 的 server、mysql、frontend 等组件的镜像版本、环境变量、端口映射、依赖关系等。

使用时,只需执行一条命令,Docker Compose 便会根据配置文件自动创建并启动所有容器,同时维护容器间的网络通信和依赖顺序,避免了逐个启动容器时的繁琐操作和配置遗漏。

创建 Zabbix docker 文件目录

创建如下目录,用来存放 yaml文件,后面会执行该目录下的 yaml 文件完成 Zabbix 安装。

通过如下命令创建目录:

mkdir ~/docker && mkdir ~/docker/zabbix-docker && cd ~/docker/zabbix-docker

然后去 Zabbix 的 ​​Github 网站​​下载 yaml 文件,放到创建的目录中。我这里使用的是最新的 zabbix-docker-7.4.3 的包,里面包含了很多 yaml 文件,我们选择下图所示, 红色框体包含的部分就可以了。

修改 Zabbix 服务端口

顺嘴说一下, 为了避免端口冲突问题的发生。我需要在.env 文件中修改如图所示内容,修改之前 ZABBIX_WEB_NGINX_HTTP_PORT=80,我需要将其修改为 8080。如果不做修改,请保证本机运行的其他服务不会占用此端口。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

ZABBIX_WEB_NGINX_HTTP_PORT=8080

启动 Zabbix 服务

设置好端口之后,执行如下命令:

docker compose -f docker-compose_v3_alpine_mysql_latest.yaml up -d

首次运行需要下载镜像,可能需要几分钟。

[+] Running 5/5
 ✔ Network zabbix-docker_default Created 0.1s 
 ✔ Container zabbix-docker-mysql-1 Started 2.5s 
 ✔ Container zabbix-docker-zabbix-server-1 Started 1.1s 
 ✔ Container zabbix-docker-zabbix-web-1 Started 1.2s 
 ✔ Container zabbix-docker-zabbix-agent-1 Started 1.1s

通过 Docker Desktop 可以看到服务已经启动。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

此时可以打开浏览器,访问 Web UI:

​​http://localhost:8080​

默认登录账号密码:

  • 用户名:Admin​
  • 密码:zabbix

如果看到下图说明 Zabbix Server 已经安装完毕。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

获取 Zabbix Server 的 IP 地址

安装完 Zabbix Server 之后就需要安装 Zabbix Agent 了, 它会帮助我们监控主机的运行情况,并且将监控的结果传回 Zabbix Server,同时还要与 Zabbix Server 保持心跳连接。

在安装 Zabbix Agent 之前还需要知道 Zabbix Server 的 IP 以及需要监控主机的名字。

通过如下命令获取 Zabbix Server 的 IP。

docker inspect -f \
 '{{range $net,$cfg := .NetworkSettings.Networks}}{{printf "%s → %s\n" $net $cfg.IPAddress}}{{end}}' \
 zabbix-docker-743-zabbix-server-1

执行上述命令之后就可以查看 Zabbix Server 的 IP 地址了。

zabbix-docker-743_backend → 172.16.239.3
 zabbix-docker-743_database → 172.18.0.3
 zabbix-docker-743_frontend → 172.16.238.2
 zabbix-docker-743_tools_frontend → 172.16.240.2

从输出的结果来看 “zabbix-docker-743_backend → 172.16.239.3” 就是 Zabbix server 的 IP 地址, 这里需要做一个记录,后面创建 Zabbix Agent 的时候会用到。

获取监控主机的名字

通过 Zabbix WebUI 中的“数据采集”-“主机”就可以看到主机的名称,如下图所示。我们要监控的主机名字为“Zabbix server”,这个是创建 Zabbix Agent 的时候所需要的信息。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

安装 Zabbix Agent

通过 docker 命令 pull 拉取 Zabbix Agent 的镜像。

docker pull zabbix/zabbix-agent

看到如下消息说明拉取成功。

Using default tag: latest
 latest: Pulling from zabbix/zabbix-agent
 864bc305c662: Pull complete 
 d0d6eeb62c3f: Pull complete 
 99888e073bcb: Pull complete 
 15ab7c0ba17b: Pull complete 
 e4df0cda2793: Pull complete 
 4f4fb700ef54: Pull complete 
 Digest: sha256:e0fc7757c9eed70ac907fe9609c0b6e9a11d5f20a5730d6c9867e606ebdd60e6
 Status: Downloaded newer image for zabbix/zabbix-agent:latest
 docker.io/zabbix/zabbix-agent:latest

启动 Zabbix Agent

上面一顿操作 Zabbix Server 已安装, 连带还把 frontend,database 等服务也装上了。接下来,通过如下命令安装 Zabbix Agent。

docker run -dit \
 --name zabbix-agent \
 --network zabbix-docker-743_backend \
 -p 10050:10050 \
 -e ZBX_HOSTNAME="Zabbix server" \
 -e ZBX_SERVER_HOST="172.16.239.3" \
 -e ZBX_SERVER_PORT="10051" \
 zabbix/zabbix-agent:latest

执行完毕之后,到 Zabbix Desktop 中查看执行结果。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

看到如下图所示,说明已经连接上 Zabbix Server 了。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

二、关联 Zabbix Server 与 Zabbix Agent

自此,Zabbix Server 与 Agent 都已安装完毕,还需要在 Zabbix Server 中设置被监控主机的 Agent IP地址,一般来说我们会在被监控主机上安装 Zabbix Agent 从而监控主机的运行状态。所以,需要在 Zabbix Server WebUI 上配置Zabbix Agent 的 IP 地址。

通过如下命令,查看 Zabbix Agent 的 IP 地址:

docker inspect -f '{{range $net,$cfg := .NetworkSettings.Networks}}{{printf "%s → %s\n" $net $cfg.IPAddress}}{{end}}' zabbix-agent

执行之后得到如下结果:

zabbix-docker-743_backend → 172.16.239.4

接着将 IP (172.16.239.4),也就是 Zabbix Agent 的 IP, 写入到 Zabbix Server 接口的 Agent 中。

需要通过如下图的配置步骤,首先在“检测”中找到“主机”。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

在弹出的对话框中选中“主机”。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

在主机的“接口”设置中的 Agent 类型中输入 IP 地址,这里让 Zabbix Server 能够识别到 Zabbix Agent。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

“更新”完毕之后,可以在主机“Zabbix server”中看到“可用性”描述了接口(172.16.239.4:10050)的状态为“可用”,表示 Zabbix Server 和 Agent 已经连接成功了。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

三、设置媒介、触发器与动作

在对 Zabbix Server 与 Agent 进行关联之后,他们就能互相找到对方了,接着就需要定义媒介,设置脚本搜集监控参数,然后调用 DeepSeek 生成分析报表。这里我们的大致思路是通过设置 Zabbix 触发器接受从 Zabbix Agent 传来的参数异常信息,再让触发器与本地脚本进行互动,让脚本调用 DeepSeek 智能程序生成参数异常分析报告。

具体步骤,如下图所示,分为四个环节:

  • 媒介(模块 1):定义基础通信能力,通过「脚本」(如邮件发送脚本、消息推送脚本)与「消息」(告警内容模板),为后续通知动作提供基础载体,决定 “用什么方式、发什么内容”。
  • 用户媒介关联(模块 2):建立「用户」与「媒介」的绑定关系,让抽象的通信能力落地到具体用户,比如 “用户 A 关联‘邮件媒介’、用户 B 关联‘企业微信媒介’”,解决 “谁接收、用哪种媒介接收” 的问题。
  • 主机(模块 3):依托「触发器」+「表达式」,监控主机状态(如 CPU 过载、服务宕机),当系统指标匹配表达式规则(如 CPU 使用率超过一定数值 ),触发器被激活,成为告警的 “信号灯”。
  • 触发动作(模块 4):通过「条件」(关联触发器)判断是否触发,满足条件后,调用「操作」关联的「媒介 + 用户」,完成告警闭环 —— 把模块 1 定义的消息,通过模块 2 绑定的媒介,精准推送给用户,实现 “异常发生 → 自动告警” 的完整流程。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

添加脚本

在了解完整体思路之后,我们先在媒体中“添加脚本”。查看 Zabbix Server 中脚本所在的目录,通过 docker 命令查看哪些镜像正在执行。

docker ps

在“names”这一列,可以看到镜像的名称,得到如下结果:

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

由于我们希望在 Zabbix Server 中安装脚本,当介绍到 Zabbix Agent 的信息之后, 设置对应的报警规则(触发器),然后再通过事件调用脚本,通过脚本执行 DeepSeek 的调用。所以要确认 Zabbix Server 中对应存放脚本的目录,为了方便后面将主机的脚本目录挂载到 Zabbix Server 中的脚本目录。

执行如下命令进入 Zabbix server 镜像的 docker 命令行模式:

docker exec -it zabbix-docker-743-zabbix-server-1 /bin/sh

执行如下命令, 确认在镜像中存在如下目录,作为脚本的挂载目录:

ls -ld /usr/lib/zabbix/alertscripts

接着回到主机,在~/docker/下 创建zabbix-scripts 目录, 在目录中创建一个 deepseek.sh 的脚本作为测试脚本。

脚本内容先放入简单的“hello deepseek”。

#!/bin/bash
 echo "hello deepseek"

然后给目录和脚本设置权限。

Docker 容器内的 Zabbix 进程通常以非 root 用户(如 zabbix 用户,UID 可能为 1997)运行,而宿主机的目录 / 文件默认权限可能不允许容器内的非 root 用户访问或执行。

# 进入宿主机脚本目录的父目录
 cd ~/docker

 # 给目录设置可执行权限(允许进入目录)
 chmod 755 zabbix-scripts

 # 给目录内的脚本文件设置可执行权限
 chmod +x zabbix-scripts/*.sh

修改启动镜像命令所对应的文件,于是我们修改 docker-compose_v3_alpine_mysql_latest.yaml 文件,找到 zabbix server 对应的段落。

zabbix-server:
 extends:
 file: compose_zabbix_components.yaml
 service: server-mysql
 image: "${ZABBIX_SERVER_MYSQL_IMAGE}:${ZABBIX_ALPINE_IMAGE_TAG}${ZABBIX_IMAGE_TAG_POSTFIX}"
 volumes:
 - /etc/timezone:/etc/timezone:ro
 - ~/docker/zabbix-scripts:/usr/lib/zabbix/alertscripts
 depends_on:
 server-db-init:
 condition: service_completed_successfully
 labels:
 com.zabbix.os: "${ALPINE_OS_TAG}"

在这个部分加入,如下部分在 volumes 挂载的时候将脚本目录和 zabbix server 中的脚本目录进行对应。

- ~/docker/zabbix-scripts:/usr/lib/zabbix/alertscripts

最后,通过如下命令重新启动 docker 镜像。

# 先停止并移除当前运行的容器(不会删除数据卷和镜像)
 docker compose -f docker-compose_v3_alpine_mysql_latest.yaml down

 # 重新创建并启动容器(会应用新的volumes配置)
 docker compose -f docker-compose_v3_alpine_mysql_latest.yaml up -d

好了,脚本已经加载到 zabbix server 的镜像中了,我们要测试一下是否能够执行,以便后面事件调用的时候能够成功。

主机中顺序执行如下代码,分别是进入 docker 执行模式,跳转到脚本目录,执行 deepseek 的脚本。

docker exec -it zabbix-docker-743-zabbix-server-1 /bin/sh
 cd /usr/lib/zabbix/alertscripts
 ./deepseek.sh

为了完成测试,在 deepseek.sh 中我们写入如下内容:

#!/bin/bash

 # 获取当前脚本所在目录的绝对路径
 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)

 # 获取当前时间(格式:年-月-日 时:分:秒)
 CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")

 # 在脚本同目录创建test.txt并写入内容(包含时间戳)
 echo "[$CURRENT_TIME] hello deepseek" > "$SCRIPT_DIR/test.txt"

 # 可选:如果希望保留历史记录(而非覆盖),用 >> 追加模式
 # echo "[$CURRENT_TIME] hello deepseek" >> "$SCRIPT_DIR/test.txt"

在与 deepseek.sh 同目录下生成一个 test.txt 文件,写入时间和“hello deepseek”的字样。

设置媒介

接着来设置媒介,如下图所示“创建媒介类型”。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

在创建页面填写“名称”(没有特别要求)和“脚本名称”,这里的“脚本名称”需要与刚才挂载的脚本名称保持一致,还需要保证它在 docker 容器的如下地址:

/usr/lib/zabbix/alertscripts

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

点击“更新”完成脚本的创建。

此时回到媒介的列表页面,可以测试刚刚创建的脚本。点击“测试”按钮,如果看到测试成功的字样,说明脚本运行没有问题了。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

如果不放心,还可以回到脚本挂载的目录下面确认文件是否生成,内容是否与你所期望的一致。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

这里也可以创建消息模版,如下图所示:

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

关联媒介与用户

有了媒介(脚本+消息),接着需要将其关联到用户,也就是这个媒介给谁用?由于媒介属于“告警”的范畴,那么是告警就需要有具体的“人”响应。

如下图操作方式,这里我们选择“Admin”作为响应的“人”。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

选择“报警”媒介。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

点击“添加”。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

在“类型”中选择,刚才我们创建好的脚本媒介,这里收件人可以填写一个邮件地址。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

设置触发器

经过前面的设置之后,我们需要通过触发器发出报警,然后调用对应的脚本执行操作以及通知到具体的人。

如系统所示,进入触发器添加界面。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

点击“创建触发器”。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

填写触发器的内容,注意这里我设置的是 CPU 使用率超过 3%。为了方便测试,我这里修改成一个很小的值。在真实场景中需要按照 80 或者 90 这样的数据进行触发器的设置。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

点击“表达式”旁边的“添加”按钮进行条件的添加。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

设置动作(关联脚本)

完成上述操作之后,接下来就是设置动作,如下图所示“创建动作”。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

接着是一连串的“选择”操作,选择“添加”条件,然后在条件中选择触发器类型,以及具体的触发器。这里的触发器用我们之前创建好的 “CPU 使用率超过 3%”。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

最后就是设置“操作”了,将消息通过之前设置好的邮箱发送给用户。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

到这里整个媒介、触发器与动作的配置完成,让我们通过下面这张图再回顾一下整个过程。

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

测试触发器

这里需要通过模拟 CPU 使用率高的场景,从而触发报警,然后调用我们写好的 deepseek.sh 脚本。

执行如下代码以 root 的身份开启 docker 命令行模式。由于我们需要安装 stress 工具模拟 CPU 执行,所以需要 root 身份获取安装应用的权限。

docker exec -it --user root zabbix-docker-743-zabbix-server-1 /bin/sh

分别执行如下:

apk update
 apk add stress-ng

显示安装成功之后,再执行命令如下,启动4个CPU密集型进程,持续 30 秒。

stress-ng -c 4 -t 30s

执行完之后,如下图所示:

智能运维新范式:Zabbix 与 DeepSeek 协同构建自动分析报表-AI.x社区

最后看看脚本是否执行。

cat /usr/lib/zabbix/alertscripts/test.txt

由于我们的脚本会在当前目录下面生成 test.txt 文件,所以打开文件,看到如下内容。

[2025-08-06 16:25:24] hello deepseek

说明整个从触发、脚本、执行的过程成功了。接下来,我们需要在脚本中去调用 DeepSeek 的能力对数据进行分析。

四、 DeepSeek处理监控参数并生成报表

在完成触发器的测试之后,整个调用的链路就通畅了,接下来只需要将 deepseek.sh 脚本中的内容进行修改,去调用 DeepSeek 生成分析报告即可。由于 DeepSeek 的调用还需要一些 Python 的组件包,我们首先还是要进行组件安装与环境配置的操作。

组件安装与环境配置

在 Docker server 的运行容器内安装 Python 和 OpenAI。

执行如下命令:

apk update
 apk add --no-cache python3 py3-pip
 python3 --version 
 pip3 --version

看到如下信息,说明安装成功。

/var/lib/zabbix # python3 --version
 Python 3.12.11
 /var/lib/zabbix # pip3 --version 
 pip 25.1.1 from /usr/lib/python3.12/site-packages/pip (python 3.12)

接着使用刚刚安装完成的 pip3 安装 OpenAI,这里需要先安装 venv 为我们的代码创建虚拟环境,接着激活环境,然后在这个虚拟环境中安装 OpenAI。

# 1. 安装虚拟环境工具(Alpine 中需手动安装)
 apk add --no-cache python3-venv

 # 2. 创建虚拟环境(路径可自定义,例如 /var/lib/zabbix/venv)
 python3 -m venv /var/lib/zabbix/venv

 # 3. 激活虚拟环境
 source /var/lib/zabbix/venv/bin/activate

 # 4. 在虚拟环境中安装 openai(此时 pip 指向虚拟环境,无权限问题)
 pip install openai

 # 5. 验证安装(激活状态下)
 python -c "import openai; print('安装成功')" # 无报错即成功

 # 6. 退出虚拟环境(后续调用脚本时需先激活)
 deactivate

在编写 Deepseek.py 之前还需要保存 DeepSeek 的 API。这里我们将其保存到.env 文件中,文件内容如下:

DEEPSEEK_API_KEY=sk-aec0ed226aXXXX5ffd89ff

同时需要通过python-dotenv 读取 .env 文件中的环境变量,执行如下命令。 保证在 Python 的虚拟环境中。

source /var/lib/zabbix/venv/bin/activate
 pip install python-dotenv

测试 DeepSeek API 是否能够调通。

安装 curl,并执行指令:

apk add curl
 curl -v https://api.deepseek.com/v1

DeepSeek 生成告警报表

这里需要利用 DeepSeek 的 API 调用 DeepSeek 的能力, API 的调用在前面得到了证实。接下来就是代码的环节。

import os
 import sys
 import datetime
 from openai import OpenAI
 from dotenv import load_dotenv # 新增:导入dotenv库

 load_dotenv() # 默认读取当前目录的.env文件,若路径不同可指定:load_dotenv("/path/to/.env")

 def generate_alert_report():
 # 定义错误日志文件路径(与脚本同目录)
 script_dir = os.path.dirname(os.path.abspath(__file__)) # 获取当前脚本所在目录(绝对路径)
 error_log = os.path.join(script_dir, "error.log") # 错误日志放在脚本目录
 
 # 接收从Shell脚本传递的参数
 if len(sys.argv) != 7:
 error_msg = "错误:参数数量不正确,需要6个参数(cpu_util, host_name, item_key, host_ip, event_time, trigger_name)"
 with open(error_log, "a", encoding="utf-8") as f:
 f.write(f"[{datetime.datetime.now()}] {error_msg}\n")
 return error_msg
 
 # 解析参数
 cpu_util = sys.argv[1] # CPU利用率值
 host_name = sys.argv[2] # 主机名称
 item_key = sys.argv[3] # 监控项键值
 host_ip = sys.argv[4] # 主机IP
 event_time = sys.argv[5] # 告警时间
 trigger_name = sys.argv[6] # 触发器名称

 try:
 # 检查API密钥是否存在
 if not os.environ.get("DEEPSEEK_API_KEY"):
 error_msg = "错误:未设置DEEPSEEK_API_KEY环境变量"
 with open(error_log, "a", encoding="utf-8") as f:
 f.write(f"[{datetime.datetime.now()}] {error_msg}\n")
 return error_msg

 # 初始化OpenAI客户端(DeepSeek兼容OpenAI SDK)
 client = OpenAI(
 api_key=os.environ.get("DEEPSEEK_API_KEY"),
 base_url="https://api.deepseek.com/v1"
 )

 # 构建系统提示词(定义AI的角色和报告要求)
 system_prompt = """
 你是一名资深运维工程师,擅长分析服务器性能告警并生成专业报告。
 请根据提供的CPU告警信息,生成一份结构化的告警分析报告,包含以下内容:
 1. 告警基本信息(主机、IP、时间、触发条件)
 2. 可能的原因分析(基于CPU利用率和监控项)
 3. 建议的处理步骤(分点说明,清晰具体)
 4. 预防措施(如何避免类似问题再次发生)
 
 报告风格要专业、简洁,重点突出,便于运维人员快速理解和处理。
 """

 # 构建用户提示词(传递具体参数)
 user_prompt = f"""
 服务器告警信息如下:
 - 主机名称:{host_name}
 - 主机IP:{host_ip}
 - 告警时间:{event_time}
 - 触发条件:{trigger_name}
 - 当前CPU利用率:{cpu_util}%
 - 监控项键值:{item_key}
 
 请基于以上信息生成告警分析报告。
 """

 # 调用DeepSeek模型
 response = client.chat.completions.create(
 model="deepseek-chat",
 messages=[
 {"role": "system", "content": system_prompt},
 {"role": "user", "content": user_prompt}
 ],
 stream=False,
 max_tokens=1000
 )

 # 获取模型返回的报告内容
 report_content = response.choices[0].message.content

 # 生成报告文件名(包含主机名和时间戳)
 timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
 clean_host_name = host_name.replace(" ", "_") # 处理主机名中的空格
 report_filename = os.path.join(script_dir, f"alert_report_{clean_host_name}_{timestamp}.txt") # 关键:用script_dir指定路径
 
 # 将报告写入文件
 with open(report_filename, "w", encoding="utf-8") as f:
 f.write(f"=== 服务器CPU告警分析报告 ===\n")
 f.write(f"生成时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n")
 f.write(report_content)
 
 return f"告警报告生成成功:{report_filename}"

 except Exception as e:
 # 捕获所有异常并写入错误日志
 error_msg = f"生成报告失败:{str(e)}"
 with open(error_log, "a", encoding="utf-8") as f:
 f.write(f"[{datetime.datetime.now()}] {error_msg}\n")
 return error_msg

 if __name__ == "__main__":
 result = generate_alert_report()
 print(result) # 输出结果给Shell脚本

上面代码会接受来自 deepseek.sh 脚本传来的参数(CPU 报警参数),然后扮演 IT 运维工程师利用 DeepSeek 大模型生成报警的报告。

将报告放置在与 deepseek.py 相同的目录下。

在脚本中调用 deepseek.py

完成 deepseek.py 之后,我们还需要在 deepseek.sh 脚本中调用它,当触发器发出报警的时候调用deepseek.sh,deepseek.sh 再将报警数据传入deepseek.py 完成告警的闭环操作。

deepseek.sh 脚本修改如下:

#!/bin/bash

 # 获取脚本目录和日志文件
 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
 LOG_FILE="$SCRIPT_DIR/cpu_multi_params_log.log"

 # 接收多个参数(按Zabbix配置的顺序对应)
 cpu_util="$1" # 参数1:CPU利用率值
 host_name="$2" # 参数2:主机名称
 item_key="$3" # 参数3:监控项键值
 host_ip="$4" # 参数4:主机IP
 event_time="$5" # 参数5:告警时间
 trigger_name="$6" # 参数6:触发器名称

 # 记录所有参数到日志
 {
 echo "========================================="
 echo "日志生成时间: $(date "+%Y-%m-%d %H:%M:%S")"
 echo "1. CPU利用率值: $cpu_util" 
 echo "2. 主机名称: $host_name"
 echo "3. 监控项键值: $item_key"
 echo "4. 主机IP地址: $host_ip"
 echo "5. 告警触发时间: $event_time"
 echo "6. 触发器名称: $trigger_name"
 echo ""
 } >> "$LOG_FILE"

 # 简单验证(确保核心参数不为空)
 if [ -z "$cpu_util" ] || [ -z "$host_name" ]; then
 echo "[$(date "+%Y-%m-%d %H:%M:%S")] 错误:核心参数缺失(CPU值或主机名)" >> "$LOG_FILE"
 exit 1
 fi

 echo "[$(date "+%Y-%m-%d %H:%M:%S")] 多参数接收成功" >> "$LOG_FILE"

 # 调用deepseek.py并传递6个参数
 PY_SCRIPT="$SCRIPT_DIR/deepseek.py"
 if [ -f "$PY_SCRIPT" ]; then
 echo "[$(date "+%Y-%m-%d %H:%M:%S")] 开始调用Python脚本生成报告" >> "$LOG_FILE"
 # 执行Python脚本并捕获输出结果
 python_result=$(
 source /var/lib/zabbix/venv/bin/activate && \ # 激活虚拟环境
 python3 "$PY_SCRIPT" "$cpu_util" "$host_name" "$item_key" "$host_ip" "$event_time" "$trigger_name" 2>&1
 )
 # 将Python脚本的执行结果写入日志
 echo "[$(date "+%Y-%m-%d %H:%M:%S")] Python脚本执行结果: $python_result" >> "$LOG_FILE"
 else
 echo "[$(date "+%Y-%m-%d %H:%M:%S")] 错误:未找到Python脚本 $PY_SCRIPT" >> "$LOG_FILE"
 exit 1
 fi

注意如下代码,在调用 deepseek.py 之前需要激活虚拟环境,然后再通过 Python 的命令行传入几个参数。

python_result=$(
 source /var/lib/zabbix/venv/bin/activate && \ # 激活虚拟环境
 python3 "$PY_SCRIPT" "$cpu_util" "$host_name" "$item_key" "$host_ip" "$event_time" "$trigger_name" 2>&1
 )

测试 CPU 报警功能

依旧通过如下命令增加 CPU 利用率。

stress-ng -c 4 -t 30s

接着会在 Zabbix 平台,看到对应的报警信息。

同时,在 deepseek.sh 相同的目录下面看到日志信息。

日志生成时间: 2025-08-07 16:32:15
 1. CPU利用率值: 3.5 %
 2. 主机名称: Zabbix server
 3. 监控项键值: system.cpu.util
 4. 主机IP地址: 172.16.239.4
 5. 告警触发时间: 16:31:24
 6. 触发器名称: CPU使用率超过3%

 [2025-08-07 16:32:15] 多参数接收成功
 [2025-08-07 16:32:15] 开始调用Python脚本生成报告
 [2025-08-07 16:32:54] Python脚本执行结果: 告警报告生成成功:/usr/lib/zabbix/alertscripts/alert_report_Zabbix_server_20250807_163254.txt

日志中看到传入的 CPU 使用率的参数,以及 Python 脚本生成报告的信息。

同时再查看如下报告文件:

/usr/lib/zabbix/alertscripts/alert_report_Zabbix_server_20250807_163254.txt

得到报告的详细信息。

=== 服务器CPU告警分析报告 ===
生成时间:2025-08-07 16:32:54

# CPU告警分析报告

## 1. 告警基本信息
| 项目 | 详情 |
|------|------|
| 主机名称 | Zabbix server |
| 主机IP | 172.16.239.4 |
| 告警时间 | 16:31:24 |
| 触发条件 | CPU使用率 > 3% |
| 当前CPU利用率 | 3.5% |
| 监控项键值 | system.cpu.util |

## 2. 可能的原因分析
1. **监控阈值设置过低**:3%的CPU利用率阈值对于生产环境服务器来说过于敏感
2. **Zabbix自身监控活动**:作为监控服务器,Zabbix自身的数据收集和处理可能导致短暂的CPU使用率波动
3. **后台维护任务**:可能正在执行计划任务、日志轮转或数据库维护等常规操作
4. **网络活动增加**:客户端数据上报量临时增加导致处理负载上升

## 3. 建议的处理步骤
1. **确认当前系统状态**:
   - 执行`top`或`htop`命令查看实时进程占用情况
   - 检查`uptime`命令输出的系统负载平均值
   - 使用`ps aux --sort=-%cpu | head -10`查看CPU占用最高的进程

2. **调整监控阈值**:
   - 建议将CPU告警阈值调整为更合理的水平(如80%)
   - 对于Zabbix服务器,可考虑设置多级告警(警告/严重)

3. **检查Zabbix服务状态**:
   - 查看Zabbix server日志:`tail -f /var/log/zabbix/zabbix_server.log`
   - 确认是否有异常的任务堆积或数据库查询问题

## 4. 预防措施
1. **优化监控配置**:
   - 根据服务器角色和基准性能调整告警阈值
   - 对监控项设置合理的聚合时间(如5分钟平均值)

2. **性能基线建立**:
   - 记录服务器在不同时段的正常性能指标作为基准
   - 设置基于基线的动态告警阈值

3. **资源分配优化**:
   - 确保Zabbix服务器有足够的CPU资源
   - 考虑将数据库与Zabbix服务分离部署

4. **定期维护**:
   - 定期清理Zabbix历史数据
   - 优化数据库表和索引

5. **告警分级**:
   - 设置多级告警策略(信息/警告/严重)
   - 对非关键告警配置不同的通知渠道

**备注**:当前3.5%的CPU使用率属于极低负载,建议优先调整监控策略而非进行系统优化。

总结

本文围绕 Zabbix 与 DeepSeek 大模型的融合实践展开,构建智能运维分析体系。从基础部署起步,借 Docker 及 Compose 简化 Zabbix 复杂组件安装,完成 Server 与 Agent 关联,打通监控数据采集链路。

核心环节聚焦告警流程:通过配置媒介、触发器与动作,搭建从异常检测到脚本触发的通路,再借助 Docker 挂载脚本,实现与 DeepSeek 大模型的衔接。编写 Python 脚本调用 DeepSeek API,利用其智能分析能力,将 Zabbix 捕获的 CPU 利用率、主机信息等监控参数,转化为包含故障根因、处理建议的专业报表,赋能运维决策。

从模拟 CPU 过载测试验证流程闭环,到生成结构化分析报告,展现了大模型与传统监控工具结合的价值 —— 打破人工分析效率瓶颈,让运维从 “被动响应” 迈向 “智能预判”。

作者介绍

崔皓,51CTO社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
相关推荐