
作者 | 崔皓
審校 | 重樓
開篇
在人工智能技術(shù)飛速迭代的今天,大模型正以驚人的速度滲透到各行各業(yè),從金融風(fēng)控到醫(yī)療診斷,從智能制造到內(nèi)容創(chuàng)作,通用人工智能的能力邊界不斷被拓展。隨著技術(shù)的成熟,各行業(yè)不再滿足于通用大模型的基礎(chǔ)能力,而是開始將其與垂直領(lǐng)域深度融合,通過(guò)定制化開發(fā)解決行業(yè)痛點(diǎn) —— 運(yùn)維領(lǐng)域同樣迎來(lái)了這場(chǎng)智能化變革。
在日常的 IT 運(yùn)維工作中,Zabbix 作為廣泛使用的監(jiān)控系統(tǒng),時(shí)刻守護(hù)著服務(wù)器、網(wǎng)絡(luò)設(shè)備和業(yè)務(wù)系統(tǒng)的穩(wěn)定運(yùn)行。當(dāng) CPU 利用率突增、內(nèi)存占用異常或服務(wù)響應(yīng)延遲時(shí),它能第一時(shí)間捕獲異常數(shù)據(jù)并觸發(fā)告警。但面對(duì)海量的監(jiān)控指標(biāo)和告警信息,運(yùn)維人員往往需要花費(fèi)大量時(shí)間分析根因、制定對(duì)策,效率瓶頸逐漸顯現(xiàn)。
今天,我們通過(guò)一個(gè)案例,探索全新的協(xié)同模式:通過(guò) DeepSeek 大模型與 Zabbix 的技術(shù)融合,搭建一套智能分析報(bào)表應(yīng)用,讓 AI 自動(dòng)解析監(jiān)控?cái)?shù)據(jù)、生成專業(yè)分析報(bào)告,為運(yùn)維決策提供精準(zhǔn)支持。
為了讓大家對(duì)案例有一個(gè)整體的認(rèn)識(shí),會(huì)詳細(xì)描述程序安裝、具體操作、代碼執(zhí)行的每個(gè)步驟。包括: Zabbix 安裝、Server 與 Agent 關(guān)聯(lián),設(shè)置媒介、觸發(fā)器與動(dòng)作,以及DeepSeek處理監(jiān)控參數(shù)并生成報(bào)表等四大部分,全程干貨大家坐穩(wěn)扶好,我發(fā)車。
一、安裝 Zabbix
Zabbix 是一款開源的企業(yè)級(jí)監(jiān)控解決方案,由 Zabbix Server 和 Zabbix Agent 兩部分核心組件構(gòu)成。Server 作為監(jiān)控中樞,負(fù)責(zé)接收、存儲(chǔ)監(jiān)控?cái)?shù)據(jù)并觸發(fā)告警,支持分布式部署以應(yīng)對(duì)大規(guī)模監(jiān)控場(chǎng)景;Agent 則部署在被監(jiān)控設(shè)備上,實(shí)時(shí)采集 CPU、內(nèi)存、磁盤等硬件及系統(tǒng)指標(biāo),通過(guò)主動(dòng)或被動(dòng)模式將數(shù)據(jù)推送至 Server。
二者協(xié)同工作,可實(shí)現(xiàn)對(duì)服務(wù)器、網(wǎng)絡(luò)設(shè)備、應(yīng)用程序等 IT 基礎(chǔ)設(shè)施的全面監(jiān)控,憑借靈活的觸發(fā)器配置和豐富的可視化功能,成為運(yùn)維人員掌握系統(tǒng)狀態(tài)的重要工具。接下來(lái)我們需要通過(guò) Docker 的方式安裝二者,并在其基礎(chǔ)上進(jìn)行報(bào)警的設(shè)置和智能報(bào)表的生成。
前置條件
在開啟 Zabbix 與 DeepSeek 的智能報(bào)表開發(fā)之旅前,需先安裝好 Docker。Docker 是一款開源的應(yīng)用容器引擎,能助力開發(fā)者將應(yīng)用及其依賴便捷打包至可移植的容器內(nèi),實(shí)現(xiàn)跨環(huán)境快速部署,具有輕量、高效等優(yōu)勢(shì)。前往 Docker 官網(wǎng),依據(jù)自身操作系統(tǒng)(Windows、Mac、Linux 等),下載對(duì)應(yīng)版本,按安裝向?qū)崾就瓿刹僮鳎唧w的安裝步驟比較簡(jiǎn)單,在這里就不贅述了。
通過(guò)如下命令確認(rèn)安裝。
docker --version如果看到如下輸出:
Docker version 28.1.1, build 4eba377說(shuō)明 Docker 已經(jīng)安裝好了。
下載 Zabbix docker yaml 文件
完成了 Docker 安裝之后,我們開始Zabbix 的安裝,首先就是 Zabbix Server 了。 由于 Zabbix Server 部署涉及 server、mysql、frontend 等多個(gè)鏡像,逐個(gè)用 docker 命令安裝配置繁瑣且易出錯(cuò)。推薦通過(guò) Docker Compose一鍵部署,Docker Compose 是 Docker 官方推出的容器編排工具,專為簡(jiǎn)化多容器應(yīng)用的部署與管理而生。其核心原理是通過(guò)一個(gè) YAML 配置文件,集中定義應(yīng)用所需的所有容器、網(wǎng)絡(luò)、存儲(chǔ)等資源及其關(guān)聯(lián)關(guān)系,比如 Zabbix 的 server、mysql、frontend 等組件的鏡像版本、環(huán)境變量、端口映射、依賴關(guān)系等。
使用時(shí),只需執(zhí)行一條命令,Docker Compose 便會(huì)根據(jù)配置文件自動(dòng)創(chuàng)建并啟動(dòng)所有容器,同時(shí)維護(hù)容器間的網(wǎng)絡(luò)通信和依賴順序,避免了逐個(gè)啟動(dòng)容器時(shí)的繁瑣操作和配置遺漏。
創(chuàng)建 Zabbix docker 文件目錄
創(chuàng)建如下目錄,用來(lái)存放 yaml文件,后面會(huì)執(zhí)行該目錄下的 yaml 文件完成 Zabbix 安裝。
通過(guò)如下命令創(chuàng)建目錄:
mkdir ~/docker && mkdir ~/docker/zabbix-docker && cd ~/docker/zabbix-docker
然后去 Zabbix 的 Github 網(wǎng)站下載 yaml 文件,放到創(chuàng)建的目錄中。我這里使用的是最新的 zabbix-docker-7.4.3 的包,里面包含了很多 yaml 文件,我們選擇下圖所示, 紅色框體包含的部分就可以了。
修改 Zabbix 服務(wù)端口
順嘴說(shuō)一下, 為了避免端口沖突問(wèn)題的發(fā)生。我需要在.env 文件中修改如圖所示內(nèi)容,修改之前 ZABBIX_WEB_NGINX_HTTP_PORT=80,我需要將其修改為 8080。如果不做修改,請(qǐng)保證本機(jī)運(yùn)行的其他服務(wù)不會(huì)占用此端口。

