智能運維新范式:Zabbix 與 DeepSeek 協同構建自動分析報表 原創
在人工智能技術飛速迭代的今天,大模型正以驚人的速度滲透到各行各業,從金融風控到醫療診斷,從智能制造到內容創作,通用人工智能的能力邊界不斷被拓展。隨著技術的成熟,各行業不再滿足于通用大模型的基礎能力,而是開始將其與垂直領域深度融合,通過定制化開發解決行業痛點 —— 運維領域同樣迎來了這場智能化變革。
在日常的 IT 運維工作中,Zabbix 作為廣泛使用的監控系統,時刻守護著服務器、網絡設備和業務系統的穩定運行。當 CPU 利用率突增、內存占用異?;蚍枕憫舆t時,它能第一時間捕獲異常數據并觸發告警。但面對海量的監控指標和告警信息,運維人員往往需要花費大量時間分析根因、制定對策,效率瓶頸逐漸顯現。
今天,我們通過一個案例,探索全新的協同模式:通過 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_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 可以看到服務已經啟動。

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

獲取 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 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 Server 了。

二、關聯 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 中。
需要通過如下圖的配置步驟,首先在“檢測”中找到“主機”。

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

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

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

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

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

由于我們希望在 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”的字樣。
設置媒介
接著來設置媒介,如下圖所示“創建媒介類型”。

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

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

這里也可以創建消息模版,如下圖所示:


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

選擇“報警”媒介。

點擊“添加”。

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

設置觸發器
經過前面的設置之后,我們需要通過觸發器發出報警,然后調用對應的腳本執行操作以及通知到具體的人。
如系統所示,進入觸發器添加界面。

點擊“創建觸發器”。

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

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

設置動作(關聯腳本)
完成上述操作之后,接下來就是設置動作,如下圖所示“創建動作”。

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

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

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

測試觸發器
這里需要通過模擬 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執行完之后,如下圖所示:

最后看看腳本是否執行。
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/v1DeepSeek 生成告警報表
這里需要利用 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年分布式架構經驗。

















