本帖最后由 hackfans 于 2026-10-1 20:44 编辑
一、背景需求
之前搭建了Zabbix系统,我们可是实时对网络设备进行监控了,但是不可能有人24小时呆在电脑前,我们还需要让设备告警和恢复的通知可以及时通知到手机,这样才能时刻掌握网络状态。
Zabbix一般可以通过E-Mail、短息和Webhook模式,进行网络告警通知。这里邮件通知不够明显,手机短息通知,一般也不好操作,最方便的方法就是可以借助企业微信的机器人功能,进行群内通知,及时掌握网络波动情况。
二、环境配置
(1)操作系统:Ubuntu26+1Panel+Mysql8+Zabbix 7.4
(2)机器人:企业微信或者钉钉,这里以企业微信为例,钉钉有时间再补进来,其实大同小异。
三、准备工作
(1)提前申请好企业微信,然后拉一个小群,之后添加一个机器人进来。
然后在群里,新增一个机器人,它这里叫 【信息推送】
机器人会生成一个唯一的Webhook地址,千万不要泄露出去,以免被恶意盗刷信息。
四、开始配置
现在我们开始着手在Zabbix里配置各种参数,以便实现推送到企业微信中。
(1)添加“媒介”:告警---->媒介---->创建媒介类型
1.1然后在对话框中,开始配置参数。
在这里系统默认会有URL和Proxy,可以删除也可以不用管,我这里为了看着简洁干净就全删除了。
这里的名称列严格区分大小写,必须严格注意。之前就被坑过。
| 名称 | 值 | | Key | {ALERT.SENDTO} | | Subject | {ALERT.SUBJECT} | | Message | {ALERT.MESSAGE} |
1.2点开脚本对话框,粘贴下面的代码。
- try {
- var params = JSON.parse(value);
- if (!params.Key) {
- throw 'Key 参数为空,请检查用户媒介配置中的收件人字段。';
- }
- if (!params.Message) {
- throw 'Message 参数为空,请检查动作中的消息模板。';
- }
- var request = new HttpRequest(),
- data,
- response,
- url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + params.Key;
- // 拼接主题 + 正文
- var content = '';
- if (params.Subject) {
- content += '**' + params.Subject + '**\n\n';
- }
- content += params.Message;
- data = JSON.stringify({
- msgtype: "markdown",
- markdown: {
- content: content
- }
- });
- request.addHeader("Content-Type: application/json; charset=utf-8");
- Zabbix.log(4, "[WeCom Webhook] URL: " + url);
- Zabbix.log(4, "[WeCom Webhook] Payload: " + data);
- response = request.post(url, data);
- Zabbix.log(4, "[WeCom Webhook] HTTP Status: " + request.getStatus());
- Zabbix.log(4, "[WeCom Webhook] Response: " + response);
- if (request.getStatus() !== 200) {
- throw 'HTTP 请求失败,状态码: ' + request.getStatus();
- }
- response = JSON.parse(response);
- if (response.errcode !== 0) {
- throw '企业微信 API 错误: ' + response.errmsg + ' (errcode: ' + response.errcode + ')';
- }
- return 'OK';
- } catch (error) {
- Zabbix.log(3, "[WeCom Webhook] 发送失败: " + error);
- throw "企业微信发送失败: " + error;
- }
复制代码 1.3继续打开【消息模板】标签,开始配置问题 (Problem) 和 恢复 (Recovery) 的模板数据。
问题模板代码如下:
- <font color="warning">🔴告警通知</font>
复制代码- **主机**:{HOST.NAME}
- **IP**:{HOST.IP}
- **时间**:{EVENT.DATE} {EVENT.TIME}
- **等级**:{TRIGGER.SEVERITY}
- **状态**:{TRIGGER.STATUS}
- **信息**:{TRIGGER.NAME}
- **当前值**:{ITEM.NAME} = {ITEM.VALUE}
复制代码
恢复问题模板代码如下:
- <font color="info">✅恢复通知</font>
复制代码- **主机**:{HOST.NAME}
- **IP**:{HOST.IP}
- **恢复时间**:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
- **持续时间**:{EVENT.AGE}
- **状态**:{TRIGGER.STATUS}
- **信息**:{TRIGGER.NAME}
- **当前值**:{ITEM.NAME} = {ITEM.VALUE}
复制代码 因为企业微信,支持markdown,所谓我们这里需要遵循markdown的语法,可以实现一些格式化的信息推送。
之后点击添加按钮。
(2)配置用户和告警媒介
2.1 一次点开用户 -> 用户 -> 选择你的管理员用户(如 Admin)
2.2开始给用户配置报警媒介数据
2.3创建收件人媒介
这里的收件人填写企业微信机器人申请的Webhook的Key值,如果你的链接是ttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=1234-5678-abcd,那么这里的发送人就填写1234-5678-abcd
然后点击添加,创建完毕。
然后点击更新按钮,才算添加完毕,不要直接关闭该窗口。
(3)配置动作
3.1下一步开始为告警通知配置触发动作,依次打开告警---->动作---->触发器动作---->创建动作 按钮
3.2开始配置动作数据
起一个好记的名字
然后在点击操作标签,进行数据配置
之后点击添加添加或更新按钮,恢复操作,按如上参数,一样配置。
之后点击添加按钮,提交刚才的操作。
五、验证过程
主要配置基本完成,下面开始进行告警测试环节。
(1)开始我们,可以关闭Zabbix监控的某台设备,或者拔掉设备的某一个网口,来进行测试
这里我们拔掉路由器下挂的一台NAS服务器,尝试一下。
马上我们可以在Zabbix的后台,收到了一条端口link down的消息
同时我们的企业微信,也收到了同样的告警群消息
(2)我们把网线接回去,一般设备会自动恢复,之后收到系统发来的告警恢复的微信通知。
PS:在学习和配置过程中,踩过的那些小坑和大坑
1、在配置Webhook参数配置过程中,取Key值的时候,K字母需要为大写,脚本中必须是 params.Key(大小写敏感)。
2、在配置脚本的时候,系统报错,提示Sending failed: ReferenceError: identifier 'CurlHttpRequest' undefined,后发现是因为网上找到的脚本适用于Zabbix 5.X的,在Zabbix 6.0以后的版本, CurlHttpRequest这个对象已被弃用并移除。通过官方文档,可以查询到,具体变化内容。
Zabbix 5.4 之前:使用 CurlHttpRequest(旧名称)
Zabbix 5.4 开始:引入 HttpRequest(新名称)
Zabbix 6.0 及以后:CurlHttpRequest 已被移除,必须使用 HttpRequest
新旧版本核心差异对照表
| 项目 | 旧版本 (Zabbix ≤5.2) | 新版本 (Zabbix ≥6.0) | | HTTP 请求对象 | new CurlHttpRequest() | new HttpRequest() | | 添加 Header | AddHeader('k: v') | addHeader('k', 'v') | | POST 请求 | Post(url, data) | post(url, data) | | GET 请求 | Get(url, data) | get(url, data) | | 获取状态码 | Status() | getStatus() | | 设置代理 | SetProxy(proxy) | setProxy(proxy) | | 日志输出 | Zabbix.Log(level, msg) | Zabbix.log(level, msg) |
|