ZABBIX_WEB_NGINX_HTTP_PORT=8080啟動(dòng) Zabbix 服務(wù)
設(shè)置好端口之后,執(zhí)行如下命令:
docker compose -f docker-compose_v3_alpine_mysql_latest.yaml up -d首次運(yùn)行需要下載鏡像,可能需要幾分鐘。
[+] 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通過(guò) Docker Desktop 可以看到服務(wù)已經(jīng)啟動(dòng)。

此時(shí)可以打開瀏覽器,訪問(wèn) Web UI:
http://localhost:8080默認(rèn)登錄賬號(hào)密碼:
- 用戶名:Admin
- 密碼:zabbix
如果看到下圖說(shuō)明 Zabbix Server 已經(jīng)安裝完畢。

獲取 Zabbix Server 的 IP 地址
安裝完 Zabbix Server 之后就需要安裝 Zabbix Agent 了, 它會(huì)幫助我們監(jiān)控主機(jī)的運(yùn)行情況,并且將監(jiān)控的結(jié)果傳回 Zabbix Server,同時(shí)還要與 Zabbix Server 保持心跳連接。
在安裝 Zabbix Agent 之前還需要知道 Zabbix Server 的 IP 以及需要監(jiān)控主機(jī)的名字。
通過(guò)如下命令獲取 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執(zhí)行上述命令之后就可以查看 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從輸出的結(jié)果來(lái)看 “zabbix-docker-743_backend → 172.16.239.3” 就是 Zabbix server 的 IP 地址, 這里需要做一個(gè)記錄,后面創(chuàng)建 Zabbix Agent 的時(shí)候會(huì)用到。
獲取監(jiān)控主機(jī)的名字
通過(guò) Zabbix WebUI 中的“數(shù)據(jù)采集”-“主機(jī)”就可以看到主機(jī)的名稱,如下圖所示。我們要監(jiān)控的主機(jī)名字為“Zabbix server”,這個(gè)是創(chuàng)建 Zabbix Agent 的時(shí)候所需要的信息。

安裝 Zabbix Agent
通過(guò) docker 命令 pull 拉取 Zabbix Agent 的鏡像。
docker pull zabbix/zabbix-agent看到如下消息說(shuō)明拉取成功。
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啟動(dòng) Zabbix Agent
上面一頓操作 Zabbix Server 已安裝, 連帶還把 frontend,database 等服務(wù)也裝上了。接下來(lái),通過(guò)如下命令安裝 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執(zhí)行完畢之后,到 Zabbix Desktop 中查看執(zhí)行結(jié)果。

看到如下圖所示,說(shuō)明已經(jīng)連接上 Zabbix Server 了。

