第十七章 扩展告警方式
Zabbix支持多种告警方式(Media types),包括Email、Jabber、SMS和Ez Texting。Email告警方式用的最多,Jabber和Ez Texting在国内基本没有用的,SMS需要安装短信猫。也有公司提供商业的短信告警、电话告警等,需要额外支付服务费用,也有人通过139信箱实现伪短信告警效果。有没有其他更好的既省钱又快捷方便的告警方式呢?答案是有,那就是通过脚本扩展,使用微信或钉钉开放的API接口发送告警信息。
17.1 微信告警方式
17.1.1 注册微信公众平台企业号
使用微信告警之前,我们需要注册一个微信公众平台企业号并添加部门、应用和用户,步骤如下:
1、 在https://qy.weixin.qq.com页面注册企业号。
2、 登录企业号,在应用中心添加消息型应用,添加成功后点击该应用,在弹出页面中发现并记录应用ID以备后用。
3、 在通讯录的组织架构中添加子部门,添加成功后点击该部门名称右侧的三角形图标,在弹出菜单中点击修改部门,在弹出页面中发现并记录部门ID以备后用。
4、 点击通讯录中新添加的部门名称,新增成员或批量导入。
5、 在设置的权限管理中新建一个普通管理组,需要在设置权限的页面中分别要对通讯录权限和应用权限中进行设置,允许前面添加的部门和应用可以查看或发消息的权限。创建成功后,在该组的信息中查找CorpID(企业号的标识)和Secret(管理组凭证密钥)并记录以备后用。
17.1.2 微信接口
调用企业号时,需使用Https协议、Json数据格式、UTF8编码,访问域名为https://qyapi.weixin.qq.com,数据包不需要加密。
收集AccessToken请求说明:
在每次主动调用企业号接口时需要带上AccessToken参数。AccessToken参数由CorpID和Secret换取。不同的Secret会返回不同的AccessToken。正常情况下AccessToken有效期为7200秒,有效期内重复收集返回相同结果。
Https请求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect
返回结果:
正确的JSON返回结果:{"access_token": "accesstoken000001","expires_in": 7200 }
错误的JSON返回结果:{"errcode": 43003,"errmsg": "require https" }
消息发送接口请求说明:
企业可以主动发消息给成员,每天可发的数量为:帐号上限数*30人次/天。调用接口时,使用Https协议、JSON数据包格式,数据包不需做加密处理。
Https请求方式: POST
https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
返回结果:如果无权限,则本次发送失败;如果收件人不存在或未关注,发送仍然执行。两种情况下均返回无效的部分(注:由于userid不区分大小写,返回的列表都统一转为小写)。
17.1.3 数据格式
目前消息型应用支持文本、图片、语音、视频、文件、图文等消息类型。
在Zabbix中我们主要使用文本消息类型。格式如下:
{
"touser":"UserID1|UserID2|UserID3",
"toparty": "PartyID1 | PartyID2 ",
"totag": "TagID1 | TagID2 ",
"msgtype":"text",
"agentid": 1,
"text": {
"content":"Holiday Request For Pony(http://xxxxx)"
},
"safe":0
}
参数说明如下表17-1所示:
表 17-1
参数 | 必须 | 说 明 |
touser | 否 | 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送。 |
toparty | 否 | 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数。 |
totag | 否 | 标签ID列表,多个接收者用‘|’分隔。当touser为@all时忽略本参数。 |
msgtype | 是 | 消息类型,此时固定为:text (支持消息型应用跟主页型应用)。 |
agentid | 是 | 企业应用的id,整型。可在应用的设置页面查看。 |
content | 是 | 消息内容,最长不超过2048个字节,注意:主页型应用推送的文本消息在微信端最多只显示20个字(包含中英文)。 |
safe | 否 | 表示是否是保密消息,0表示否,1表示是,默认0。 |
近日完成《》视频教程的录制并正式发布,该教程基于 zabbix 4.2 ,对Zabbix进行全面讲解。欢迎大家围观。课程链接:https://edu.51cto.com/sd/ce000
17.1.4 脚本程序
发送消息的脚本可以用任何你喜欢的编程语言编写,下面我们以bash编写发送脚本作为例子说明。
# viweixin.sh
#!/bin/bash
CROPID='wx2995e0333bc'
SECRET='tRJmtAZdFgk_d9YCLLaEcdv9YV6OqvC1h33XMfrLRg'
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CROPID&corpsecret=$SECRET"
#get acccess_token
GTOKEN=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$GTOKEN"
#
function sendmsg() {
local int APPID=1 #企业号中的应用id
local USERID=$1 #部门成员id,zabbix中定义的微信接收人
local PARTYID=2 #部门id,组内成员都可接收到消息
local SUBJECT=$2
local MSG=$(echo "$@" | cut -d" " -f3-) #过滤出zabbix传递的第三个参数
printf '{\n'
printf '\t"touser": "'"$USERID"\"",\n"
printf '\t"toparty": "'"$PARTYID"\"",\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'"$APPID"\"",\n"
printf '\t"text": {\n'
printf '\t\t"content": "'"$SUBJECT \n$MSG"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n’
}
/usr/bin/curl --data-ascii "$(sendmsg $1 $2 $3)" $PURL
在上面程序中定义的变量$APPID为企业号中应用的ID,$USERID为部门成员账号,对应Zabbix中宏变量{ALERT.SENDTO}定义的消息接收人,$PARTYID为部门的ID,$MSG为发送的消息内容,对应Zabbix中宏变量{ALERT.MESSAGE}定义的内容。
17.1.5 Zabbix中相关配置
首先将脚本文件保存到 /usr/lib/zabbix/alertscripts(或zabbix_server.conf中配置的AlertScriptsPath参数指定的位置)目录中,并设置相应权限。
# chown zabbix:zabbixweixin.sh
# chmod +x weixin.sh
在Zabbix前端页面中,点击Administration--> Media types,点击页面右上角的Create media type按钮创建新的告警方式。如下图17-1所示。
图 17-1
在脚本参数中必须添加{ALERT.SENDTO}、{ALERT.SUBJECT}和{ALERT.MESSAGE}宏变量,其他参数根据需要添加。
然后点击Administration--> Users,点击用户名称打开用户配置页面,在Media标签中添加告警方式。如下图17-2所示。
图 17-2
配置trigger,如下图17-3所示。
图 17-3
配置action,如下图17-4所示。
图 17-4
完成上面的配置后,测试微信告警的效果如下图17-5所示。
图 17-5
17.2 钉钉告警方式
17.2.1 注册钉钉
首先要到https://oa.dingtalk.com/ 完成企业注册,具体过程请参考钉钉官网。注册完成后,需要完成下面的设置:
在通讯录中添加部门(例如运维部),添加成功后打开新建的部门,并在部门中添加员工。部门ID从浏览器地址栏中收集,在地址栏中链接的末尾你会发现类似deptId=15973529的信息,这个deptid就是部门ID,记录以备后用。每个新建员工的工号也要记录,后面会用到。
在微应用中新建一个应用(例如监控告警),在这个应用的设置中找到AgentID记录下来以备后用。
钉钉接口
当企业应用服务器调用钉钉开放平台接口时,需使用https协议、Json数据格式、UTF8编码,访问域名为https://oapi.dingtalk.com。你需要在钉钉中创建一个群组,在这个群组中添加一个机器人,它会给你生成一个webhook链接,通过这个webhook,可以发送信息到群里。
17.2.3 数据格式
目前支持text、p_w_picpath、voice、file、link、OA消息类型。每个消息都由消息头和消息体组成,企业会话的消息头由touser,toparty,agentid组成。
在Zabbix中我们主要使用text消息类型。格式如下:
{
“touser”: ”UserID1|UserID2|UserID3”,
“toparty”: ”PartyID1|PartyID2”,
“agented”: “1”,
"msgtype": "text",
"text": {
"content":"张三的请假申请"
}
}
表 17-2
参数 | 必须 | 类型 |
touser | 否 | String |
toparty | 否 | String |
agentid | 是 | String |
msgtype | 是 | String |
content | 是 | String |
17.2.4 脚本程序
下面我们以bash编写发送脚本作为例子说明。
# vi dingtalk.sh
#!/bin/bash
SENDTO=$1
SUBJECT=$2
MSG=$3
curl 'https://oapi.dingtalk.com/robot/send?access_token=3682ed9f9bb1831080e028702462' \
-H 'Content-Type: application/json' \
-d '
{"msgtype": "text",
"text": {
"content": "'"$SUBJECT \n$MSG"'"
},
"at":{
"atMobiles":[
"'"$SENDTO"'"
],
"isAtAll":false
}
}'
17.2.5 Zabbix中相关配置
首先将脚本文件保存到/usr/lib/zabbix/alertscripts(或zabbix_server.conf中配置的AlertScriptsPath参数指定的位置)目录中,并设置相应权限。
# chown zabbix:zabbix dingtalk.sh
# chmod +x dingtalk.sh
在Zabbix前端页面中,点击Administration--> Media types,点击页面右上角的Createmedia type按钮创建新的告警方式。如下图17-6所示。
图 17-6
在脚本参数中必须添加{ALERT.SENDTO}、{ALERT.SUBJECT}和{ALERT.MESSAGE}宏变量,其他参数根据需要添加。
然后点击Administration --> Users,点击用户名称打开用户配置页面,在Media标签中添加告警方式。如下图17-7所示。
图 17-7
配置trigger,如下图17-8所示。
图 17-8
配置action,如下图17-9所示。
图 17-9
完成上面的配置后,测试钉钉告警的效果如下图17-10所示。
图 17-10
出自http://ustogether.blog.51cto.com/8236854/1931611,如需转载请与作者联系。