目录

1.方案概述

1.1实现原理

1.2整体架构

1.3前置条件

1.4测试环境

2.qwen大模型环境准备

3.企业微信机器人配置

3.1创建机器人

3.2保存webhook地址

4.zabbix4.2外部脚本配置

4.1确定脚本目录

4.2创建Python脚本

4.3脚本配置与权限

5.zabbix4.2前端配置

5.1创建告警媒介类型

5.2为用户添加媒介

5.3配置告警动作

6.测试验证

6.1手动触发测试告警

6.2查看zabbix报表


1.方案概述

1.1实现原理

当Zabbix产生告警时,通过预定义的告警动作调用外部Python脚本。脚本收集告警信息后:
  1. 调用qwen API进行智能分析(获取根因分析和处理建议)
  2. 将原始告警信息和qwen分析结果合并
  3. 通过企业微信机器人Webhook推送到指定群聊

1.2整体架构

Zabbix 4.2 Server (触发告警)

→ 外部Python脚本 (位于AlertScriptsPath)

→ qwen API (获取分析结果)

→ 企业微信机器人 (推送消息)

1.3前置条件

  • 已部署的Zabbix 4.2 Server
  • 企业微信已创建群聊机器人(获取Webhook URL)
  • qwen API Key(可通过官方平台申请)
  • Python 3.6+环境(Zabbix Server上)

1.4测试环境

主机名

IP地址

操作系统

角色

zabbix4

10.9.254.70

Centos7.9

zabbix-server

agent

10.9.254.71

Centos7.9

zabbix-agent

2.qwen大模型环境准备

使用阿里云千问,申请API Key

3.企业微信机器人配置

3.1创建机器人

在企业微信中,进入需要接收告警的群聊

点击右上角"..." → "群机器人" → "添加机器人"

设置机器人名称(如"Zabbix智能告警")

获取Webhook地址,格式如:

https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

3.2保存webhook地址

https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

4.zabbix4.2外部脚本配置

4.1确定脚本目录

在Zabbix Server上查看配置的脚本存放路径:

[root@zabbix4 ~]# grep -E '^AlertScriptsPath' /etc/zabbix/zabbix_server.conf

AlertScriptsPath=/usr/lib/zabbix/alertscripts

4.2创建Python脚本

[root@zabbix4 ~]# cd /usr/lib/zabbix/alertscripts/

[root@zabbix4 /usr/lib/zabbix/alertscripts]# vim zabbix_qwen_wechat.py

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# 文件名:zabbix_qwen_wechat.py

# 功能:Zabbix告警 → 阿里云通义千问(Qwen)分析 → 企业微信推送

# 部署路径:/usr/lib/zabbix/alertscripts/

# 权限:chmod +x /usr/lib/zabbix/alertscripts/zabbix_qwen_wechat.py

import sys

import json

import requests

import time

import urllib3

# 禁用 SSL 警告(仅当使用 verify=False 时需要,此处保留为可选)

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# ===================== 配置区(请务必修改)=====================

# 阿里云百炼 API 配置(开通服务后获取 API Key)

ALIYUN_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 替换为你的真实 API Key

ALIYUN_MODEL = "qwen-plus" # 可选 qwen-plus / qwen-max / qwen-turbo

# 使用 OpenAI 兼容接口(推荐)

ALIYUN_API_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"

# 企业微信机器人 Webhook

WECHAT_WEBHOOK = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxxxxxxxxxxxxx"

# AI 提示词模板

PROMPT_TEMPLATE = """你是一个资深运维工程师,请分析以下告警:

**发送给**: {who}

**告警主题**: {subject} (告警信息: {message})

**时间**: {time}

请用**不超过300字**说明:

1. 最可能的故障原因

2. 立即处理步骤

3. 预防建议

"""

# ===================== 参数解析 =====================

try:

who = sys.argv[1]

subject = sys.argv[2]

message = sys.argv[3]

event_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

except IndexError:

print("ERROR: 参数缺失!请按顺序传入:主机名 告警名称 严重等级")

sys.exit(1)

# ===================== Qwen 分析函数(OpenAI兼容模式)=====================

def analyze_with_qwen():

"""调用阿里云通义千问(OpenAI兼容接口)进行告警分析"""

headers = {

"Authorization": f"Bearer {ALIYUN_API_KEY}",

"Content-Type": "application/json"

}

prompt = PROMPT_TEMPLATE.format(

who=who,

subject=subject,

message=message,

time=event_time

)

payload = {

"model": ALIYUN_MODEL,

"messages": [{"role": "user", "content": prompt}],

"temperature": 0.2,

"max_tokens": 300

}

try:

# 发送请求(可临时添加 verify=False 测试 SSL 问题)

response = requests.post(ALIYUN_API_URL, headers=headers, json=payload, timeout=15)

# 打印调试信息(正式使用时请注释或删除)

print(f"DEBUG: HTTP状态码 = {response.status_code}")

print(f"DEBUG: 响应头 = {response.headers}")

print(f"DEBUG: 响应内容预览 = {response.text[:200]}")

# 尝试解析 JSON

result = response.json()

# OpenAI 兼容格式返回结构

if 'choices' in result and len(result['choices']) > 0:

return result['choices'][0]['message']['content']

else:

return f"AI解析失败:响应缺少choices字段,完整响应:{json.dumps(result, ensure_ascii=False)[:200]}"

except requests.exceptions.Timeout:

return "AI服务超时:请求超过15秒未响应"

except requests.exceptions.ConnectionError as e:

