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

ZABBIX_WEB_NGINX_HTTP_PORT=8080啟動 Zabbix 服務(wù)
設(shè)置好端口之后,執(zhí)行如下命令:
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 可以看到服務(wù)已經(jīng)啟動。

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

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

安裝 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 等服務(wù)也裝上了。接下來,通過如下命令安裝 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é)果。

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

二、關(guān)聯(lián) Zabbix Server 與 Zabbix Agent
自此,Zabbix Server 與 Agent 都已安裝完畢,還需要在 Zabbix Server 中設(shè)置被監(jiān)控主機的 Agent IP地址,一般來說我們會在被監(jiān)控主機上安裝 Zabbix Agent 從而監(jiān)控主機的運行狀態(tài)。所以,需要在 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執(zhí)行之后得到如下結(jié)果:
zabbix-docker-743_backend → 172.16.239.4接著將 IP (172.16.239.4),也就是 Zabbix Agent 的 IP, 寫入到 Zabbix Server 接口的 Agent 中。
需要通過如下圖的配置步驟,首先在“檢測”中找到“主機”。

在彈出的對話框中選中“主機”。

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

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

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

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

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

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

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

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


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

選擇“報警”媒介。

點擊“添加”。

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

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

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

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

點擊“表達式”旁邊的“添加”按鈕進行條件的添加。

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

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

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

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

測試觸發(fā)器
這里需要通過模擬 CPU 使用率高的場景,從而觸發(fā)報警,然后調(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í)行命令如下,啟動4個CPU密集型進程,持續(xù) 30 秒。
stress-ng -c 4 -t 30s執(zhí)行完之后,如下圖所示:

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

























