Zabbix 5.2.3 实现企业微信告警
前面发过 Zabbix 5.2.3 实现邮件告警的文章,效果可以,缺点就是通知不具备及时性,今天利用企业微信的通知方式及时告警。不过需要Zabbix server有访问外网的能力,接收端也需要有访问互联网的能力。
当前环境
Zabbix版本为5.2.3,Python版本为3 CentOS 8
脚本内容
python3脚本里根据上面企业微信的操作替换几个地方,分别是toparty、agentid、corpid、corpsecret即可.
#!/usr/bin/python3
#_*_coding:utf-8 _*_
import urllib.request
import json
import sys
#reload(sys)
#sys.setdefaultencoding('utf-8')
def gettoken(corpid,corpsecret):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + corpsecret
print (gettoken_url)
try:
token_file = urllib.request.urlopen(gettoken_url)
except urllib.error.HTTPError as e:
print (e.code)
print (e.read().decode("utf8"))
sys.exit()
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
def senddata(access_token,user,subject,content):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
send_values = {
"touser":"$1",
"toparty":"1",
"msgtype":"text",
"agentid":"1000002",
"text":{
"content":subject + '\n' + content
},
"safe":"0"
}
# send_data = json.dumps(send_values, ensure_ascii=False)
send_data = json.dumps(send_values, ensure_ascii=False).encode('utf-8')
send_request = urllib.request.Request(send_url, send_data)
response = urllib.request.urlopen(send_request)
msg = response.read()
print ("returned value : " + str(msg))
if __name__ == '__main__':
user = str(sys.argv[1])
subject = str(sys.argv[2])
content = str(sys.argv[3])
corpid = 'ww57e54667a11baae7'
corpsecret = 'stq8p8yVFRJRsFe43R44RWaU6ZYs0PuJ-_bYWQDnFzU'
accesstoken = gettoken(corpid,corpsecret)
senddata(accesstoken,user,subject,content)
python2脚本内容
#!/usr/bin/python2
#_*_coding:utf-8 _*_
import urllib,urllib2
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def gettoken(corpid,corpsecret):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + corpsecret
print gettoken_url
try:
token_file = urllib2.urlopen(gettoken_url)
except urllib2.HTTPError as e:
print e.code
print e.read().decode("utf8")
sys.exit()
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
def senddata(access_token,user,subject,content):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
send_values = {
"touser":"$1",
"toparty":"12",
"msgtype":"text",
"agentid":"1000011",
"text":{
"content":subject + '\n' + content
},
"safe":"0"
}
send_data = json.dumps(send_values, ensure_ascii=False).encode('utf-8')
send_request = urllib2.Request(send_url, send_data)
response = json.loads(urllib2.urlopen(send_request).read())
print str(response)
if __name__ == '__main__':
user = str(sys.argv[1])
subject = str(sys.argv[2])
content = str(sys.argv[3])
corpid = '修改成你的corpid'
corpsecret = '修改成你的corpsecret'
accesstoken = gettoken(corpid,corpsecret)
senddata(accesstoken,user,subject,content)
并将脚本放在AlertScriptsPath目录下并修改权限及所属者。AlertScriptsPath目录可在Zabbix server配置文件里查看(或者通过命令:find / -name alertscripts 查找)。
修改文件所属用于
chown zabbix:zabbix wechat.py
添加执行权限
chmod +x wechat.py
脚本测试
./wechat.py 1 1 1
企业微信
目前企业微信已经可以开放给个人申请了,进入企业微信官网,只需要完成以下几步即可。
Zabbix Server调用脚本
1.创建告警媒介
2.填入相关参数,脚本名称一定对应好,包括后缀,传递参数分别为{ALERT.SENDTO},{ALERT.SUBJECT},{ALERT.MESSAGE},填好确定即可。
3.测试脚本
4.创建动作
动作可以针对主机、主机组、触发器等等。
5.用户媒介定义
点击进入下图用户
模拟故障
将监控的交换机的VLAN1进行shutdown操作
如何使用微信公众号类型告警
当然有朋友会问,这还得需要手机上安装企业微信,太麻烦了,所以企业微信提供了一个解决方案,就是类似于公众号推送。
1.打开企业微信后台,用手机微信关注下图的二维码