zabbix告警信息推送
实验介绍
zabbix 提供了丰富的报警媒介类型,包括短信、邮件、脚本等等,本实验就将采用自定义脚本调用微信接口,实现将告警信息以文本+监控趋势图推送至微信。
知识点
- 了解zabbix常用告警媒介,能创建脚本将zabbix消息推送至各个接收终端
- 掌握zabbix 监控趋势图如何获取
- 了解钉钉、微信如何注册企业版
- 掌握邮件、钉钉、微信接口调用方法,并能结合zabbix将告警消息推送出去
zabbix告警信息推送至微信
实现上述功能需要满足以下条件:
- zabbix server 能够访问 微信接口
- 注册微信企业号【注册200人以下企业微信号免费】
注册微信企业号
之所以采用微信企业号来推送消息,是因为微信企业号也指定推送接受人,相对更加安全,注册过程也非常简单,企业微信号注册地址,按照步骤一步步注册即可。
注册完成后,登陆微信企业号后台管理系统,找到“通讯录”,在公司名称处添加子部门,比如本实验中,添加了子部门“运维团队”,将需要的人员添加进去,选中“运维团队”,点击右侧虚线处,记住部门ID,后面的消息推送将会用到。
创建完成,再点击应用管理,微信企业号应用管理地址 , 找到“自建”,创建应用,名字可自定义,本实验中定义为“zabbix报警机器人”,可见范围选择前面所创建的“运维部门”,创建完成后,进入详情页,记住AgentId、Secret, 另外企业ID 可在“我的企业”中查找。
微信企业号接口调用
微信接口的调用,首先需要获取接口token,采用get方法,方式如下:
def get_access_token(corp_id, corp_secret):
"""
获取token
:return: token
"""
# corp_id, corp_secret 分别为企业ID、自建的应用密钥
get_token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s' % (
corp_id, corp_secret)
try:
r = requests.get(get_token_url)
request_json = r.json()
access_token = request_json['access_token']
with open('/tmp/.access_token.txt', 'w') as f:
f.write(access_token)
return access_token
except Exception as err:
print("获取token失败,详情: " + str(err))
微信支持发送多种消息的类型,如文本、图片、语音、图文等等消息类型,本实验中需要发送文本以及图片类型的消息,因此最理想的是采用发送“图文消息”类型的消息,但官方称每个应用每天最多可以发送100次,因此实际上并不适用,本实验中采用文本类型+图片类型的组合模式。
发送文本消息类型
请求参数:
参数 | 必须 | 说明 |
---|---|---|
touser | 否 | 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送 |
toparty | 否 | 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数 |
totag | 否 | 标签ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数 |
msgtype | 是 | 消息类型,此时固定为:text (支持消息型应用跟主页型应用) |
agentid | 是 | 企业应用的id,整型。可在应用的设置页面查看 |
content | 是 | 消息内容,最长不超过2048个字节,注意:主页型应用推送的文本消息在微信端最多只显示20个字(包含中英文) |
safe | 否 | 表示是否是保密消息,0表示否,1表示是,默认0 |
调用案例:
def text_message(toparty, agent_id, message):
"""
发送message 消息
默认尝试5次,间隔1秒
"""
times = 5
# token 可根据前面的get_access_token 方法获取
apiurl = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % token
while times:
try:
params = {
"toparty": toparty,
"msgtype": "text",
"agentid": agent_id,
"text": {
"content": message
},
"safe": 0
}
r = requests.post(apiurl, data=json.dumps(params))
# 判断是否发送成功,如不成功则跑出异常,让其执行异常处理里的函数
request_json = r.json()
errmsg = request_json['errmsg']
if errmsg != 'ok':
raise
else:
print('post success %s ' % r.text)
# 消息成功发送,停止循环