前言
Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告警的及时处理。
企业微信准备
申请微信号就不多说了
机器人准备
应用管理->创建应用
主要信息
Agentld + Secret + 企业ID号 + 部门ID
示例:
Agentld:1000002
Secret:7c95nJWIzT4Jd0zDWWQXgaZm0
企业ID号:ww90ee3eaf907134f4
部门ID:2
截图展示
接口调试
进入API-开发者工具:
https://open.work.weixin.qq.com/wwopen/devtool/interface/combine
Python监控脚本
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib,urllib2,json
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
class WeChat(object):
__token_id = ''
# init attribute
def __init__(self,url):
self.__url = url.rstrip('/')
self.__corpid = 'ww90ee3eaf907134fb'
self.__secret = 'L4R46vyMPSGnCQ1jc07c95nJWIzT4Jd0zDWWQXgaZm0'
# Get TokenID
def authID(self):
params = {'corpid':self.__corpid, 'corpsecret':self.__secret}
data = urllib.urlencode(params)
content = self.getToken(data)
try:
self.__token_id = content['access_token']
# print content['access_token']
except KeyError:
raise KeyError
# Establish a connection
def getToken(self,data,url_prefix='/'):
url = self.__url + url_prefix + 'gettoken?'
try:
response = urllib2.Request(url + data)
except KeyError:
raise KeyError
result = urllib2.urlopen(response)
content = json.loads(result.read())
return content
# Get sendmessage url
def postData(self,data,url_prefix='/'):
url = self.__url + url_prefix + 'message/send?access_token=%s' % self.__token_id
request = urllib2.Request(url,data)
try:
result = urllib2.urlopen(request)
except urllib2.HTTPError as e:
if hasattr(e,'reason'):
print 'reason',e.reason
elif hasattr(e,'code'):
print 'code',e.code
return 0
else:
content = json.loads(result.read())
result.close()
return content
# send message
def sendMessage(self,touser,message):
self.authID()
data = json.dumps({
'touser':touser,
'toparty':2,
'msgtype':"text",
'agentid':"1000002",
'text':{
'content':message
},
'safe':"0"
},ensure_ascii=False)
response = self.postData(data)
print response
if __name__ == '__main__':
a = WeChat('https://qyapi.weixin.qq.com/cgi-bin')
a.sendMessage(sys.argv[1],sys.argv[3])
修改
需要修改的四处信息,改为自己的
self.__corpid = 'wwa1da242f211cdf47' //公司的corpid
self.__secret = 'rIrN51FEjgW6T2bdmSaEoOIB5UbaBTgddQkuC8cca1w' //应用的secret
'toparty':2, //部门id
'agentid':"1000002", //应用id
添加执行权限
chmod +x wechat.py
测试脚本
python2 wechat.py Lianglaifu test test 微信名字
需要注意的是:这里使用的python2
放入指定位置
将脚本放入配置文件指定位置,可自行修改
vim /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts
查看微信
创建报警媒介
管理->报警媒介类型->创建媒体类型
脚本参数
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
创建报警用户
管理->用户->创建用户
群组可以单独设置,也可以加入管理员组
配置报警动作
配置->动作->创建动作
动作以及操作根据自己需求填写
报警模版
告警
服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
告警主机:{HOST.NAME}
告警信息:{TRIGGER.NAME}
告警项目:{ITEM.NAME}
告警时间:{EVENT.DATE}_{EVENT.TIME}
当前状态:故障 值={ITEM.VALUE}
故障已持续{EVENT.AGE},请尽快处理
事件ID:{EVENT.ID}
恢复
服务器:{HOST.NAME}: {TRIGGER.NAME}已恢复!
恢复主机:{HOST.NAME}
恢复信息:{TRIGGER.NAME}
恢复项目:{ITEM.NAME}
故障时间:{EVENT.DATE}_{EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE}_{EVENT.RECOVERY.TIME}
当前状态:{TRIGGER.STATUS} 值={ITEM.VALUE}
故障共持续{EVENT.AGE}
事件ID:{EVENT.ID}
更新
确认信息:"{ACK.MESSAGE}"
服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
确认人:{USER.FULLNAME}
时间:{ACK.DATE} {ACK.TIME}
当前的问题是: {TRIGGER.NAME}
时间ID:{EVENT.ID}