本文基于上一篇《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-scriptscat > /root/zabbix-docker-compose/zabbix-scripts/test.sh << 'EOF' echo "[$(date "+%Y-%m-%d %H:%M:%S" ) ] test ok" >> ./test.logEOF 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 -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 dockerfileFROM 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 docker tag zabbix/zabbix-server-mysql:alpine-7.4-latest_custom zabbix/zabbix-server-mysql:alpine-7.4-latest 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 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_result=$( source /usr/lib/zabbix/venv/bin/activate python3 "$PYTHON_SCRIPT " "$host_name " "$host_ip " "$mem_name " "$mem_percent " "$event_time " "$trigger_name " ) { 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 osimport sysimport datetimefrom openai import OpenAIfrom dotenv import load_dotenvload_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