Akemi

Zabbix7集成Deepseek生成报表

2026/01/04

本文基于上一篇《Zabbix7使用docker-compose部署》

集成deepseek

准备zabbix

如果需要执行一个脚本,而我们的zabbix-server使用的是docker-compose的方式部署的,所以就需要在容器中/usr/lib/zabbix/alertscripts/目录中存放脚本文件。所以我们可以在docker-compose文件中修改,让本地某一目录挂载到脚本目录中

那么先在本地创建一个目录用以存放脚本文件的

1
2
3
4
5
6
mkdir -p /root/zabbix-docker-compose/zabbix-scripts
cat > /root/zabbix-docker-compose/zabbix-scripts/test.sh << 'EOF'
#!/bin/bash
echo "[$(date "+%Y-%m-%d %H:%M:%S")] test ok" >> ./test.log
EOF
chmod +x /root/zabbix-docker-compose/zabbix-scripts/test.sh

修改docker-compose文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim docker-compose.yaml
找到
services.zabbix-server.volumes
添加
- /root/zabbix-docker-compose/zabbix-scripts:/usr/lib/zabbix/alertscripts/

# 重启docker-compose,更新zabbix-server
docker compose -f docker-compose.yaml down
docker-compose -f docker-compose.yaml up -d

# 验证容器中有没有这个脚本
docker exec -it zabbix-docker-zabbix-server-1 sh /var/lib/zabbix/alertscripts/test.sh
docker exec -it zabbix-docker-zabbix-server-1 cat /var/lib/zabbix/test.log
[2025-12-31 19:23:08] test ok

创建媒介

脚本名称需要与存放在/usr/lib/zabbix/alertscripts/中的脚本名称一模一样

添加完媒介之后需要对其进行测试:

1
2
3
4
5
6
7
8
docker exec -it zabbix-docker-zabbix-server-1 cat /var/lib/zabbix/test.log
[2025-12-31 19:33:23] test ok
[2025-12-31 19:33:38] test ok
[2025-12-31 19:36:04] test ok
[2025-12-31 19:36:36] test ok
[2025-12-31 19:36:38] test ok
[2025-12-31 19:38:24] test ok
[2025-12-31 19:43:12] test ok

