今年年中,我开始把我自用的一个企业从企业微信迁移到飞书,历时两个半月,终于彻底迁移过来了,老企业微信也就注销掉了。ZABBIX 对接飞书也是迁移的最后一步。

其实关于 ZABBIX 对接国内各种企业 IM 已经是老生常谈的问题了。不过我在对接之前还是习惯性的搜了一下,发现使用 ZABBIX Javascript Runtime 实现的少之又少,所以我还是打算记录一下。

效果放前面

你可以通过飞书的群机器人,接收 ZABBIX 的告警信息,例如下面的是故障消息:
20231203163916
下面这个是故障恢复消息:
20231203163943

实现思路

使用 ZABBIX 6 以上版本提供的 Javascript Runtime,免去了在 ZABBIX 服务器底层放 Python 脚本的步骤,后续维护报警媒介,都可以通过 ZABBIX WEB 来实现。

扩展阅读:其它 Javascript 对象

技术实现

创建飞书机器人

我们需要先在飞书群里创建一个机器人。获取它的 Webhook 地址。创建飞书群机器人,请参考飞书帮助中心 - 如何在群组中使用机器人?,请按照文档操作,创建一个“自定义机器人”。

20231203175815

安全配置,按需启用就好了,或者干脆不启用。其中上图框选的部分,就是后文需要用到的 BOTKEY。

创建飞书消息卡片模板

创建一个飞书消息卡片模板,消息卡片模板可以很方便的帮助我们调整推送消息的样式,且消息卡片模板可以导出导入,方便复用。下面我提供了两个告警和告警恢复的消息卡片模板。

以下内容托管在 GitHub,如果看不到,请确认您是否有访问权限。

你可以直接下载另存为 json 文件,登录 飞书开放平台 - 消息卡片搭建工具,选择导入卡片,导入刚才下载的卡片配置文件。

20231203181845

导入之后,你可以对卡片结构或者内容进行微调,调整完毕后,点击“保存并发布”即可。

20231203182527

这个卡片 ID 很重要,记得存一下,一会要用的。

创建一个飞书告警媒介

在 ZABBIX 中创建一个新的报警媒介,类型选择 Webhook,参数有三个,参考下表。

1
2
3
Botkey:    飞书Webhook地址后面那段
HTTPProxy: 是否需要代理,如果需要代理,就加代理就好了
Message: {ALERT.MESSAGE}

20231203192512

脚本从下面这个 Gist 中获取。以下内容托管在 GitHub,如果看不到,请确认您是否有访问权限。

配置消息模板,下面这个是告警模板,你需要替换【】中的内容,替换后,不需要加【】。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"msg_type": "interactive",
"card": {
"type": "template",
"data": {
"template_id": "【消息卡片模板 ID】",
"template_variable": {
"event_name": "{EVENT.NAME}",
"event_id": "{EVENT.ID}",
"event_date": "{EVENT.DATE}",
"event_time": "{EVENT.TIME}",
"host_name": "{HOST.NAME}",
"event_severity": "{TRIGGER.SEVERITY}",
"message_url": "【这里替换成跳转到监控平台的 URL】",
"trigger_name": "{TRIGGER.NAME}",
"problem_item_name": "{ITEM.NAME}",
"problem_item_value": "{ITEM.VALUE}",
"host_ip": "{HOST.IP}",
"from": "【消息来源,可做为安全校验字段使用】"
}
}
}
}

这个是告警恢复模板。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"msg_type": "interactive",
"card": {
"type": "template",
"data": {
"template_id": "【消息卡片模板 ID】",
"template_variable": {
"event_name": "{EVENT.NAME}",
"event_id": "{EVENT.ID}",
"event_date": "{EVENT.DATE}",
"event_time": "{EVENT.TIME}",
"host_name": "{HOST.NAME}",
"event_severity": "{TRIGGER.SEVERITY}",
"message_url": "【这里替换成跳转到监控平台的 URL】",
"trigger_name": "{TRIGGER.NAME}",
"problem_item_name": "{ITEM.NAME}",
"problem_item_value": "{ITEM.VALUE}",
"host_ip": "{HOST.IP}",
"from": "【消息来源,可做为安全校验字段使用】",
"event_duration": "{EVENT.DURATION}"
}
}
}
}

添加完是这个样子的。保存即可。

20231203192527

用户关联报警媒介

对用户关联一下刚才创建的报警媒介。

20231203193400

结语

好了,现在就可以愉快的接收 ZABBIX 飞书告警了。