二、關(guān)聯(lián) Zabbix Server 與 Zabbix Agent
自此,Zabbix Server 與 Agent 都已安裝完畢,還需要在 Zabbix Server 中設(shè)置被監(jiān)控主機(jī)的 Agent IP地址,一般來(lái)說(shuō)我們會(huì)在被監(jiān)控主機(jī)上安裝 Zabbix Agent 從而監(jiān)控主機(jī)的運(yùn)行狀態(tài)。所以,需要在 Zabbix Server WebUI 上配置Zabbix Agent 的 IP 地址。
通過(guò)如下命令,查看 Zabbix Agent 的 IP 地址:
docker inspect -f '{{range $net,$cfg := .NetworkSettings.Networks}}{{printf "%s → %s\n" $net $cfg.IPAddress}}{{end}}' zabbix-agent執(zhí)行之后得到如下結(jié)果:
zabbix-docker-743_backend → 172.16.239.4接著將 IP (172.16.239.4),也就是 Zabbix Agent 的 IP, 寫入到 Zabbix Server 接口的 Agent 中。
需要通過(guò)如下圖的配置步驟,首先在“檢測(cè)”中找到“主機(jī)”。

在彈出的對(duì)話框中選中“主機(jī)”。

在主機(jī)的“接口”設(shè)置中的 Agent 類型中輸入 IP 地址,這里讓 Zabbix Server 能夠識(shí)別到 Zabbix Agent。

“更新”完畢之后,可以在主機(jī)“Zabbix server”中看到“可用性”描述了接口(172.16.239.4:10050)的狀態(tài)為“可用”,表示 Zabbix Server 和 Agent 已經(jīng)連接成功了。

三、設(shè)置媒介、觸發(fā)器與動(dòng)作
在對(duì) Zabbix Server 與 Agent 進(jìn)行關(guān)聯(lián)之后,他們就能互相找到對(duì)方了,接著就需要定義媒介,設(shè)置腳本搜集監(jiān)控參數(shù),然后調(diào)用 DeepSeek 生成分析報(bào)表。這里我們的大致思路是通過(guò)設(shè)置 Zabbix 觸發(fā)器接受從 Zabbix Agent 傳來(lái)的參數(shù)異常信息,再讓觸發(fā)器與本地腳本進(jìn)行互動(dòng),讓腳本調(diào)用 DeepSeek 智能程序生成參數(shù)異常分析報(bào)告。
具體步驟,如下圖所示,分為四個(gè)環(huán)節(jié):
- 媒介(模塊 1):定義基礎(chǔ)通信能力,通過(guò)「腳本」(如郵件發(fā)送腳本、消息推送腳本)與「消息」(告警內(nèi)容模板),為后續(xù)通知?jiǎng)幼魈峁┗A(chǔ)載體,決定 “用什么方式、發(fā)什么內(nèi)容”。
- 用戶媒介關(guān)聯(lián)(模塊 2):建立「用戶」與「媒介」的綁定關(guān)系,讓抽象的通信能力落地到具體用戶,比如 “用戶 A 關(guān)聯(lián)‘郵件媒介’、用戶 B 關(guān)聯(lián)‘企業(yè)微信媒介’”,解決 “誰(shuí)接收、用哪種媒介接收” 的問(wèn)題。
- 主機(jī)(模塊 3):依托「觸發(fā)器」+「表達(dá)式」,監(jiān)控主機(jī)狀態(tài)(如 CPU 過(guò)載、服務(wù)宕機(jī)),當(dāng)系統(tǒng)指標(biāo)匹配表達(dá)式規(guī)則(如 CPU 使用率超過(guò)一定數(shù)值 ),觸發(fā)器被激活,成為告警的 “信號(hào)燈”。
- 觸發(fā)動(dòng)作(模塊 4):通過(guò)「條件」(關(guān)聯(lián)觸發(fā)器)判斷是否觸發(fā),滿足條件后,調(diào)用「操作」關(guān)聯(lián)的「媒介 + 用戶」,完成告警閉環(huán) —— 把模塊 1 定義的消息,通過(guò)模塊 2 綁定的媒介,精準(zhǔn)推送給用戶,實(shí)現(xiàn) “異常發(fā)生 → 自動(dòng)告警” 的完整流程。

添加腳本
在了解完整體思路之后,我們先在媒體中“添加腳本”。查看 Zabbix Server 中腳本所在的目錄,通過(guò) docker 命令查看哪些鏡像正在執(zhí)行。
docker ps在“names”這一列,可以看到鏡像的名稱,得到如下結(jié)果:

