应朋友最近需求,先出告警篇。据朋友反馈,由版本 5.4 升级到 6.0 出现 Webhook 的 JS 脚本失效。下面仅仅是其中一个报错。
先贴出 5.x 时代的 Webhook 脚本吧,下面的脚本依然适用 5.0 ~ 5.4 版本
var dingding = {
key: null,
message: null,
msgtype: "markdown",
proxy: null,
sendMessage: function () {
var params = {
msgtype: dingding.msgtype,
markdown: {
title: "IT小白Kasar",(注意这里可以修改)
text: dingding.message
},
},
data,
response,
request = new CurlHttpRequest(),
url =
"https://oapi.dingtalk.com/robot/send?access_token=" +
dingding.key;
if (dingding.proxy) {
request.setProxy(dingding.proxy);
}
request.AddHeader("Content-Type: application/json");
data = JSON.stringify(params);
// Remove replace() function if you want to see the exposed key in the log file.
Zabbix.Log(
4,
"[dingding Webhook] URL: " + url.replace(dingding.key, "")
);
Zabbix.Log(4, "[dingding Webhook] params: " + data);
response = request.Post(url, data);
Zabbix.Log(4, "[dingding Webhook] HTTP code: " + request.Status());
try {
response = JSON.parse(response);
} catch (error) {
response = null;
}
if (request.Status() !== 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';
}
dingding.key = params.Key;
if (params.HTTPProxy) {
dingding.proxy = params.HTTPProxy;
}
dingding.to = params.To;
dingding.message = params.Subject + "
" + params.Message;
dingding.sendMessage();
return "OK";
} catch (error) {
Zabbix.Log(4, "[dingding Webhook] notification failed: " + error);
throw "Sending failed: " + error + ".";
}
新进来的朋友可能不明白什么情况,那么就来讲讲吧,Zabbix 的事件信息可以通过四种方式来传递事件信息,分别是:
今天要提的就是这个 Webhooks 方式,webhook 是应用给其它应用提供实时信息的一种方式。信息一产生,webhook 就会把它发送给已经注册的应用,这就意味着你能实时得到数据。不像传统的 APIs 方式,你需要用轮询的方式来获得尽可能实时的数据。这一点使得 webhook 不管是在发送端还是接收端都非常高效。(参考网络资料)
前提条件
进入钉钉软件里,点击右上方的 + 号
点击创建群聊
如果仅仅测试,最好选择组织内沟通,选人建群需要3人以上。
点击创建即可
点击群聊,再点击右上方设置图标
找到智能群助手
点击添加机器人
点击添加机器人后面的设置按钮
找到自定义(通过 Webhook 接入自定义服务)机器人,点击创建
自定义机器人的一些介绍,直接点击添加就好了
这里需要添加一些自定义机器人的参数。
需要注意的地方就是安全设置,共有三个参数:
最后得到相关信息,需要将 Webhook 的地址记住,后面会用到。
创建媒介类型,路径为 Administration -> Media types -> Create media type
该页面配置较多,名字自行设置,可以设置为中文,类型选择 Webhook,参数部分
选择 Key,找到刚刚创建机器人的那段 webhook 地址,这里为 ‘access_token=’ 后面的一串字符串。
https://oapi.dingtalk.com/robot/send?access_token=bff7096cbd8005c9590a95dc14ae676b030a48f6771d84c261aef381635f3ef1
Message 和 Subject 分别代表正文内容和标题,用的内置宏,标准格式
脚本类填写下面的代码即可,最后点击 Update 按钮即可
var dingding = {
key: null,
message: null,
msgtype: "markdown",
proxy: null,
sendMessage: function () {
var params = {
msgtype: dingding.msgtype,
markdown: {
title: "IT小白Kasar",
text: dingding.message
},
},
data,
response,
request = new HttpRequest(),
url =
"https://oapi.dingtalk.com/robot/send?access_token=" +
dingding.key;
if (dingding.proxy) {
request.setProxy(dingding.proxy);
}
request.addHeader("Content-Type: application/json");
data = JSON.stringify(params);
// Remove replace() function if you want to see the exposed key in the log file.
Zabbix.Log(
4,
"[dingding Webhook] URL: " + url.replace(dingding.key, "")
);
Zabbix.Log(4, "[dingding Webhook] params: " + data);
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';
}
dingding.key = params.Key;
if (params.HTTPProxy) {
dingding.proxy = params.HTTPProxy;
}
dingding.to = params.To;
dingding.message = params.Subject + "
" + params.Message;
dingding.sendMessage();
return "OK";
} catch (error) {
Zabbix.Log(4, "[dingding Webhook] notification failed: " + error);
throw "Sending failed: " + error + ".";
}
找到刚刚创建的 Webhook 并进行测试
这就是刚刚说的安全规则导致的,需要在安全条件设置合理的参数
测试成功
钉钉就能接收到来自 Zabbix 的消息了
仅有媒介不行,还得做一系列的设置。
给用户赋于该 Webhook 的使用权限
路径为 Administration -> Users -> 点击用户
进入到该用户界面,点击 Media 参数,再点击 Add,类型选择刚刚创建的钉钉,Sent to 字段随便填写,这里暂不涉及 @ 用户(后续会出),时间参数就选择默认全勾,最后点击 Add 即可。
添加后,点击下方的 Update 就可以了。
创建动作
路径为 Configuration -> Actions -> Trigger action
点击 Create action
名字自行填写,Conditions 就是对应的条件,满足该条件才会触发该动作行为,如果不满则不触发该行为,本文选主机组作为演示条件。
进入到操作选项,这里指的实际的一些行为操作,这里会在后续文章继续展开,当前只需要知道这三个选项对应的是发送告警事件,发送恢复告警事件,发送更新事件,日常工作仅用到前两个选项,点击 Add 即可创建对应的事件通知动作。
这里仅需要调整两个地方,第一个是 Send to users 部分,需要将已授权的用户加入进来即可,第二个部分是 Send only to,选择钉钉即可
最终
创建模拟主机,调用 ICMP Ping 模板,主机类型为 agent 方式,地址选择一个无法 ping 通的地址。
告警产生了,但是发送失败了,还有一个问题没解决,就是媒介的消息模板没定义,目前不展开动作里和媒介里的区别,只涉及解决方法。
进入钉钉模板里,进入到 Message templates 选项,点击 Add
默认模板,直接添加就可以,后续会讲到如何美化
最终
重新再触发告警,此时可以看到发送成功了。
再看看钉钉侧效果
那么基本就完成了。
关于事件通知其实是一个很大的知识点,有很多可以展开的内容,欢迎大家关注我后续的文章,下期见!
页面更新:2024-03-07
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号