Zabbix 6 系列学习 15:发送告警信息到钉钉

应朋友最近需求,先出告警篇。据朋友反馈,由版本 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 的地址记住,后面会用到。

Zabbix 部分

创建媒介类型,路径为 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

标签:公网   信息   媒介   机器人   脚本   选项   参数   事件   方式   地址   系列

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top