今年年中,我开始把我自用的一个企业从企业微信迁移到飞书,历时两个半月,终于彻底迁移过来了,老企业微信也就注销掉了。ZABBIX 对接飞书也是迁移的最后一步。
其实关于 ZABBIX 对接国内各种企业 IM 已经是老生常谈的问题了。不过我在对接之前还是习惯性的搜了一下,发现使用 ZABBIX Javascript Runtime 实现的少之又少,所以我还是打算记录一下。
效果放前面
你可以通过飞书的群机器人,接收 ZABBIX 的告警信息,例如下面的是故障消息:

下面这个是故障恢复消息:

实现思路
使用 ZABBIX 6 以上版本提供的 Javascript Runtime,免去了在 ZABBIX 服务器底层放 Python 脚本的步骤,后续维护报警媒介,都可以通过 ZABBIX WEB 来实现。
扩展阅读:其它 Javascript 对象
技术实现
创建飞书机器人
我们需要先在飞书群里创建一个机器人。获取它的 Webhook 地址。创建飞书群机器人,请参考飞书帮助中心 - 如何在群组中使用机器人?,请按照文档操作,创建一个“自定义机器人”。

安全配置,按需启用就好了,或者干脆不启用。其中上图框选的部分,就是后文需要用到的 BOTKEY。
创建飞书消息卡片模板
创建一个飞书消息卡片模板,消息卡片模板可以很方便的帮助我们调整推送消息的样式,且消息卡片模板可以导出导入,方便复用。下面我提供了两个告警和告警恢复的消息卡片模板。
以下内容托管在 GitHub,如果看不到,请确认您是否有访问权限。
你可以直接下载另存为 json 文件,登录 飞书开放平台 - 消息卡片搭建工具,选择导入卡片,导入刚才下载的卡片配置文件。

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

这个卡片 ID 很重要,记得存一下,一会要用的。
创建一个飞书告警媒介
在 ZABBIX 中创建一个新的报警媒介,类型选择 Webhook,参数有三个,参考下表。
1 2 3
| Botkey: 飞书Webhook地址后面那段 HTTPProxy: 是否需要代理,如果需要代理,就加代理就好了 Message: {ALERT.MESSAGE}
|

脚本从下面这个 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}" } } } }
|
添加完是这个样子的。保存即可。

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

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