本文利用企业微信的方式告警。不过该方式有一个比较重要的前提,Zabbix Server 需要有访问外网的能力,接收端也需要有访问互联网的能力。
正文
本文环境为 python3,python2 的环境自行测试,如遇到问题可以及时与我联系。
本文环境
- Zabbix Server 6.0 LTS RC2
- Python 3
企业微信部分
登录企业微信后台
在应用管理菜单选择创建应用
这里需要设置可见范围
创建完成后,可以查看AgentId,Secret 需要登录客户端或者移动客户端查看
那么自此我们应该得到的有四个信息
- corpid
- corpsecret
- agentid
- 部门 ID
代码部分
根据上述的部分我们需要修改脚本四个信息
- Python2
- Python3
#!/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":"修改成您的部门 ID",
"msgtype":"text",
"agentid":"修改成您的 agentid",
"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)
代码语言:javascript复制#!/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":"修改成您的部门 ID",
"msgtype":"text",
"agentid":"修改成您的 agentid",
"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)
复制脚本到您的系统
默认 CentOS 7 为 python2,CentOS 8 为 python3 创建一个 wechat.txt 文件,这么做是避免 Windows 与 Linux 的编码格式问题
代码语言:javascript复制touch wechat.txt
vim wechat.txt
完成修改后,将文件后缀改为py结尾
代码语言:javascript复制mv wechat.txt wechat.py
测试脚本
先给执行权限,随后执行脚本查看状态
代码语言:javascript复制chmod x wechat.py
./wechat.py 1 1 1
Zabbix部分
查询告警脚本目录
默认配置该目录是注释的(如下图),建议将注释取消掉,然后重启 Zabbix Server 服务。
代码语言:javascript复制cat /etc/zabbix/zabbix_server.conf | grep AlertScriptsPath
移动脚本到指定目录
代码语言:javascript复制mv wechat.py /usr/lib/zabbix/alertscripts
Zabbix 前端部分
创建告警媒介路径为 管理 –> 报警媒介类型 –> 创建报警媒介类型
报警媒介配置
首先类型选择脚本,名称自己定义,脚本名称为放入指定目录的脚本名称,一定要对应,脚本参数和 python 里的顺序一一对应,python 里有三个参数 分别是 user <–> {ALERT.SENDTO}, subject <–> {ALERT.SUBJECT},content <–> {ALERT.MESSAGE},后面的宏为固定值。
前端的变量与后端脚本有紧密联系,如果 Python 脚本传参部分(sys.argv[])只有两个,就只需要写两个即可。
进入到 Message templates 里面(这里的作用为消息通知模板,包含一些变量,也就是需要告警包含哪些内容,不填写会出现告警失败),创建通知模板,点击添加,默认就有一些自带的模板,这里也可以不用设置,在后面的动作里可以创建自定义消息模板,关于美化可以参考后续文章美化篇。
测试脚本可用性
进入告警媒介类型选项,找到刚刚创建的企业微信小程序,点击测试
这里收件人、主题、消息都可以随便写,然后点击测试
当出现下图结果即为正常
模拟告警流程测试
用户部分授权
路径为 管理 –> 用户 –> 点击 Admin 用户 –> 报警媒介 –> 添加 选择类型为刚才创建的告警类型媒介,收件人随便填写,启用和告警级别根据自身情况填写。
找到报警媒介,点击添加,类型找到之前告警媒介类型里的企业微信小程序,收件人随便填写,这步骤不做告警产生的时候会报错,提示无用户定义,告警发送失败
创建动作
路径为 配置 –> 动作 –> 触发器动作 –> 创建动作
进入动作里,条件有很多类型可以选择,根据自身情况灵活定制,本文以主机群组为条件。
在操作细节里不具体展开,步骤在后续告警升级里会详细展开,本文以用户群组为基础,仅送到企业微信小程序为示例,这里大家可以根据实际情况调整,Custom message 部分在前面告警类型里已经创建了通知模板,这里可以不需要创建,优先级:操作细节里的自定义消息>告警类型里的模板。
这里需要注意的是模板必须存在,不然一样告警会出现失败,如果出现媒介未定义,就是整个问题。
模拟告警
创建虚拟主机
这里建一个无法 ping 通的主机,由于前面选择的条件为主机组,所以这里需要加入到 Zabbix Server 主机组,仅为演示,根据自身情况再调整,模板选择 ICMP Ping(在 Templates/Modules 下)
模拟告警
由于无法 ping 通,等待一段时间前端应该会出现 Unavailable by ICMP ping 的告警,也有相应的动作,灰色代表正常,如果是红色代表发送失败,具体可以分析下原因。
效果
如果需要在手机查看,需要关注二维码,否则只能在企业微信里查看。
写在最后
整个微信告警部分其实最难就是小程序部分,需要调整的参数比较多,相反机器人告警的方式比较简单,只需要调用机器人的 webhook 地址即可,后续我会补充微信机器人的告警,通过和一些网上朋友聊天,他们遇到的问题其实还是没有用心去理解这么做的一些含义,当然还有就是对 python 的不太熟悉的缘故,在测试的时候要思考一些问题发生的原因,很多问题在互联网上是可以找到的,最后路漫漫其修远兮,吾将上下而求索,祝大家新年快乐!