一、前提条件
1、zabbix服务器能够访问钉钉的服务器,具体说是能访问https://oapi.dingtalk.com/robot/send
2、钉钉的webhook是有安全要求的,我采用的是ip的方式,我的zabbix服务器在内网,我的网络出口有多个固定公网ip,所以这样做省事,其他方式也可以你自己考虑。下图是webhook机器人的配置。
二、zabbix7配置报警媒介以及消息模板配置
告警----媒介---创建媒介类型
这一步,参数里面默认的跟我下图里不一样的,按我下图修改。Key是你的webhook机器人地址里的access_token=后面的内容。
脚本内容如下
var dingding = { key: null, message: null, msgtype: "markdown", proxy: null, // 发送消息的函数 sendMessage: function () { var params = { msgtype: dingding.msgtype, markdown: { title: "网络设备告警", // 消息的标题 text: dingding.message // 消息的内容 }, }; // 钉钉的Webhook URL var url = "https://oapi.dingtalk.com/robot/send?access_token=" + dingding.key; // 创建一个新的HttpRequest对象 var request = new HttpRequest(); if (dingding.proxy) { request.setProxy(dingding.proxy); // 设置代理,如果有的话 } // 设置请求头 request.addHeader("Content-Type: application/json"); var data = JSON.stringify(params); // 将参数转换为JSON字符串 // 记录URL日志,替换掉key以保护隐私 Zabbix.Log(4, "[dingding Webhook] URL: " + url.replace(dingding.key, "<BOT KEY>")); Zabbix.Log(4, "[dingding Webhook] params: " + data); // 发送POST请求 var response = request.post(url, data); Zabbix.Log(4, "[dingding Webhook] HTTP code: " + request.getStatus()); try { response = JSON.parse(response); // 解析响应 } catch (error) { response = null; } // 检查响应状态和错误码 if (request.getStatus() !== 200 || response.errcode !== 0) { if (typeof response.errmsg === "string") { throw response.errmsg; // 抛出错误信息 } else { throw "Unknown error. Check debug log for more information."; // 抛出未知错误 } } },};try { // 解析传入的参数 var params = JSON.parse(value); if (typeof params.Key === "undefined") { throw 'Incorrect value is given for parameter "Key": parameter is missing'; // 检查Key参数 } dingding.key = params.Key; if (params.HTTPProxy) { dingding.proxy = params.HTTPProxy; // 设置代理 } dingding.message = params.Subject + "\n" + params.Message; // 组合消息内容 dingding.sendMessage(); // 发送消息 return "OK";} catch (error) { Zabbix.Log(4, "[dingding Webhook] notification failed: " + error); // 记录错误日志 throw "Sending failed: " + error + "."; // 抛出发送失败错误}
消息模板配置如下
问题
主题留空就行了,内容如下:
<font color="comment">主机IP:{HOST.IP}</font><font color="comment">告警主机:{HOST.NAME}</font><font color="comment">告警时间:{EVENT.DATE} {EVENT.TIME}</font><font color="comment">告警等级:{TRIGGER.SEVERITY}</font><font color="comment">告警信息:{TRIGGER.NAME}</font><font color="comment">当前状态:{TRIGGER.STATUS}</font><font color="comment">事件ID:{EVENT.ID}</font>
主题留空,问题回复如下配置:
<font color="Green">主机IP:{HOST.IP}</font><font color="Green">告警主机:{HOST.NAME}</font><font color="Green">恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}</font><font color="Green">告警等级:{TRIGGER.SEVERITY}</font><font color="Green">告警信息:{TRIGGER.NAME}</font><font color="Green">当前状态:{TRIGGER.STATUS}</font><font color="Green">事件ID:{EVENT.ID}</font>
三、报警用户配置
选择你创建的告警媒介
四、配置告警动作
设置动作规则
设置动作操作。
整个逻辑就是告警动作匹配告警媒介与用户,然后进行告警的发送。
用户里面需要有使用媒介的权限和时间。大概就这个意思