Zabbix添加企业微信告警通知
企业微信部分
登录企业微信后台获取企业ID
在应用管理菜单选择创建应用
创建完成后,可以查看AgentId,Secret 需要登录客户端或者移动客户端查看
获取部门ID
那么自此我们应该得到的有四个信息
corpid
corpsecret
agentid
部门 ID
代码部分
根据上述的部分我们需要修改脚本四个信息
#!/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)
测试脚本
先给执行权限,随后执行脚本查看状态
chmod +x wechat.py
./wechat.py 1 1 1
Zabbix部分
查询告警脚本目录
默认配置该目录是注释的(如下图),建议将注释取消掉,然后重启 Zabbix Server 服务。
cat /etc/zabbix/zabbix_server.conf | grep AlertScriptsPath
移动脚本到指定目录
mv wechat.py /usr/lib/zabbix/alertscripts
Zabbix 前端部分
创建告警媒介路径为 告警 –> 媒介 –> 创建报警媒介类型
报警媒介配置
首先类型选择脚本,名称自己定义,脚本名称为放入指定目录的脚本名称,一定要对应,脚本参数和 python 里的顺序一一对应,python 里有三个参数 分别是 user <–> {ALERT.SENDTO}, subject <–> {ALERT.SUBJECT},content <–> {ALERT.MESSAGE},后面的宏为固定值。前端的变量与后端脚本有紧密联系,如果 Python 脚本传参部分(sys.argv[])只有两个,就只需要写两个即可。
测试脚本可用性
进入告警媒介类型选项,找到刚刚创建的企业微信小程序,点击测试
当出现下图结果即为正常
模拟告警流程测试
用户部分授权
路径为 用户 –> 用户 –> 点击 Admin 用户 –> 报警媒介 –> 添加
选择类型为刚才创建的告警类型媒介,收件人填写all,启用和告警级别根据自身情况填写。
找到报警媒介,点击添加,类型找到之前告警媒介类型里的企业微信告警通知,收件人all,这步骤不做告警产生的时候会报错,提示无用户定义,告警发送失败
创建动作
路径为 告警 –> 动作 –> 触发器动作 –> 创建动作
故障通知模板
标题:
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
消息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
恢复通知模板
标题:
恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
消息
告警主机:{HOSTNAME1}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
故障更新模板
标题:
服务器:{HOST.NAME}: 报警确认
消息
确认人:{USER.FULLNAME}
时间:{ACK.DATE} {ACK.TIME}
确认信息如下:
"{ACK.MESSAGE}"
问题服务器IP:{HOSTNAME1}
问题ID:{EVENT.ID}
当前的问题是: {TRIGGER.NAME}