说明:脚本部分也使用参考Zabbix配置企业微信告警 - ZhaoqBlog| 低头学习时,请不要忘记抬头看路!

其它配置 无论是邮件告警还是微信告警,配置方式基本没变化。

方式一

1、企业微信机器人准备

登录企业微信群中,找到右上角的三个点,点击展开,点击添加群机器人

建议告警机器人单独创建一个,不要复用。选择新建一个机器人

创建完成后,需要将Webhook地址复制下来保存好

2、准备Python脚本

将下面的python脚本保存到/usr/lib/zabbix/alertscripts 路径下并给脚本起名为wechat.py

#!/usr/bin/env python3
#-*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers={'Content-Type': 'application/json;charset=utf-8'}
api_url="此处粘贴Webhook链接"
defmsg(text):
    json_text={
     "msgtype": "text",
        "text": {
            "content": text
        }
    }
    requests.post(api_url,json.dumps(json_text),headers=headers)

if __name__ == '__main__':
    text = sys.argv[1]
msg(text)

执行命令为刚创建的脚本添加执行权限

chomod +x wechat.py

由于脚本引用了requests库,通常需要单独安装一下,此处可以根据你实际运行的情况选择。

# 使用 dnf 软件包管理器以管理员权限安装 Python 3 的 pip 工具
sudo dnf install python3-pip

# 使用管理员权限通过 pip3 将 pip 升级到最新版本
sudo pip3 install --upgrade pip

# 使用管理员权限通过 Python 3 的包管理工具 pip3 安装名为 “requests” 的库
sudo pip3 install requests

脚本测试

 ./wechat.py "脚本测试"

当我们执行完成后,可以在企业微信的群中看到机器人发送的消息 脚本测试

3、配置报警媒介

登录Zabbix 管理页面上,点击 告警媒介创建媒介类型

创建报警媒介,填写下面的内容后,点击 消息模版

名称: WeChat
 类型: 选择 脚本
 脚本名称: 填写 wechat.py 这个名称要和我们刚才保存的python脚本名字一致。
 脚本参数: 输入 {ALERT.MESSAGE}

点击消息模版添加

消息模版中的内容可以根据你的实际需求进行个性化配置,本文我们使用默认的消息模版添加 问题问题恢复 两个消息模版,点击更新

消息类型:问题
模版内容:
主题:Problem: {EVENT.NAME}
消息:
Problem started at {EVENT.TIME} on {EVENT.DATE}
Problem name: {EVENT.NAME}
Host: {HOST.NAME}
Severity: {EVENT.SEVERITY}
Operational data: {EVENT.OPDATA}
Original problem ID: {EVENT.ID}
{TRIGGER.URL}
消息类型:问题恢复
模版内容:
主题:Resolved in {EVENT.DURATION}: {EVENT.NAME}
消息:
Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
Problem name: {EVENT.NAME}
Problem duration: {EVENT.DURATION}
Host: {HOST.NAME}
Severity: {EVENT.SEVERITY}
Original problem ID: {EVENT.ID}
{TRIGGER.URL}

点击测试 动作进行测试。测试正常的话会提示测试成功,同时企业微信群里面也会有对应的消息。

4、创建告警动作

点击告警动作触发器动作创建动作 进行触发器动作创建。

触发器动作设置,名称为了更好的识别,可以使用wechat也可以根据你的需求随意填写。

条件根据你的实际需求进行设置。

点击操作 、添加 进行触发器动作配置,填写完成后点击更新

 发送给用户组: 根据你的实际场景进行设置,默认组是zabbix administrator
 发送给用户: 根据你的实际场景进行设置,默认演示使用admin用户
 Send to media type: 选择我们刚才创建的媒介Wechat

重复上面的操作,完成 恢复操作的动作配置后,点击更新

5、配置用户报警媒介

点击报警媒介添加

配置报警媒介,类型选择WeChat、收件人建议使用微信群名称。点击更新

方式二

1、企业微信机器人

和方式一一样 ,新建机器人,保存好 机器人url

2、准备python脚本