return f"网络连接错误:无法连接到阿里云API - {str(e)}"

except requests.exceptions.RequestException as e:

return f"网络请求异常:{str(e)}"

except ValueError as e:

# JSON 解析错误

if 'response' in locals():

return f"API返回非JSON格式 (HTTP {response.status_code}): {response.text[:200]}"

else:

return f"JSON解析异常:{str(e)}"

except Exception as e:

return f"未知错误:{str(e)}"

# ===================== 企业微信推送 =====================

def send_to_wechat(ai_analysis):

"""推送 Markdown 消息到企业微信群"""

markdown_content = f"""

### Zabbix告警通知

**发送給**: {who}

**告警主题**: {subject}

**告警信息**: {message}

**时间**: {event_time}

### AI智能分析

{ai_analysis}

"""

payload = {

"msgtype": "markdown",

"markdown": {

"content": markdown_content

}

}

try:

resp = requests.post(WECHAT_WEBHOOK, json=payload, timeout=10)

resp_json = resp.json()

if resp_json.get('errcode') == 0:

return True

else:

print(f"企业微信返回错误: {resp_json}")

return False

except Exception as e:

print(f"企业微信推送异常: {str(e)}")

return False

# ===================== 主程序 =====================

if __name__ == "__main__":

analysis_result = analyze_with_qwen()

if send_to_wechat(analysis_result):

print(f"SUCCESS: 告警已推送 | AI分析摘要: {analysis_result[:50]}...")

else:

print("ERROR: 企业微信推送失败,请检查 Webhook 配置")

sys.exit(2)

4.3脚本配置与权限

[root@zabbix4 ~]# pip3 install requests

Collecting requests

Downloading requests-2.27.1-py2.py3-none-any.whl (63 kB)

|████████████████████████████████| 63 kB 562 kB/s

Collecting charset-normalizer~=2.0.0

Downloading charset_normalizer-2.0.12-py3-none-any.whl (39 kB)

Collecting idna=2.5

Downloading idna-3.10-py3-none-any.whl (70 kB)

|████████████████████████████████| 70 kB 1.8 MB/s

Collecting urllib3=1.21.1

Downloading urllib3-1.26.20-py2.py3-none-any.whl (144 kB)

|████████████████████████████████| 144 kB 3.1 MB/s

Collecting certifi>=2017.4.17

Downloading certifi-2025.4.26-py3-none-any.whl (159 kB)

|████████████████████████████████| 159 kB 3.5 MB/s

Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests

Successfully installed certifi-2025.4.26 charset-normalizer-2.0.12 idna-3.10 requests-2.27.1 urllib3-1.26.20

WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

[root@zabbix4 ~]# chmod +x /usr/lib/zabbix/alertscripts/zabbix_qwen_wechat.py

[root@zabbix4 ~]# mkdir -p /var/log/zabbix

[root@zabbix4 ~]# chown zabbix:zabbix /var/log/zabbix

[root@zabbix4 ~]# chmod 755 /var/log/zabbix

[root@zabbix4 ~]# python3 /usr/lib/zabbix/alertscripts/zabbix_qwen_wechat.py "admin" "测试告警" "CPU负载超过90%"

5.zabbix4.2前端配置

5.1创建告警媒介类型

5.2为用户添加媒介

5.3配置告警动作

标题:

故障{TRIGGER.STATUS}, 服务器: {HOST.NAME} 发生: {TRIGGER.NAME} 故障

内容:

故障{TRIGGER.STATUS}

服务器: {HOST.NAME}

发生: {TRIGGER.NAME} 故障

-----------------------------------------------------------------------

告警主机: {HOST.NAME}

告警地址: {HOST.IP}

告警时间: {EVENT.DATE} {EVENT.TIME}

主机组名: {TRIGGER.HOSTGROUP.NAME}

告警等级: {TRIGGER.SEVERITY}

告警信息: {TRIGGER.NAME}

告警项目: {TRIGGER.KEY}

问题详情: {ITEM.NAME}:{ITEM.VALUE}

当前状态: {TRIGGER.STATUS}:{ITEM.VALUE}

事件ID: {EVENT.ID}

标题:

故障恢复{TRIGGER.STATUS}, 服务器: {HOST.NAME} 发生: {TRIGGER.NAME} 已恢复

内容:

故障恢复{TRIGGER.STATUS}

服务器: {HOST.NAME}

发生: {TRIGGER.NAME} 已恢复

------------------------------------------------------------------------------------------------

恢复告警主机: {HOST.NAME}

告警地址: {HOST.IP}

告警时间: {EVENT.DATE} {EVENT.TIME}

恢复时间: {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}

持续时间: {EVENT.AGE}

主机组名: {TRIGGER.HOSTGROUP.NAME}

告警等级: {TRIGGER.SEVERITY}

告警信息: {TRIGGER.NAME}

告警项目: {TRIGGER.KEY}

问题详情: {ITEM.NAME}:{ITEM.VALUE}

当前状态: {TRIGGER.STATUS}:{ITEM.VALUE}

事件ID: {EVENT.ID}

6.测试验证

6.1手动触发测试告警

在被监控主机上停止agent服务,触发"Agent不可用"告警

[root@agent ~]# systemctl stop zabbix-agent

[root@agent ~]# systemctl status zabbix-agent

● zabbix-agent.service - Zabbix Agent

Loaded: loaded (/usr/lib/systemd/system/zabbix-agent.service; disabled; vendor preset: disabled)

Active: inactive (dead)

6.2查看zabbix报表

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