2020 年 5 月,zabbix 发布了 5.0LTS 版,这个版本从界面到功能都有了很大的提升。大家可以通过Zabbix 5.0 LTS released了解新版本的特性。

新版本的 Zabbix 对于告警(报警媒介)进行了扩展和优化,可以直接支持 WebHook 类型的报警媒介。我们再开发企业微信机器人可以直接通过 JavaScript 语言编写脚本,因为得到了 Zabbix 的原生支持,告警脚本通用性强且更加灵活。

本文我将分享一下,如何通过 Zabbix 报警媒介在企业微信发送告警信息。

注册企业微信机器人

首先我们需要先在自己的企业微信群里创建一个机器人,并获取其 WebHook 地址。右击群聊天卡片,添加群机器人。
添加群机器人
为你的机器人起一个名字,点击确定,获得一个类似下图的 WebHook 地址。注意,这个 WebHook 地址非常重要,请不要泄露,否则他人可以通过这个地址给你捣乱。把这个地址复制出来,后面需要用到。
获得WebHook地址

创建告警媒介

登录 Zabbix,依次选择“管理”、“报警媒介类型”、“创建媒体类型”。名称随意,只要能起到一个标识作用即可。媒介类型选择WebHook,参数按下表填写。

名称
Message {ALERT.MESSAGE}
Subject {ALERT.SUBJECT}
Key Your Bot Key

这里的 Key 就是刚刚注册机器人时候生成的 WebHook 地址末尾的 Key,例如你的地址是https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=574c6d4e-544c-4baf-ae9a-b935dbc1be46,则这里你需要填写574c6d4e-544c-4baf-ae9a-b935dbc1be46

脚本可以参考如下的代码段。直接复制到脚本代码框中即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
var Qiyeweixin = {
key: null,

message: null,
msgtype: "markdown",
proxy: null,

sendMessage: function () {
var params = {
msgtype: Qiyeweixin.msgtype,
markdown: {
content: Qiyeweixin.message,
},
},
data,
response,
request = new CurlHttpRequest(),
url =
"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" +
Qiyeweixin.key;

if (Qiyeweixin.proxy) {
request.setProxy(Qiyeweixin.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,
"[Qiyeweixin Webhook] URL: " + url.replace(Qiyeweixin.key, "<BOT KEY>")
);
Zabbix.Log(4, "[Qiyeweixin Webhook] params: " + data);
response = request.Post(url, data);
Zabbix.Log(4, "[Qiyeweixin 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';
}

Qiyeweixin.key = params.Key;

if (params.HTTPProxy) {
Qiyeweixin.proxy = params.HTTPProxy;
}

Qiyeweixin.to = params.To;
Qiyeweixin.message = params.Subject + "\n" + params.Message;
Qiyeweixin.sendMessage();

return "OK";
} catch (error) {
Zabbix.Log(4, "[Qiyeweixin Webhook] notification failed: " + error);
throw "Sending failed: " + error + ".";
}

超时给 10s 即可。最后配置完成后,应该是如下图的样子。
报警媒介类型页面
创建消息模板。Zabbix 已经预制了一些模版可以直接拿来用,也可以自定义。
消息模板
在模板中是支持 markdown 语法的。目前支持的 markdown 语法是如下的子集。这是由企业微信机器人开发文档定义的。

  • 标题 (支持 1 至 6 级标题,注意#与文字中间要有空格)
  • 加粗
  • 链接
  • 行内代码段(不支持跨行)
  • 引用
  • 字体颜色(有三种内置颜色)

测试告警媒介

编辑完成,点击“添加”,回到报警媒介类型页面。找到刚刚添加的报警媒介,在动作栏下面对应位置点击“测试”。
测试企业微信WebHook消息
在“Test media type”对话框中,可以直接点击“测试”,也可以自定义通知的主题和内容,如图。
发送测试消息
测试成功,在 Zabbix 端会提示“Media type test successful.”,同时在企业微信里也会收到刚刚发出来的测试消息。
测试告警媒介成功

配置通知消息

到现在,就已经成功开发了一个企业微信告警机器人,现在我们要把他配置到通知消息里。
首先对用户配置告警媒介。如下图,你也可以选择启动机器人的时间段,比如我要 7x24 小时盯着网络设备,这里直接 007 就好了。
对用户配置告警媒介
创建一个动作,发送消息给某些用户,并仅送到“Qiyeweixin”这个告警媒介。
配置动作
这样,当有设备触发器被触发产生告警时,你的企业微信机器人就会给你发消息了。
收到的告警信息

参考文档