Zabbix配置钉钉告警推送

程哲
发布于 2024-09-27 / 111 阅读
0
0

Zabbix配置钉钉告警推送

Zabbix默认没有开箱即用的对接钉钉的结构,需要利用 Zabbix 监控系统的脚本定制化的方式扩展钉钉告警,需要使用钉钉微信群的webhook。

1.webhook的定义

Webhook 是一个 API 概念,即前端不主动发送请求,完全由后端推送;举个常用例子,比如你的好友发了一条朋友圈,后端将这条消息推送给所有其他好友的客户端,就是 Webhook 的典型场景。
简单来说,webhook 就是一个接收 HTTP POST(或 GET,PUT,DELETE)的 URL,一个实现了 webhook的 API 提供商就是在当事件发生的时候会向这个配置好的 URL 发送一条信息,与请求-响应式不同,使用 webhook 你可以实时接受到变化。
在钉钉中,我们可以为群创建一个 webhook,zabbix 就是通过 webhook 向这个钉钉群发送信息的。

2.为钉钉群创建 webhook

钉钉机器人是全局唯一的应用,即无论是在单聊场景中还是群聊场景中,都可以用来推送应用的通知和用来对用户进行对话式服务,机器人 ID 都可以是唯一的。这意味着开发者既可以选择仅创建一个机器人,而后将其放在各个应用场景下使用,也可以创建多个机器人,然后分别部署在不同场景下。

2.1 设置钉钉机器人

群设置--》智能群助手添加自定义群机器人
注意:多添加一些关键字:报警、告警、问题、故障、恢复等

2.2 生成webhook

记下这个webhook,只要机器人不删,这个webhook就可以一直使用1 登录钉钉获取授权码

复制好Webhook

2.3 测试webhook

使用如下命令在linux系统中发送测试信息

[root@zbx ~]# curl 'webhook地址' -H 'Content-Type:application/json' -d '{"msgtype":"text","text":{"content":"报警"}}'

3. 设置zabbix告警方式

3.1 创建报警媒介

“告警”-->“媒介”,创建媒介类型

参数部分设置:

Message: (ALERT.MESSAGE}
TO: {ALERT.SENDTO}
URL:
https://oapi,dingtalk.com/robot/send?access token=<你的 token 值>

删掉其他参数将本案例提供的脚本粘贴进去

脚本内容如下:

var Dingding = {
    params: {},
    proxy: null,
    setParams: function (params) {
        if (typeof params !== 'object') {
            return;
        }
        Dingding.params = params; 
    },
    request: function () {
        var data = {
          msgtype: "markdown",
          markdown: {
            title: "报警",
            text: Dingding.params.Message,
          },
          at: {
            atUserIds: [Dingding.params.To],
            isAtAll: false,
          },
        },
        response,
        url = Dingding.params.URL,
        request = new HttpRequest();
        request.addHeader('Content-Type: application/json');
        if (typeof Dingding.HTTPProxy !== 'undefined' && Dingding.HTTPProxy !== '') {
            request.setProxy(Dingding.HTTPProxy);
        }
        if (typeof data !== 'undefined') {
            data = JSON.stringify(data);
        }
        Zabbix.Log(4, "[Dingding Webhook] message is: " + data);
        response = request.post(url, data);
        Zabbix.log(4, '[ Dingding Webhook ] Received response with status code ' +
            request.getStatus() + '\n' + response);
        if (response !== null) {
            try {
                response = JSON.parse(response);
            }
            catch (error) {
                Zabbix.log(4, '[ Dingding Webhook ] Failed to parse response received from Dingding');
                response = null;
            }
        }
          if (request.getStatus() !== 200 || response.errcode !== 0) {
            var message = 'Request failed with status code '+request.getStatus();
            if (response !== null && typeof response.errmsg !== 'undefined') {
                message += ': '+ JSON.stringify(response.errmsg) ;
            }
            throw message + '. Check debug log for more information.';
        }
        return response;
    },
};
try {
    var params = JSON.parse(value);
    if (typeof params.URL !== 'undefined' 
         && typeof params.To !== 'undefined'
         && typeof params.Message !== 'undefined') {
           Zabbix.log(4, '[ Dingding Webhook ] webhookURL "' + params.URL +
                            '" sendto "'+ params.To )+'"';
        } 
        else {
          throw 'Missing parameter. URL, message, to parameter is required'
        }
    if (params.HTTPProxy) {
        Dingding.proxy = params.HTTPProxy;
    } 
    Dingding.setParams(params);
    Dingding.request();
    return 'OK';
}catch (error) {
    Zabbix.log(3, '[ Dingding Webhook ] ERROR: ' + error);
    throw 'Sending failed: ' + error;
}

3.2 创建触发器动作

告警-动作-触发器动作-创建动作

消息模版填写如下:

主题:

{HOSTNAME1}发生{TRIGGER.NAME},请注意!

消息:

【告警通知】

服务器:{HOSTNAME1}发生{TRIGGER.NAME}告警!

问题详情:

>主机:{HOSTNAME1}

>地址:{HOST.IP}

>时间:{EVENT.DATE} {EVENT.TIME}

>告警等级:<font color="warning">{TRIGGER.SEVERITY}</font>

>监控项:{TRIGGER.NAME}

>问题详情:{ITEM.NAME}

>当前状态:<font color="warning">{TRIGGER.STATUS}: {ITEM.VALUE1}</font>

>事  件 ID:{EVENT.ID}

消息类型:问题恢复模版

主题:

{HOSTNAME1}的{TRIGGER.NAME}已恢复!

【告警恢复通知】

服务器: {HOSTNAME1}的{TRIGGER.NAME}已恢复!

详情:

>主机:{HOSTNAME1}

>地址:{HOST.IP}

>时间:{EVENT.DATE} {EVENT.TIME}

>监控项:{TRIGGER.NAME}

>问题详情:{ITEM.NAME}

>当前状态:<font color="info">{TRIGGER.STATUS}: {ITEM.VALUE1}</font>

>事  件 ID:{EVENT.ID}

3.3 选项部分的设置

3.4 为用户添加告警媒介即可


评论