[toc]
zabbix5.0配置企业微信webhook告警
Zabbix 5.0对于告警(报警媒介)进行了扩展和优化,可以直接支持 WebHook 类型的报警媒介。我们再开发企业微信机器人可以直接通过 JavaScript 语言编写脚本,因为得到了 Zabbix 的原生支持,告警脚本通用性强且更加灵活。本文将分享如何通过 Zabbix 报警媒介在企业微信发送告警信息。
1.创建报警媒介类型
管理 -> 报警媒介类型 -> 创建媒介类型

1.1 编辑报警媒介类型相关信息

以下为脚本内容
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 + ".";
}
1.2 编辑消息模板
1.2.1 默认内容
Message template 问题 默认内容
主题
	Problem: {EVENT.NAME}
消息
	Problem started at {EVENT.TIME} on {EVENT.DATE}
	Problem name: {EVENT.NAME}
	Host: {HOST.NAME}
	Severity: {EVENT.SEVERITY}
	Operational data: {EVENT.OPDATA}
	Original problem ID: {EVENT.ID}
	{TRIGGER.URL}
Message template Problem recovery 默认内容
主题
	Resolved in {EVENT.DURATION}: {EVENT.NAME}
消息
	Problem has been resolved at {EVENT.RECOVERY.TIME} on 				   {EVENT.RECOVERY.DATE}
	Problem name: {EVENT.NAME}
	Problem duration: {EVENT.DURATION}
	Host: {HOST.NAME}
	Severity: {EVENT.SEVERITY}
	Original problem ID: {EVENT.ID}
	{TRIGGER.URL}
Message template Problem update 默认内容
主题
	Updated problem in {EVENT.AGE}: {EVENT.NAME}
消息
	{USER.FULLNAME} {EVENT.UPDATE.ACTION} problem at {EVENT.UPDATE.DATE} 	{EVENT.UPDATE.TIME}.
	{EVENT.UPDATE.MESSAGE}
	Current problem status is {EVENT.STATUS}, age is {EVENT.AGE}, 	acknowledged: {EVENT.ACK.STATUS}.
1.2.2 自定义内容
在模板中是支持 markdown 语法的。目前支持的 markdown 语法是如下的子集。这是由企业微信机器人开发文档定义的。
- 标题 (支持 1 至 6 级标题,注意#与文字中间要有空格)
 - 加粗
 - 链接
 - 行内代码段(不支持跨行)
 - 引用
 - 字体颜色(有三种内置颜色)
 
1.2.2.1 问题
修改主题内容如下
- 
普通写法
服务器: {HOST.NAME} 发生: {TRIGGER.NAME} 故障! - 
markdown写法
# 服务器: `{HOST.NAME}` 发生: `{TRIGGER.NAME}` <font color="warning">故障!</font> 
修改消息内容如下
- 
普通写法
告警主机: {HOST.NAME}
告警地址: {HOST.IP}
监控项目: {ITEM.NAME}
监控取值: {ITEM.LASTVALUE}
告警等级: {TRIGGER.SEVERITY}
当前状态: {TRIGGER.STATUS}
告警信息: {TRIGGER.NAME}
告警时间: {EVENT.DATE} {EVENT.TIME}
事件ID: {EVENT.ID} - 
markdown写法
>**告警主机**: `{HOST.NAME}`
>**告警地址**: `{HOST.IP}`
>**监控项目**: `{ITEM.NAME}`
>**监控取值**: `{ITEM.LASTVALUE}`
>**告警等级**: `{TRIGGER.SEVERITY}`
>**当前状态**: `{TRIGGER.STATUS}`
>**告警信息**: `{TRIGGER.NAME}`
>**告警时间**: `{EVENT.DATE} {EVENT.TIME}`
>**事件ID**: `{EVENT.ID}` 

1.2.2.2 恢复
修改主题内容如下
- 
普通写法
服务器: {HOST.NAME}: 故障 {TRIGGER.NAME} 已恢复! - 
markdown写法
# 服务器: `{HOST.NAME}` 故障: `{TRIGGER.NAME}` <font color="info">已恢复!</font> 
修改消息内容如下
- 
普通写法
告警主机: {HOST.NAME}
告警地址: {HOST.IP}
监控项目: {ITEM.NAME}
监控取值: {ITEM.LASTVALUE}
告警等级: {TRIGGER.SEVERITY}
当前状态: {TRIGGER.STATUS}
告警信息: {TRIGGER.NAME}
告警时间: {EVENT.DATE} {EVENT.TIME}
恢复时间: {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间: {EVENT.AGE}
事件ID: {EVENT.ID} - 
markdown写法
>**告警主机**: `{HOST.NAME}`
>**告警地址**: `{HOST.IP}`
>**监控项目**: `{ITEM.NAME}`
>**监控取值**: `{ITEM.LASTVALUE}`
>**告警等级**: `{TRIGGER.SEVERITY}`
>**当前状态**: `{TRIGGER.STATUS}`
>**告警信息**: `{TRIGGER.NAME}`
>**告警时间**: `{EVENT.DATE} {EVENT.TIME}`
>**恢复时间**: `{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}`
>**持续时间**: `{EVENT.AGE}`
>**事件ID**: `{EVENT.ID}` 

1.2.2.3 更新
修改主题内容如下
- 
普通写法
服务器: {HOST.NAME}: 报警更新 - 
markdown写法
# 服务器: `{HOST.NAME}:` <font color="info">报警更新</font> 
修改消息内容如下
- 
普通写法
更新人: {USER.FULLNAME}
时间: {ACK.DATE} {ACK.TIME}
更新信息如下: "{ACK.MESSAGE}"
问题服务器IP: {HOSTNAME1}
问题ID: {EVENT.ID}
当前的问题是: {TRIGGER.NAME} - 
markdown写法
>**更新人**: `{USER.FULLNAME}`
>**时间**: `{ACK.DATE} {ACK.TIME}`
>**更新信息如下**: `"{ACK.MESSAGE}"`
>**问题服务器IP**: `{HOSTNAME1}`
>**问题ID**: `{EVENT.ID}`
>**当前的问题是**: `{TRIGGER.NAME}` 

2.创建触发动作
配置 -> 动作 -> 创建动作

依次编辑 操作、恢复操作、更新操作,需要配置的就是发送的组和发送的报警媒介

3.创建接收人
点击左下角的 User settings

添加报警媒介收件人


创建完成后如果发生告警则相应的企业微信群就会收到告警了,这里效果图就不展示了

