Zabbix 告警推送飞书脚本和消息模板

1.飞书告警脚本

将以下webhook URL(https://open.feishu.cn/open-apis/bot/v2/hook/12345678)和签名校验码(access_token=”12345678″)替换为自己的飞书机器人

在/usr/lib/zabbix/alertscripts目录下创建两个飞书脚本,
feishu1.py为告警时触发 以下代码中 "template": "red" 
feishu2.py为恢复时触发 以下代码中 "template": "green"
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
import datetime
import base64
import hashlib
import hmac
from time import time


class FeiShuNotify:
    def __init__(self, subject, message, access_token=None):
        timestamp, sign = FeiShuNotify.encode(access_token)
        self.content = {'timestamp': timestamp, 'sign': sign}
        self.subject = subject
        self.message = message
        self.timestamp = timestamp
        self.sign = sign

    @staticmethod
    def encode(access_token):
        """
        飞书机器人webhook签名验证加密方法
        :return:
        """
        # timestamp = str(round(time() * 1000))
        timestamp = str(int(time()))
        # 拼接timestamp和secret
        string_to_sign = '{}\n{}'.format(timestamp, access_token)
        hmac_code = hmac.new(string_to_sign.encode("utf-8"), digestmod=hashlib.sha256).digest()
        # 对结果进行base64处理
        sign = base64.b64encode(hmac_code).decode('utf-8')
        return timestamp, sign

    def to_json(self):
        """
        飞书消息卡片返回格式
        :return:
        """
        return {
            "msg_type": "interactive",
            "card": {
                "config": {
                    "wide_screen_mode": True
                },
                "header": {
                    "title": {
                        "tag": "plain_text",
                        "content": self.subject
                    },
                    "template": "red"
                },
                "elements": [
                    {
                        "tag": "markdown",
                        "content": self.message,
                    }
                ]
            },
            'timestamp': self.timestamp,
            'sign': self.sign
        }


def send_message(message, subject):
    """
    向飞书webhook url发送告警消息
    :param message:
    :param subject:
    :return:
    """
    payload_message = FeiShuNotify(subject, message, access_token="12345678").to_json()
    headers = {
        'Content-Type': 'application/json'
    }

    response = requests.request("POST",
                            "https://open.feishu.cn/open-apis/bot/v2/hook/12345678",
                                headers=headers, data=json.dumps(payload_message))
    return response


if __name__ == '__main__':
    text = sys.argv[3]
    subject = sys.argv[2]
    send_message(text, subject)

2.Zabbix配置告警

1. 添加告警媒介

类型为脚本,脚本名称为上面创建的feishu1.py,脚本参数如下。
再创建第2个媒介,名称为飞书机器人恢复,脚本名称为feishu2.py。

2. 管理员用户绑定新增的2个告警媒介并启用

3.推送消息模板

1. zabbix 告警-动作-触发器动作,创建新动作,设置动作触发条件。

2. 配置操作和恢复操作,发送消息给Admin 通过媒介告警和恢复2个脚本。

3. 消息模板中的设备运行时间需要在数据采集-模板中启用的触发器表达式最前面加一个uptime的表达式,以便在消息模板中使用{ITEM.VALUE1}获取到告警主机的运行时间,相应的当前状态值就需要使用{ITEM.VALUE2},自动发现规则中启用的触发器也需要添加此表达式。

4. 飞书推送消息效果展示

5. 消息模板内容

主题  zabbix告警通知

告警时间:**<font color='red'>{EVENT.DATE}  {EVENT.TIME}</font>**
当前时间:**<font color='grey'>{DATE}  {TIME}</font>**
告警级别:**<font color='grey'>{TRIGGER.SEVERITY}</font>**
主机名称:**<font color='red'>{HOST.NAME}</font>**
主  机 IP:**<font color='grey'>{HOST.IP}</font>**
主机分组:**<font color='red'>{TRIGGER.HOSTGROUP.NAME}</font>**
问题名称:**<font color='red'>{EVENT.NAME}</font>**
描述信息:**<font color='grey'>{TRIGGER.DESCRIPTION}</font>**
当前状态:**<font color='red'>{TRIGGER.STATUS}:{ITEM.VALUE2} </font>**
事  件 ID:**<font color='grey'>{EVENT.ID}</font>**
[确认告警和查看详情](http://10.32.129.85/)



主题  zabbix恢复通知

告警时间:**<font color='green'>{EVENT.DATE}  {EVENT.TIME}</font>**
当前时间:**<font color='grey'>{DATE}  {TIME}</font>**
告警级别:**<font color='grey'>{TRIGGER.SEVERITY}</font>**
主机名称:**<font color='green'>{HOST.NAME}</font>**
主  机 IP:**<font color='grey'>{HOST.IP}</font>**
主机分组:**<font color='green'>{TRIGGER.HOSTGROUP.NAME}</font>**
问题名称:**<font color='green'>{EVENT.NAME}</font>**
描述信息:**<font color='grey'>{TRIGGER.DESCRIPTION}</font>**
当前状态:**<font color='green'>{TRIGGER.STATUS}:{ITEM.VALUE2}</font>**
故障时长:**<font color='grey'>{EVENT.AGE}</font>**
事  件 ID:**<font color='grey'>{EVENT.ID}</font>**
设备运行时间:**<font color='green'>{ITEM.VALUE1}</font>**
[确认告警和查看详情](http://10.32.129.85/)

4.参考链接

脚本代码参考:网络工程师的zabbix之旅(实战) -- zabbix对接飞书