前面我们讲到了Zabbix的邮件告警的相关内容,效果也还不错,但是唯一的缺点就是不具备及时性,当然还有另外一种短信告警,具备及时性高、无需要网络也能告警的特点,唯一的缺点就是收费,那么有没有一种能够白嫖的方式呢?当然有,就是今天利用企业微信的方式告警。不过该方式有一个比较重要的前提,Zabbix server需要有访问外网的能力,接收端也需要有访问互联网的能力。
正文
测试环境
Zabbix版本为5.2.3,Python版本为2/3
企业微信
目前企业微信已经可以开放给个人申请了,进入企业微信官网,只需要完成以下几步即可。
脚本内容
脚本里根据上面企业微信的操作替换几个地方,分别是toparty、agentid、corpid、corpsecret即可
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)
Python3
#!/usr/bin/python3
#_*_coding:utf-8 _*_
import urllib.request
import json
import sys
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 = '修改为你的corpid'
corpsecret = '修改成你的corpsecret'
accesstoken = gettoken(corpid,corpsecret)
senddata(accesstoken,user,subject,content)
脚本导入
将脚本导入指定目录,那么目录在哪呢?可以查询你的zabbix server配置文件。
cat /etc/zabbix/zabbix_server.conf | grep AlertScriptsPath
复制上面的脚本到文件里
vim wechat2.py
###添加脚本内容进去###
vim wechat3.py
###添加脚本内容进去###
添加执行权限
chmod +x wechat2.py
chmod +x wechat3.py
修改文件所属用于
chown zabbix:zabbix wechat2.py
chown zabbix:zabbix wechat3.py
脚本测试
./wechat2.py 1 1 1
./wechat3.py 1 1 1
有很多同学在执行测试的时候会遇到下图问题,原因其实很简单,因为你的python要么没装,要没路径不对
查询python位置
whereis python
这里看出我并没有python,所以需要安装,CentOS7的朋友注意,7里的Python2和Python3要共存需要别的方法,所以建议用pyhton2(默认自带),CentOS8则可以利用DNF直接安装。
dnf -y install python2
dhf -y install python3
再进行测试
Zabbix Server调用脚本
1.创建告警媒介
2.填入相关参数,脚本名称一定对应好,包括后缀,传递参数分别为{ALERT.SENDTO},{ALERT.SUBJECT},{ALERT.MESSAGE},填好确定即可。
3.测试脚本
4.创建动作
动作可以针对主机、主机组、触发器等等,可以自行研究,我就不写那么细了。
5.用户媒介定义
点击进入下图用户
模拟故障
将监控的交换机的VLAN1进行shutdown操作
如何使用公众号类型告警
当然有朋友会问,这还得需要下载软件,太麻烦了,所以企业微信提供了一个解决方案,就是类似于公众号推送。
1.打开企业微信后台,用手机微信关注下图的二维码
总结
整个微信告警部分其实最难就是这里,相反机器人告警的方式比较简单,只需要调用API即可,不需要改这么复杂的参数,后续我会补充钉钉和微信机器人的告警,当然飞书的也可以,看你们的意愿,通过和一些网上同学聊天,他们遇到的问题其实还是没有用心去理解这么做的一些含义,我不可能每一个都讲一遍,那样篇幅太长,所以在测试的时候要思考一些问题发生原因,很多问题在互联网上是可以找到的,最后路漫漫其修远兮,吾将上下而求索,祝大家新年快乐!