创建媒介告警信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
略了,用我之前用过的模板:
问题:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE}{EVENT.TIME}
告警等级: {TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目: {TRIGGER.KEY1}
问题详情: {ITEM.NAME}: {ITEM.VALUE}
当前状态: {TRIGGER.STATUS}: {ITEM.VALUE1}
事件ID: {EVENT.ID}
[系统告警邮件]

恢复:
服务器:【{HOSTNAME1}】故障已恢复
故障原因:{TRIGGER.NAME}

创建用户并关联报警媒介

为了方便我直接使用admin了,如果要使用另外的用户,则调试时需要登录该用户来查看,太麻烦了

创建触发器

创建触发器动作

并且操作也发送给admin

测试

1
2
# 使用压测命令模拟内存使用超标
stress --vm 1 --vm-bytes 20G --vm-hang 60 --timeout 60s

此时查看脚本执行的log

准备python环境

可以直接在zabbix-server的docker中进行安装,也可以直接重新做server的镜像,然后再改镜像tag
因为后者比较难,所以我用后者

如果是直接安装的话就是把我这几步直接在容器中执行就可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 构建镜像
docker build . -t zabbix/zabbix-server-mysql:alpine-7.4-latest_custom
cat dockerfile
FROM zabbix/zabbix-server-mysql:alpine-7.4-latest
USER root
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update && apk add python3 py3-pip
RUN python3 -m venv /usr/lib/zabbix/venv && source /usr/lib/zabbix/venv/bin/activate && pip install openai python-dotenv
ENV PATH="/var/lib/zabbix/venv/bin:$PATH"
USER zabbix

# 改tag
docker tag zabbix/zabbix-server-mysql:alpine-7.4-latest_custom zabbix/zabbix-server-mysql:alpine-7.4-latest

# 重启zabbix-server
docker compose -f docker-compose.yaml down
docker-compose -f docker-compose.yaml up -d
docker exec -it zabbix-docker-zabbix-server-1 python --version
Python 3.12.12

# 准备.env文件
cp ~/langchain_project/.env ./zabbix-scripts/

调试脚本

在告警媒介中给脚本添加参数

用途 推荐宏 说明
接收方 {ALERT.SENDTO} 邮件、手机号、webhook等
主机信息 {HOST.NAME} 主机名称
触发信息 {TRIGGER.NAME} 触发器名称
状态 {TRIGGER.STATUS} PROBLEM/OK
严重性 {TRIGGER.SEVERITY} 告警级别
监控值 {ITEM.LASTVALUE} 最新监控值
完整消息 {ALERT.MESSAGE} 完整的消息内容
时间 {EVENT.TIME} 事件发生时间
主题 {ALERT.SUBJECT} 消息主题

让sh脚本可以接受参数,并转给py脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
LOGFILE="/usr/lib/zabbix/alertscripts/deepseek.log"
PYTHON_SCRIPT="/usr/lib/zabbix/alertscripts/deepseek.py"

host_name="$1"
host_ip="$2"
mem_name="$3"
mem_percent="$4"
event_time="$5"
trigger_name="$6"


# 记录参数到日志
{
echo $(date '+%Y-%m-%d %H:%M:%S')
echo "Host Name: ${host_name}"
echo "Host IP: ${host_ip}"
echo "Memory Name: ${mem_name}"
echo "Memory Percent: ${mem_percent}"
echo "Event Time: ${event_time}"
echo "Trigger Name: ${trigger_name}"
} >> "$LOGFILE"

# 激活虚拟环境并运行Python脚本
python_result=$(
source /usr/lib/zabbix/venv/bin/activate
python3 "$PYTHON_SCRIPT" "$host_name" "$host_ip" "$mem_name" "$mem_percent" "$event_time" "$trigger_name"
)

# 记录Python脚本的输出到日志
{
echo "$python_result"
echo "----------------------------------------"
} >> "$LOGFILE"

py脚本接受参数,然后发送给deepseek,返回报表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import os
import sys
import datetime
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()

def generate_analysis():
if len(sys.argv) != 7:
print("脚本参数数量不正确")
sys.exit(1)
host_name = sys.argv[1]
host_ip = sys.argv[2]
mem_name = sys.argv[3]
mem_percent = sys.argv[4]
event_time = sys.argv[5]
trigger_name = sys.argv[6]

try:
if not os.environ.get("DEEPSEEK_API_KEY"):
raise ValueError("DEEPSEEK_API_KEY未设置")
client = OpenAI(
api_key=os.environ.get('DEEPSEEK_API_KEY'),
base_url="https://api.deepseek.com")

system_prompt = "你是一个资深的Zabbix运维专家,擅长分析各种监控告警信息,能够快速定位问题根源并提供有效的解决方案。"

user_prompt = (f"请分析以下Zabbix监控告警信息,生成告警分析报告\n"
f"主机名称: {host_name}\n"
f"主机IP: {host_ip}\n"
f"内存名称: {mem_name}\n"
f"内存使用率: {mem_percent}\n"
f"事件时间: {event_time}\n"
f"触发器名称: {trigger_name}\n")
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
],
max_tokens=1000,
temperature=0.7
)
# 生成报表
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
clean_host_name = host_name.replace(" ", "_").replace("/", "_")
# 报告名称
report_filename = os.path.join("/usr/lib/zabbix/alertscripts", f"deepseek_report_{clean_host_name}_{timestamp}.txt")
# 写入
with open(report_filename, "w") as f:
f.write("Zabbix告警分析报告\n")
f.write("====================\n\n")
f.write(f"生成时间: {timestamp}\n")
f.write(response.choices[0].message.content)
return f"报表生成成功: {report_filename}"
except Exception as e:
return f"生成报表时出错: {str(e)}"
if __name__ == "__main__":
result = generate_analysis()
print(result)

最终测试

stress --vm 1 --vm-bytes 20G --vm-hang 60

CATALOG
  1. 1. 集成deepseek
    1. 1.1. 准备zabbix
      1. 1.1.1. 那么先在本地创建一个目录用以存放脚本文件的
      2. 1.1.2. 修改docker-compose文件
      3. 1.1.3. 创建媒介
      4. 1.1.4. 创建媒介告警信息
      5. 1.1.5. 创建用户并关联报警媒介
      6. 1.1.6. 创建触发器
      7. 1.1.7. 创建触发器动作
      8. 1.1.8. 测试
    2. 1.2. 准备python环境
      1. 1.2.1. 调试脚本
      2. 1.2.2. 在告警媒介中给脚本添加参数
      3. 1.2.3. 让sh脚本可以接受参数,并转给py脚本
      4. 1.2.4. py脚本接受参数,然后发送给deepseek,返回报表
    3. 1.3. 最终测试