由于我們希望在 Zabbix Server 中安裝腳本,當(dāng)介紹到 Zabbix Agent 的信息之后, 設(shè)置對(duì)應(yīng)的報(bào)警規(guī)則(觸發(fā)器),然后再通過(guò)事件調(diào)用腳本,通過(guò)腳本執(zhí)行 DeepSeek 的調(diào)用。所以要確認(rèn) Zabbix Server 中對(duì)應(yīng)存放腳本的目錄,為了方便后面將主機(jī)的腳本目錄掛載到 Zabbix Server 中的腳本目錄。
執(zhí)行如下命令進(jìn)入 Zabbix server 鏡像的 docker 命令行模式:
docker exec -it zabbix-docker-743-zabbix-server-1 /bin/sh執(zhí)行如下命令, 確認(rèn)在鏡像中存在如下目錄,作為腳本的掛載目錄:
ls -ld /usr/lib/zabbix/alertscripts接著回到主機(jī),在~/docker/下 創(chuàng)建zabbix-scripts 目錄, 在目錄中創(chuàng)建一個(gè) deepseek.sh 的腳本作為測(cè)試腳本。
腳本內(nèi)容先放入簡(jiǎn)單的“hello deepseek”。
#!/bin/bash
echo "hello deepseek"然后給目錄和腳本設(shè)置權(quán)限。
Docker 容器內(nèi)的 Zabbix 進(jìn)程通常以非 root 用戶(如 zabbix 用戶,UID 可能為 1997)運(yùn)行,而宿主機(jī)的目錄 / 文件默認(rèn)權(quán)限可能不允許容器內(nèi)的非 root 用戶訪問(wèn)或執(zhí)行。
# 進(jìn)入宿主機(jī)腳本目錄的父目錄
cd ~/docker
# 給目錄設(shè)置可執(zhí)行權(quán)限(允許進(jìn)入目錄)
chmod 755 zabbix-scripts
# 給目錄內(nèi)的腳本文件設(shè)置可執(zhí)行權(quán)限
chmod +x zabbix-scripts/*.sh修改啟動(dòng)鏡像命令所對(duì)應(yīng)的文件,于是我們修改 docker-compose_v3_alpine_mysql_latest.yaml 文件,找到 zabbix server 對(duì)應(yīng)的段落。
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}"在這個(gè)部分加入,如下部分在 volumes 掛載的時(shí)候?qū)⒛_本目錄和 zabbix server 中的腳本目錄進(jìn)行對(duì)應(yīng)。
- ~/docker/zabbix-scripts:/usr/lib/zabbix/alertscripts最后,通過(guò)如下命令重新啟動(dòng) docker 鏡像。
# 先停止并移除當(dāng)前運(yùn)行的容器(不會(huì)刪除數(shù)據(jù)卷和鏡像)
docker compose -f docker-compose_v3_alpine_mysql_latest.yaml down
# 重新創(chuàng)建并啟動(dòng)容器(會(huì)應(yīng)用新的volumes配置)
docker compose -f docker-compose_v3_alpine_mysql_latest.yaml up -d好了,腳本已經(jīng)加載到 zabbix server 的鏡像中了,我們要測(cè)試一下是否能夠執(zhí)行,以便后面事件調(diào)用的時(shí)候能夠成功。
主機(jī)中順序執(zhí)行如下代碼,分別是進(jìn)入 docker 執(zhí)行模式,跳轉(zhuǎn)到腳本目錄,執(zhí)行 deepseek 的腳本。
docker exec -it zabbix-docker-743-zabbix-server-1 /bin/sh
cd /usr/lib/zabbix/alertscripts
./deepseek.sh為了完成測(cè)試,在 deepseek.sh 中我們寫入如下內(nèi)容:
#!/bin/bash
# 獲取當(dāng)前腳本所在目錄的絕對(duì)路徑
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
# 獲取當(dāng)前時(shí)間(格式:年-月-日 時(shí):分:秒)
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
# 在腳本同目錄創(chuàng)建test.txt并寫入內(nèi)容(包含時(shí)間戳)
echo "[$CURRENT_TIME] hello deepseek" > "$SCRIPT_DIR/test.txt"
# 可選:如果希望保留歷史記錄(而非覆蓋),用 >> 追加模式
# echo "[$CURRENT_TIME] hello deepseek" >> "$SCRIPT_DIR/test.txt"在與 deepseek.sh 同目錄下生成一個(gè) test.txt 文件,寫入時(shí)間和“hello deepseek”的字樣。
設(shè)置媒介
接著來(lái)設(shè)置媒介,如下圖所示“創(chuàng)建媒介類型”。

在創(chuàng)建頁(yè)面填寫“名稱”(沒(méi)有特別要求)和“腳本名稱”,這里的“腳本名稱”需要與剛才掛載的腳本名稱保持一致,還需要保證它在 docker 容器的如下地址:
/usr/lib/zabbix/alertscripts
點(diǎn)擊“更新”完成腳本的創(chuàng)建。
此時(shí)回到媒介的列表頁(yè)面,可以測(cè)試剛剛創(chuàng)建的腳本。點(diǎn)擊“測(cè)試”按鈕,如果看到測(cè)試成功的字樣,說(shuō)明腳本運(yùn)行沒(méi)有問(wèn)題了。

如果不放心,還可以回到腳本掛載的目錄下面確認(rèn)文件是否生成,內(nèi)容是否與你所期望的一致。

這里也可以創(chuàng)建消息模版,如下圖所示:


關(guān)聯(lián)媒介與用戶
有了媒介(腳本+消息),接著需要將其關(guān)聯(lián)到用戶,也就是這個(gè)媒介給誰(shuí)用?由于媒介屬于“告警”的范疇,那么是告警就需要有具體的“人”響應(yīng)。
如下圖操作方式,這里我們選擇“Admin”作為響應(yīng)的“人”。

選擇“報(bào)警”媒介。

點(diǎn)擊“添加”。

在“類型”中選擇,剛才我們創(chuàng)建好的腳本媒介,這里收件人可以填寫一個(gè)郵件地址。

設(shè)置觸發(fā)器
經(jīng)過(guò)前面的設(shè)置之后,我們需要通過(guò)觸發(fā)器發(fā)出報(bào)警,然后調(diào)用對(duì)應(yīng)的腳本執(zhí)行操作以及通知到具體的人。
如系統(tǒng)所示,進(jìn)入觸發(fā)器添加界面。

點(diǎn)擊“創(chuàng)建觸發(fā)器”。

填寫觸發(fā)器的內(nèi)容,注意這里我設(shè)置的是 CPU 使用率超過(guò) 3%。為了方便測(cè)試,我這里修改成一個(gè)很小的值。在真實(shí)場(chǎng)景中需要按照 80 或者 90 這樣的數(shù)據(jù)進(jìn)行觸發(fā)器的設(shè)置。

點(diǎn)擊“表達(dá)式”旁邊的“添加”按鈕進(jìn)行條件的添加。

設(shè)置動(dòng)作(關(guān)聯(lián)腳本)
完成上述操作之后,接下來(lái)就是設(shè)置動(dòng)作,如下圖所示“創(chuàng)建動(dòng)作”。

接著是一連串的“選擇”操作,選擇“添加”條件,然后在條件中選擇觸發(fā)器類型,以及具體的觸發(fā)器。這里的觸發(fā)器用我們之前創(chuàng)建好的 “CPU 使用率超過(guò) 3%”。

最后就是設(shè)置“操作”了,將消息通過(guò)之前設(shè)置好的郵箱發(fā)送給用戶。

到這里整個(gè)媒介、觸發(fā)器與動(dòng)作的配置完成,讓我們通過(guò)下面這張圖再回顧一下整個(gè)過(guò)程。

測(cè)試觸發(fā)器
這里需要通過(guò)模擬 CPU 使用率高的場(chǎng)景,從而觸發(fā)報(bào)警,然后調(diào)用我們寫好的 deepseek.sh 腳本。
執(zhí)行如下代碼以 root 的身份開啟 docker 命令行模式。由于我們需要安裝 stress 工具模擬 CPU 執(zhí)行,所以需要 root 身份獲取安裝應(yīng)用的權(quán)限。
docker exec -it --user root zabbix-docker-743-zabbix-server-1 /bin/sh分別執(zhí)行如下:
apk update
apk add stress-ng顯示安裝成功之后,再執(zhí)行命令如下,啟動(dòng)4個(gè)CPU密集型進(jìn)程,持續(xù) 30 秒。
stress-ng -c 4 -t 30s執(zhí)行完之后,如下圖所示:

最后看看腳本是否執(zhí)行。
cat /usr/lib/zabbix/alertscripts/test.txt由于我們的腳本會(huì)在當(dāng)前目錄下面生成 test.txt 文件,所以打開文件,看到如下內(nèi)容。
[2025-08-06 16:25:24] hello deepseek
說(shuō)明整個(gè)從觸發(fā)、腳本、執(zhí)行的過(guò)程成功了。接下來(lái),我們需要在腳本中去調(diào)用 DeepSeek 的能力對(duì)數(shù)據(jù)進(jìn)行分析。
四、 DeepSeek處理監(jiān)控參數(shù)并生成報(bào)表
在完成觸發(fā)器的測(cè)試之后,整個(gè)調(diào)用的鏈路就通暢了,接下來(lái)只需要將 deepseek.sh 腳本中的內(nèi)容進(jìn)行修改,去調(diào)用 DeepSeek 生成分析報(bào)告即可。由于 DeepSeek 的調(diào)用還需要一些 Python 的組件包,我們首先還是要進(jìn)行組件安裝與環(huán)境配置的操作。
組件安裝與環(huán)境配置
在 Docker server 的運(yùn)行容器內(nèi)安裝 Python 和 OpenAI。
執(zhí)行如下命令:
apk update
apk add --no-cache python3 py3-pip
python3 --version
pip3 --version
看到如下信息,說(shuō)明安裝成功。
/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 為我們的代碼創(chuàng)建虛擬環(huán)境,接著激活環(huán)境,然后在這個(gè)虛擬環(huán)境中安裝 OpenAI。
# 1. 安裝虛擬環(huán)境工具(Alpine 中需手動(dòng)安裝)
apk add --no-cache python3-venv
# 2. 創(chuàng)建虛擬環(huán)境(路徑可自定義,例如 /var/lib/zabbix/venv)
python3 -m venv /var/lib/zabbix/venv
# 3. 激活虛擬環(huán)境
source /var/lib/zabbix/venv/bin/activate
# 4. 在虛擬環(huán)境中安裝 openai(此時(shí) pip 指向虛擬環(huán)境,無(wú)權(quán)限問(wèn)題)
pip install openai
# 5. 驗(yàn)證安裝(激活狀態(tài)下)
python -c "import openai; print('安裝成功')" # 無(wú)報(bào)錯(cuò)即成功
# 6. 退出虛擬環(huán)境(后續(xù)調(diào)用腳本時(shí)需先激活)
deactivate在編寫 Deepseek.py 之前還需要保存 DeepSeek 的 API。這里我們將其保存到.env 文件中,文件內(nèi)容如下:
DEEPSEEK_API_KEY=sk-aec0ed226aXXXX5ffd89ff同時(shí)需要通過(guò)python-dotenv 讀取 .env 文件中的環(huán)境變量,執(zhí)行如下命令。 保證在 Python 的虛擬環(huán)境中。
source /var/lib/zabbix/venv/bin/activate
pip install python-dotenv測(cè)試 DeepSeek API 是否能夠調(diào)通。
安裝 curl,并執(zhí)行指令:
apk add curl
curl -v https://api.deepseek.com/v1DeepSeek 生成告警報(bào)表
這里需要利用 DeepSeek 的 API 調(diào)用 DeepSeek 的能力, API 的調(diào)用在前面得到了證實(shí)。接下來(lái)就是代碼的環(huán)節(jié)。
import os
import sys
import datetime
from openai import OpenAI
from dotenv import load_dotenv # 新增:導(dǎo)入dotenv庫(kù)
load_dotenv() # 默認(rèn)讀取當(dāng)前目錄的.env文件,若路徑不同可指定:load_dotenv("/path/to/.env")
def generate_alert_report():
# 定義錯(cuò)誤日志文件路徑(與腳本同目錄)
script_dir = os.path.dirname(os.path.abspath(__file__)) # 獲取當(dāng)前腳本所在目錄(絕對(duì)路徑)
error_log = os.path.join(script_dir, "error.log") # 錯(cuò)誤日志放在腳本目錄
# 接收從Shell腳本傳遞的參數(shù)
if len(sys.argv) != 7:
error_msg = "錯(cuò)誤:參數(shù)數(shù)量不正確,需要6個(gè)參數(shù)(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
# 解析參數(shù)
cpu_util = sys.argv[1] # CPU利用率值
host_name = sys.argv[2] # 主機(jī)名稱
item_key = sys.argv[3] # 監(jiān)控項(xiàng)鍵值
host_ip = sys.argv[4] # 主機(jī)IP
event_time = sys.argv[5] # 告警時(shí)間
trigger_name = sys.argv[6] # 觸發(fā)器名稱
try:
# 檢查API密鑰是否存在
if not os.environ.get("DEEPSEEK_API_KEY"):
error_msg = "錯(cuò)誤:未設(shè)置DEEPSEEK_API_KEY環(huán)境變量"
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"
)
# 構(gòu)建系統(tǒng)提示詞(定義AI的角色和報(bào)告要求)
system_prompt = """
你是一名資深運(yùn)維工程師,擅長(zhǎng)分析服務(wù)器性能告警并生成專業(yè)報(bào)告。
請(qǐng)根據(jù)提供的CPU告警信息,生成一份結(jié)構(gòu)化的告警分析報(bào)告,包含以下內(nèi)容:
1. 告警基本信息(主機(jī)、IP、時(shí)間、觸發(fā)條件)
2. 可能的原因分析(基于CPU利用率和監(jiān)控項(xiàng))
3. 建議的處理步驟(分點(diǎn)說(shuō)明,清晰具體)
4. 預(yù)防措施(如何避免類似問(wèn)題再次發(fā)生)
報(bào)告風(fēng)格要專業(yè)、簡(jiǎn)潔,重點(diǎn)突出,便于運(yùn)維人員快速理解和處理。
"""
# 構(gòu)建用戶提示詞(傳遞具體參數(shù))
user_prompt = f"""
服務(wù)器告警信息如下:
- 主機(jī)名稱:{host_name}
- 主機(jī)IP:{host_ip}
- 告警時(shí)間:{event_time}
- 觸發(fā)條件:{trigger_name}
- 當(dāng)前CPU利用率:{cpu_util}%
- 監(jiān)控項(xiàng)鍵值:{item_key}
請(qǐng)基于以上信息生成告警分析報(bào)告。
"""
# 調(diào)用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
)
# 獲取模型返回的報(bào)告內(nèi)容
report_content = response.choices[0].message.content
# 生成報(bào)告文件名(包含主機(jī)名和時(shí)間戳)
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
clean_host_name = host_name.replace(" ", "_") # 處理主機(jī)名中的空格
report_filename = os.path.join(script_dir, f"alert_report_{clean_host_name}_{timestamp}.txt") # 關(guān)鍵:用script_dir指定路徑
# 將報(bào)告寫入文件
with open(report_filename, "w", encoding="utf-8") as f:
f.write(f"=== 服務(wù)器CPU告警分析報(bào)告 ===\n")
f.write(f"生成時(shí)間:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n")
f.write(report_content)
return f"告警報(bào)告生成成功:{report_filename}"
except Exception as e:
# 捕獲所有異常并寫入錯(cuò)誤日志
error_msg = f"生成報(bào)告失敗:{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) # 輸出結(jié)果給Shell腳本上面代碼會(huì)接受來(lái)自 deepseek.sh 腳本傳來(lái)的參數(shù)(CPU 報(bào)警參數(shù)),然后扮演 IT 運(yùn)維工程師利用 DeepSeek 大模型生成報(bào)警的報(bào)告。
將報(bào)告放置在與 deepseek.py 相同的目錄下。
在腳本中調(diào)用 deepseek.py
完成 deepseek.py 之后,我們還需要在 deepseek.sh 腳本中調(diào)用它,當(dāng)觸發(fā)器發(fā)出報(bào)警的時(shí)候調(diào)用deepseek.sh,deepseek.sh 再將報(bào)警數(shù)據(jù)傳入deepseek.py 完成告警的閉環(huán)操作。
deepseek.sh 腳本修改如下:
#!/bin/bash
# 獲取腳本目錄和日志文件
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
LOG_FILE="$SCRIPT_DIR/cpu_multi_params_log.log"
# 接收多個(gè)參數(shù)(按Zabbix配置的順序?qū)?yīng))
cpu_util="$1" # 參數(shù)1:CPU利用率值
host_name="$2" # 參數(shù)2:主機(jī)名稱
item_key="$3" # 參數(shù)3:監(jiān)控項(xiàng)鍵值
host_ip="$4" # 參數(shù)4:主機(jī)IP
event_time="$5" # 參數(shù)5:告警時(shí)間
trigger_name="$6" # 參數(shù)6:觸發(fā)器名稱
# 記錄所有參數(shù)到日志
{
echo "========================================="
echo "日志生成時(shí)間: $(date "+%Y-%m-%d %H:%M:%S")"
echo "1. CPU利用率值: $cpu_util"
echo "2. 主機(jī)名稱: $host_name"
echo "3. 監(jiān)控項(xiàng)鍵值: $item_key"
echo "4. 主機(jī)IP地址: $host_ip"
echo "5. 告警觸發(fā)時(shí)間: $event_time"
echo "6. 觸發(fā)器名稱: $trigger_name"
echo ""
} >> "$LOG_FILE"
# 簡(jiǎn)單驗(yàn)證(確保核心參數(shù)不為空)
if [ -z "$cpu_util" ] || [ -z "$host_name" ]; then
echo "[$(date "+%Y-%m-%d %H:%M:%S")] 錯(cuò)誤:核心參數(shù)缺失(CPU值或主機(jī)名)" >> "$LOG_FILE"
exit 1
fi
echo "[$(date "+%Y-%m-%d %H:%M:%S")] 多參數(shù)接收成功" >> "$LOG_FILE"
# 調(diào)用deepseek.py并傳遞6個(gè)參數(shù)
PY_SCRIPT="$SCRIPT_DIR/deepseek.py"
if [ -f "$PY_SCRIPT" ]; then
echo "[$(date "+%Y-%m-%d %H:%M:%S")] 開始調(diào)用Python腳本生成報(bào)告" >> "$LOG_FILE"
# 執(zhí)行Python腳本并捕獲輸出結(jié)果
python_result=$(
source /var/lib/zabbix/venv/bin/activate && \ # 激活虛擬環(huán)境
python3 "$PY_SCRIPT" "$cpu_util" "$host_name" "$item_key" "$host_ip" "$event_time" "$trigger_name" 2>&1
)
# 將Python腳本的執(zhí)行結(jié)果寫入日志
echo "[$(date "+%Y-%m-%d %H:%M:%S")] Python腳本執(zhí)行結(jié)果: $python_result" >> "$LOG_FILE"
else
echo "[$(date "+%Y-%m-%d %H:%M:%S")] 錯(cuò)誤:未找到Python腳本 $PY_SCRIPT" >> "$LOG_FILE"
exit 1
fi注意如下代碼,在調(diào)用 deepseek.py 之前需要激活虛擬環(huán)境,然后再通過(guò) Python 的命令行傳入幾個(gè)參數(shù)。
python_result=$(
source /var/lib/zabbix/venv/bin/activate && \ # 激活虛擬環(huán)境
python3 "$PY_SCRIPT" "$cpu_util" "$host_name" "$item_key" "$host_ip" "$event_time" "$trigger_name" 2>&1
)測(cè)試 CPU 報(bào)警功能
依舊通過(guò)如下命令增加 CPU 利用率。
stress-ng -c 4 -t 30s接著會(huì)在 Zabbix 平臺(tái),看到對(duì)應(yīng)的報(bào)警信息。
同時(shí),在 deepseek.sh 相同的目錄下面看到日志信息。
日志生成時(shí)間: 2025-08-07 16:32:15
1. CPU利用率值: 3.5 %
2. 主機(jī)名稱: Zabbix server
3. 監(jiān)控項(xiàng)鍵值: system.cpu.util
4. 主機(jī)IP地址: 172.16.239.4
5. 告警觸發(fā)時(shí)間: 16:31:24
6. 觸發(fā)器名稱: CPU使用率超過(guò)3%
[2025-08-07 16:32:15] 多參數(shù)接收成功
[2025-08-07 16:32:15] 開始調(diào)用Python腳本生成報(bào)告
[2025-08-07 16:32:54] Python腳本執(zhí)行結(jié)果: 告警報(bào)告生成成功:/usr/lib/zabbix/alertscripts/alert_report_Zabbix_server_20250807_163254.txt日志中看到傳入的 CPU 使用率的參數(shù),以及 Python 腳本生成報(bào)告的信息。
同時(shí)再查看如下報(bào)告文件:
/usr/lib/zabbix/alertscripts/alert_report_Zabbix_server_20250807_163254.txt得到報(bào)告的詳細(xì)信息。
=== 服務(wù)器CPU告警分析報(bào)告 ===
生成時(shí)間:2025-08-07 16:32:54
# CPU告警分析報(bào)告
## 1. 告警基本信息
| 項(xiàng)目 | 詳情 |
|------|------|
| 主機(jī)名稱 | Zabbix server |
| 主機(jī)IP | 172.16.239.4 |
| 告警時(shí)間 | 16:31:24 |
| 觸發(fā)條件 | CPU使用率 > 3% |
| 當(dāng)前CPU利用率 | 3.5% |
| 監(jiān)控項(xiàng)鍵值 | system.cpu.util |
## 2. 可能的原因分析
1. **監(jiān)控閾值設(shè)置過(guò)低**:3%的CPU利用率閾值對(duì)于生產(chǎn)環(huán)境服務(wù)器來(lái)說(shuō)過(guò)于敏感
2. **Zabbix自身監(jiān)控活動(dòng)**:作為監(jiān)控服務(wù)器,Zabbix自身的數(shù)據(jù)收集和處理可能導(dǎo)致短暫的CPU使用率波動(dòng)
3. **后臺(tái)維護(hù)任務(wù)**:可能正在執(zhí)行計(jì)劃任務(wù)、日志輪轉(zhuǎn)或數(shù)據(jù)庫(kù)維護(hù)等常規(guī)操作
4. **網(wǎng)絡(luò)活動(dòng)增加**:客戶端數(shù)據(jù)上報(bào)量臨時(shí)增加導(dǎo)致處理負(fù)載上升
## 3. 建議的處理步驟
1. **確認(rèn)當(dāng)前系統(tǒng)狀態(tài)**:
- 執(zhí)行`top`或`htop`命令查看實(shí)時(shí)進(jìn)程占用情況
- 檢查`uptime`命令輸出的系統(tǒng)負(fù)載平均值
- 使用`ps aux --sort=-%cpu | head -10`查看CPU占用最高的進(jìn)程
2. **調(diào)整監(jiān)控閾值**:
- 建議將CPU告警閾值調(diào)整為更合理的水平(如80%)
- 對(duì)于Zabbix服務(wù)器,可考慮設(shè)置多級(jí)告警(警告/嚴(yán)重)
3. **檢查Zabbix服務(wù)狀態(tài)**:
- 查看Zabbix server日志:`tail -f /var/log/zabbix/zabbix_server.log`
- 確認(rèn)是否有異常的任務(wù)堆積或數(shù)據(jù)庫(kù)查詢問(wèn)題
## 4. 預(yù)防措施
1. **優(yōu)化監(jiān)控配置**:
- 根據(jù)服務(wù)器角色和基準(zhǔn)性能調(diào)整告警閾值
- 對(duì)監(jiān)控項(xiàng)設(shè)置合理的聚合時(shí)間(如5分鐘平均值)
2. **性能基線建立**:
- 記錄服務(wù)器在不同時(shí)段的正常性能指標(biāo)作為基準(zhǔn)
- 設(shè)置基于基線的動(dòng)態(tài)告警閾值
3. **資源分配優(yōu)化**:
- 確保Zabbix服務(wù)器有足夠的CPU資源
- 考慮將數(shù)據(jù)庫(kù)與Zabbix服務(wù)分離部署
4. **定期維護(hù)**:
- 定期清理Zabbix歷史數(shù)據(jù)
- 優(yōu)化數(shù)據(jù)庫(kù)表和索引
5. **告警分級(jí)**:
- 設(shè)置多級(jí)告警策略(信息/警告/嚴(yán)重)
- 對(duì)非關(guān)鍵告警配置不同的通知渠道
**備注**:當(dāng)前3.5%的CPU使用率屬于極低負(fù)載,建議優(yōu)先調(diào)整監(jiān)控策略而非進(jìn)行系統(tǒng)優(yōu)化。總結(jié)
本文圍繞 Zabbix 與 DeepSeek 大模型的融合實(shí)踐展開,構(gòu)建智能運(yùn)維分析體系。從基礎(chǔ)部署起步,借 Docker 及 Compose 簡(jiǎn)化 Zabbix 復(fù)雜組件安裝,完成 Server 與 Agent 關(guān)聯(lián),打通監(jiān)控?cái)?shù)據(jù)采集鏈路。
核心環(huán)節(jié)聚焦告警流程:通過(guò)配置媒介、觸發(fā)器與動(dòng)作,搭建從異常檢測(cè)到腳本觸發(fā)的通路,再借助 Docker 掛載腳本,實(shí)現(xiàn)與 DeepSeek 大模型的銜接。編寫 Python 腳本調(diào)用 DeepSeek API,利用其智能分析能力,將 Zabbix 捕獲的 CPU 利用率、主機(jī)信息等監(jiān)控參數(shù),轉(zhuǎn)化為包含故障根因、處理建議的專業(yè)報(bào)表,賦能運(yùn)維決策。
從模擬 CPU 過(guò)載測(cè)試驗(yàn)證流程閉環(huán),到生成結(jié)構(gòu)化分析報(bào)告,展現(xiàn)了大模型與傳統(tǒng)監(jiān)控工具結(jié)合的價(jià)值 —— 打破人工分析效率瓶頸,讓運(yùn)維從 “被動(dòng)響應(yīng)” 邁向 “智能預(yù)判”。
作者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。


























