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>

 

效果图如下:

3条评论

我亦飘零久 says:

请问下xml格式的设置入口是在哪里?3、创建动作:配置>>动作

这个吗?

迷城 says:

是的。

菜鸟 says:

大佬牛批

发表评论