背景
- 现实生产环境中,我们通常使用邮件和短信接受zabbix报警信息,但是邮件经常被工作人员搁置在角落中甚至被设置为垃圾邮件被过滤掉,短信需要额外的花费。
- 复杂环境中非核心告警使用短信报警会使运维成本增加很多。
- 微信是大家很常用的交流工具,其提供了很好的第三方接口,我们可以加以利用,不仅能解决告警信息处理的及时性也能降低运维成本。
微信的第三方接口要求我们先申请一个企业号——传送门:https://qy.weixin.qq.com/
具体实现
一、如何操作企业号?
1.通讯录添加企业成员
我们要提前把成员信息添加进组织部门,必填项+手机号或者微信号,这样别人扫描二维码的时候才能成功关注企业号。
注意:这里有两个我们要用到信息,一个组织部门的ID,一个部门成员的账号(账号是自己手动指定的,不同于微信号,最好是字母加数字
2.应用中心创建应用
我们要在这里创建应用,因为要通过应用发送消息给部门成员
注意:这里要记住一个值,应用ID
3.给部门设置管理员
设置--->功能设置---->权限管理---->新建管理组
管理员必须事先已经关注了企业号,并且已经设置好邮箱地址
确定管理员可以读取通讯录,可以使用应用发消息。
注意:我们需要管理员的CorpID和Secret
二、如何调用微信接口?
我们要准备这些东西:
- 一个微信企业号
- 企业号已经被部门成员关注
- 企业号里有一个可以发消息的应用,一个授权管理员,可以使用该应用给成员发消息
我们要取到这些信息:
- 成员账号
- 组织部门ID
- 应用ID
- CropID Secret
调用微信接口需要一个调用接口的凭证:access_token
通过 :CropID 、Secret才能获取到access_token,但是获取到的token有效期为两分钟
微信企业号接口调试工具传送门:https://open.work.weixin.qq.com/wwopen/devtool/interface/combine
Shell脚本
使用:
curl -s -G url 获取 AccessToken
使用:
curl --data url 传送凭证调用企业号接口
zabbix会传递三个参数给脚本,$1是消息接收账号,$2报警标题,$3报警内容
#!/bin/bash
CropID='ax1a56e07fc*******'
Secret='XTzhuelr6-jmwGiIVxhjE95wW2uEILiv*************'
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F '"' '{print $4}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
function body() {
local int AppID=1
local UserID=$1
local PartyID=1
local Msg=$(echo "$@" | cut -d" " -f3-)
printf '{
'
printf ' "touser": "'"$UserID"'",
'
printf ' "toparty": "'"$PartyID"'",
'
printf ' "msgtype": "text",
'
printf ' "agentid": "'" $AppID "'",
'
printf ' "text": {
'
printf ' "content": "'"$Msg"'"
'
printf ' },
'
printf ' "safe":"0"
'
printf '}
'
}
/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL
三、脚本为什么要这样写?
因为微信企业号开放的端口有固定的格式限制
企业号支持的格式:http://qydev.weixin.qq.com/wiki/index.php?title=消息类型及数据格式
将脚本放入zabbix默认执行路径下:
mv weixin.sh /usr/lib/zabbix/alertscripts/
chown zabbix.zabbix weixin.sh
chmod +x weixin.sh
四、服务器端如何配置?
1、添加报警的媒介:
2、为用户添加媒介:
3、添加触发器动作
至此,已经全部设置完毕,手机上即可收到微信!
最终结果展示
收到的微信告警如下图所示: