听天命
印

保姆级教程:一步一步配置使用企业微信与Zabbix监控系统联动,及时推送告警信息

[复制链接]
发表于 2026-6-17 08:20:57 | 显示全部楼层 |阅读模式
本帖最后由 hackfans 于 2026-10-1 20:44 编辑

一、背景需求
      之前搭建了Zabbix系统,我们可是实时对网络设备进行监控了,但是不可能有人24小时呆在电脑前,我们还需要让设备告警和恢复的通知可以及时通知到手机,这样才能时刻掌握网络状态。
       Zabbix一般可以通过E-Mail、短息和Webhook模式,进行网络告警通知。这里邮件通知不够明显,手机短息通知,一般也不好操作,最方便的方法就是可以借助企业微信的机器人功能,进行群内通知,及时掌握网络波动情况。
二、环境配置
     (1)操作系统:Ubuntu26+1Panel+Mysql8+Zabbix 7.4
     (2)机器人:企业微信或者钉钉,这里以企业微信为例,钉钉有时间再补进来,其实大同小异。
三、准备工作
     (1)提前申请好企业微信,然后拉一个小群,之后添加一个机器人进来。
添加机器人_1.png
然后在群里,新增一个机器人,它这里叫 【信息推送】
添加机器人_2.png
机器人会生成一个唯一的Webhook地址,千万不要泄露出去,以免被恶意盗刷信息。
四、开始配置
现在我们开始着手在Zabbix里配置各种参数,以便实现推送到企业微信中。
(1)添加“媒介”:告警---->媒介---->创建媒介类型
添加媒介_1.png
1.1然后在对话框中,开始配置参数。
添加媒介_2.png
在这里系统默认会有URL和Proxy,可以删除也可以不用管,我这里为了看着简洁干净就全删除了。
这里的名称列严格区分大小写,必须严格注意。之前就被坑过。
名称 值
Key {ALERT.SENDTO}  
Subject {ALERT.SUBJECT}
Message {ALERT.MESSAGE}

1.2点开脚本对话框,粘贴下面的代码。
  1. try {
  2.     var params = JSON.parse(value);

  3.     if (!params.Key) {
  4.         throw 'Key 参数为空,请检查用户媒介配置中的收件人字段。';
  5.     }
  6.     if (!params.Message) {
  7.         throw 'Message 参数为空,请检查动作中的消息模板。';
  8.     }

  9.     var request = new HttpRequest(),
  10.         data,
  11.         response,
  12.         url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + params.Key;

  13.     // 拼接主题 + 正文
  14.     var content = '';
  15.     if (params.Subject) {
  16.         content += '**' + params.Subject + '**\n\n';
  17.     }
  18.     content += params.Message;

  19.     data = JSON.stringify({
  20.         msgtype: "markdown",
  21.         markdown: {
  22.             content: content
  23.         }
  24.     });

  25.     request.addHeader("Content-Type: application/json; charset=utf-8");

  26.     Zabbix.log(4, "[WeCom Webhook] URL: " + url);
  27.     Zabbix.log(4, "[WeCom Webhook] Payload: " + data);

  28.     response = request.post(url, data);

  29.     Zabbix.log(4, "[WeCom Webhook] HTTP Status: " + request.getStatus());
  30.     Zabbix.log(4, "[WeCom Webhook] Response: " + response);

  31.     if (request.getStatus() !== 200) {
  32.         throw 'HTTP 请求失败,状态码: ' + request.getStatus();
  33.     }

  34.     response = JSON.parse(response);
  35.     if (response.errcode !== 0) {
  36.         throw '企业微信 API 错误: ' + response.errmsg + ' (errcode: ' + response.errcode + ')';
  37.     }

  38.     return 'OK';

  39. } catch (error) {
  40.     Zabbix.log(3, "[WeCom Webhook] 发送失败: " + error);
  41.     throw "企业微信发送失败: " + error;
  42. }
复制代码
1.3继续打开【消息模板】标签,开始配置问题 (Problem) 和 恢复 (Recovery) 的模板数据。
添加媒介_3.png

问题模板代码如下:
  1. <font color="warning">🔴告警通知</font>
复制代码
  1. **主机**:{HOST.NAME}
  2. **IP**:{HOST.IP}
  3. **时间**:{EVENT.DATE} {EVENT.TIME}
  4. **等级**:{TRIGGER.SEVERITY}
  5. **状态**:{TRIGGER.STATUS}
  6. **信息**:{TRIGGER.NAME}
  7. **当前值**:{ITEM.NAME} = {ITEM.VALUE}
复制代码
添加媒介_4.png
恢复问题模板代码如下:
  1. <font color="info">✅恢复通知</font>
复制代码
  1. **主机**:{HOST.NAME}
  2. **IP**:{HOST.IP}
  3. **恢复时间**:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
  4. **持续时间**:{EVENT.AGE}
  5. **状态**:{TRIGGER.STATUS}
  6. **信息**:{TRIGGER.NAME}
  7. **当前值**:{ITEM.NAME} = {ITEM.VALUE}
复制代码
因为企业微信,支持markdown,所谓我们这里需要遵循markdown的语法,可以实现一些格式化的信息推送。
之后点击添加按钮。
(2)配置用户和告警媒介
2.1 一次点开用户 -> 用户 -> 选择你的管理员用户(如 Admin)
添加用户_1.png
2.2开始给用户配置报警媒介数据
添加用户_2.png
2.3创建收件人媒介
添加用户_3.png
这里的收件人填写企业微信机器人申请的Webhook的Key值,如果你的链接是ttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=1234-5678-abcd,那么这里的发送人就填写1234-5678-abcd
然后点击添加,创建完毕。
然后点击更新按钮,才算添加完毕,不要直接关闭该窗口。
添加用户_4.png
(3)配置动作
3.1下一步开始为告警通知配置触发动作,依次打开告警---->动作---->触发器动作---->创建动作 按钮
添加动作_1.png
3.2开始配置动作数据
起一个好记的名字
添加动作_2.png
然后在点击操作标签,进行数据配置
添加动作_3.png
之后点击添加添加或更新按钮,恢复操作,按如上参数,一样配置。
添加动作_4.png
之后点击添加按钮,提交刚才的操作。
五、验证过程
主要配置基本完成,下面开始进行告警测试环节。
(1)开始我们,可以关闭Zabbix监控的某台设备,或者拔掉设备的某一个网口,来进行测试
这里我们拔掉路由器下挂的一台NAS服务器,尝试一下。
马上我们可以在Zabbix的后台,收到了一条端口link down的消息
验证_1.png
同时我们的企业微信,也收到了同样的告警群消息
验证_2.png
(2)我们把网线接回去,一般设备会自动恢复,之后收到系统发来的告警恢复的微信通知。
验证_3.png

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()
添加 HeaderAddHeader('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)




楼主| 发表于 2026-10-1 20:43:26 | 显示全部楼层
PS:脚本之前没有粘贴全,已修正。

© 2001-2026 Discuz! Team. Powered by Discuz! X5.0

GMT+8, 2026-10-25 08:12 , Processed in 0.018645 second(s), 6 queries , Redis OnArchiver|手机版|小黑屋|『遗失的梦』 ( 津ICP备12003239号-1|违法与不良信息举报:admin@hackfans.net ) 劰载中...

快速回复 返回顶部 返回列表