Zabbix实现钉钉告警通知,支持@多人功能
需求:
Zabbix告警通知发送到钉钉群组, 以下是DingDing Python代码。 版本: Zabbix3.4 Python3.6
钉钉报警时基于zabbix,访问钉钉应用接口去推送的报警消息,所以我们需要一个在钉钉创建一个报警应用。
二、Zabbix配置
1、创建脚本
vim /usr/local/zabbix/alertscripts/dingding_text.py #!/usr/bin/env python # -*- coding: UTF-8 -*- """ Author: yu.jiang Email: safemonitor@outlook.com Time: 2018/09/04 Describe:钉钉告警机器人,支持@多个用户, 传递参数$1为信息内容、$2表示要通知的钉钉用户 Usage: python dingding.py 这是一条测试信息 "152055xxxx","15088xxxx","187551xxxx" """ import requests import json import sys import os import datetime # 告警通知用户列表, 多个用户以逗号分隔. 此规则为固定列表、不支持zabbix自定义通知用户 Alarm_User_List = '15205xxxx','15088xxxxx' headers = {'Content-Type': 'application/json;charset=utf-8'} # 个人群组: 监控报警 api_url = 'https://oapi.dingtalk.com/robot/send?access_token=39a138424fb6009804981dc57374e7c649e0e74d94971a57648eaba8e' def msg(text): json_text = { "msgtype": "text", "at": { "atMobiles": at_user, "isAtAll": False #为True表示@所有人 }, "text": { "content": text } } notice = requests.post(api_url, json.dumps(json_text), headers=headers).content print json.loads(notice) # 增加日志打点功能 if os.path.exists("/var/log/dingding.log"): f=open("/var/log/dingding.log","a+") else: f=open("/var/log/dingding.log","w+") f.write("\n"+"--"*60) if json.loads(notice)["errcode"] == 0: f.write("\n"+str(datetime.datetime.now())+" "+str(at_user)+" "+"发送成功"+"\n"+str(text)+"\n"+"--"*60) f.close() else: f.write("\n"+str(datetime.datetime.now()) + " " + str(at_user) + " " + "发送失败" + "\n" + str(text)+"\n"+"--"*60) f.close() if __name__ == '__main__': text = sys.argv[1] # 固定列表通知用户选项 # try: # at_user = (Alarm_User_List).split(',') # except IndexError as e: # at_user = [] # 此处支持zabbix自定义脚本参数, $1 {ALERT.MESSAGE}, $2 {ALERT.SENDTO} try: at_user = sys.argv[2].split(',') except IndexError as e: at_user = [] msg(text)
二、Zabbix web 界面设置
1、添加报警脚本到zabbix:管理>>报警媒介类型
脚本参数如下:
{ALERT.MESSAGE} {ALERT.SENDTO}
2、创建用户:管理>>用户
3、创建动作:配置>>动作
操作:
{TRIGGER.STATUS}: {HOSTNAME1} {TRIGGER.NAME} ! {TRIGGER.STATUS}: {TRIGGER.NAME} ! ---------------------------------- 告警主机: {HOSTNAME1} 主机地址: {HOST.IP} 告警等级: {TRIGGER.SEVERITY} 监控项目: {TRIGGER.KEY1} 问题详情: {ITEM.NAME}:{ITEM.VALUE} 当前状态: {TRIGGER.STATUS}: {ITEM.VALUE1} 告警信息: {TRIGGER.NAME} 告警时间: {EVENT.DATE} {EVENT.TIME} 事件ID: {EVENT.ID}
恢复操作:
{TRIGGER.STATUS}: {HOSTNAME1} {TRIGGER.NAME} ! {TRIGGER.STATUS}: {TRIGGER.NAME} ! ---------------------------------- 告警主机: {HOSTNAME1} 主机地址: {HOST.IP} 告警等级: {TRIGGER.SEVERITY} 监控项目: {TRIGGER.KEY1} 问题详情: {ITEM.NAME}:{ITEM.VALUE} 当前状态: {TRIGGER.STATUS}: {ITEM.VALUE1} 告警信息: {TRIGGER.NAME} 告警时间: {EVENT.DATE} {EVENT.TIME} 事件ID: {EVENT.ID}
事件确认操作:
Acknowledged: {TRIGGER.NAME} {USER.FULLNAME} acknowledged problem at {ACK.DATE} {ACK.TIME} with the following message: {ACK.MESSAGE} Current problem status is {EVENT.STATUS}
4、进行钉钉报警测试
python dingding.py 这次一条测试告警! 1507788xxxx #手动测试
XML格式
操作:
<?xml version="1.0" encoding="UTF-8" ?> <root> <from>{HOSTNAME1}</from> <time>{EVENT.DATE} {EVENT.TIME}</time> <level>{TRIGGER.SEVERITY}</level> <name>{TRIGGER.NAME}</name> <key>{TRIGGER.KEY1}</key> <value>{ITEM.VALUE}</value> <now>{ITEM.LASTVALUE}</now> <id>{EVENT.ID}</id> <ip>{HOST.IP}</ip> <color>FFE61A1A</color> <url>http://60.205.249.122:5521</url> <age>{EVENT.AGE}</age> <status>{EVENT.STATUS}</status> <acknowledgement> {EVENT.ACK.STATUS} </acknowledgement> <acknowledgementhistory> {EVENT.ACK.HISTORY}</acknowledgementhistory> </root>
恢复操作:
<?xml version="1.0" encoding="UTF-8" ?> <root> <from>{HOSTNAME1}</from> <time>{EVENT.DATE} {EVENT.TIME}</time> <level>{TRIGGER.SEVERITY}</level> <name>{TRIGGER.NAME}</name> <key>{TRIGGER.KEY1}</key> <value>{ITEM.VALUE}</value> <now>{ITEM.LASTVALUE}</now> <id>{EVENT.ID}</id> <ip>{HOST.IP}</ip> <color>FF4A934A</color> <url>http://60.205.249.122:5521</url> <age>{EVENT.AGE}</age> <recoveryTime>{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}</recoveryTime> <status>OK</status> </root>
效果图如下:
请问下xml格式的设置入口是在哪里?3、创建动作:配置>>动作
这个吗?
是的。
大佬牛批