AlertScriptsPath 目录下创建一个文件,例如 wecom_alert.py

# vim /usr/lib/zabbix/alertscripts/wecom_alert.py

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import requests
import sys
import json
import datetime

def send_wecom_message(webhook_url, subject, message):
    """
    发送企业微信机器人消息
    """
    # 解析 Zabbix 传入的消息,通常是 "Problem: Trigger name"
    # 我们这里简单处理,提取告警状态
    status_icon = "" if "Problem" in subject else ""

    # 将 Zabbix 宏换行符 (\n) 替换为 Markdown 换行符 (\n)
    # Zabbix 的消息内容已经包含了换行,这里无需额外处理

    # 构造 Markdown 格式的消息体
    # Zabbix 7.0 建议在动作配置中定义好完整的消息模板
    # 这里 message 参数会接收到 Zabbix 动作中定义好的内容
    formatted_message = f"### {status_icon} {subject}\n\n{message}"

    # 企业微信机器人 Markdown 消息体
    data = {
        "msgtype": "markdown",
        "markdown": {
            "content": formatted_message
        }
    }

    headers = {'Content-Type': 'application/json'}

    try:
        response = requests.post(webhook_url, data=json.dumps(data), headers=headers, timeout=10)
        response.raise_for_status()  # 如果请求失败 (非2xx状态码),则抛出异常

        # 解析返回的JSON,检查errcode
        result = response.json()
        if result.get("errcode") == 0:
            print("Successfully sent message to WeChat Work.")
        else:
            print(f"Failed to send message. Error: {result.get('errmsg')}")
    except requests.exceptions.RequestException as e:
        print(f"Error sending request to WeChat Work: {e}")
    except json.JSONDecodeError:
        print(f"Error decoding response JSON. Response text: {response.text}")

if __name__ == "__main__":
    if len(sys.argv) != 4:
        print("Usage: python3 wecom_alert.py <webhook_url> <subject> <message>")
        sys.exit(1)

    webhook = sys.argv[1]   # Zabbix 的 {ALERT.SENDTO}
    subject = sys.argv[2]   # Zabbix 的 {ALERT.SUBJECT}
    message = sys.argv[3]   # Zabbix 的 {ALERT.MESSAGE}

    send_wecom_message(webhook, subject, message)

3、给脚本赋权

# chown zabbix:zabbix /usr/lib/zabbix/alertscripts/wecom_alert.py

# chmod +x /usr/lib/zabbix/alertscripts/wecom_alert.py

4、测试脚本

# 替换成你的 Webhook URL

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

# 执行测试

/usr/lib/zabbix/alertscripts/wecom_alert.py "$WEBHOOK_URL" "测试告警:服务器宕机" "告警主机:Test Server\n告警级别:Disaster\n告警时间date '+%Y-%m-%d %H:%M:%S'\n问题详情:服务不可达"

5、配置告警媒介

告警——媒介——创建媒介类型

注意脚本名称要和前面配置的脚本名一致,同时要保证脚本位置也要正确

消息模板

消息类型:问题
主题{告警通知} 

主机名称: {HOST.NAME}
主机地址: {HOST.IP}
故障日期: {EVENT.DATE}
故障时间: {EVENT.TIME}
问题事件: {EVENT.NAME}{EVENT.OPDATA}
事件编号: {EVENT.ID}
{TRIGGER.URL}
消息类型:问题恢复
主题{恢复通知} 

主机名称: {HOST.NAME}
主机地址: {HOST.IP}
恢复日期: {EVENT.RECOVERY.DATE} 
恢复时间: {EVENT.RECOVERY.TIME}
持续时间: {EVENT.DURATION}
事件描述: {EVENT.NAME}{EVENT.OPDATA}
事件编号: {EVENT.ID}
{TRIGGER.URL}

创建关联用户

用户——用户——Admin(可以自己新建用户,管理那不同的媒介类型)——报警媒介,点击添加

类型选择 前面创建的媒介,收件人企业微信机器人的url

触发动作

告警——动作——触发器动作——创建动作

名称根据自己告警定义,条件选择想要触发告警的条件

操作——