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对接飞书