zabbix 钉钉报警脚本

添加告警媒介

脚本配置

打开钉钉机器人 添加机器人 自定义机器人

dingding_robot

登录zabbix服务器查看zabbix 报警脚本的位置

1
cat /etc/zabbix/zabbix_server.conf |grep AlertScriptsPath
2
### Option: AlertScriptsPath
3
# AlertScriptsPath=${datadir}/zabbix/alertscripts
4
AlertScriptsPath=/usr/lib/zabbix/alertscripts

放入zabbix报警脚本路径

1
cat /usr/lib/zabbix/alertscripts/test_ddmkrobot.py

点击下载

1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
# @File  : test.py
4
# @Author: becivells
5
#@Contact : becivells@gmail.com
6
# @Date  : 2018/9/27
7
#@Software : PyCharm
8
# @Desc  :zabbix 告警 仅仅支持markdown
9
10
'''
11
--webhook=dingding webhook
12
--sendto={ALERT.SENDTO}
13
--subject={ALERT.SUBJECT}
14
--message={ALERT.MESSAGE}
15
--log=dingding.log
16
17
18
测试
19
--webhook=https://oapi.dingtalk.com/robot/send?access_token=&+*****  --sendto=tel --subject=test --message="**hehe**" --log test.log
20
21
服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
22
23
**告警主机:** {HOST.NAME}
24
**告警地址:** {HOST.IP}
25
**告警时间:** {EVENT.DATE} {EVENT.TIME}
26
**监控项目:** {ITEM.NAME}
27
**监控取值:** {ITEM.LASTVALUE}
28
**告警等级:** {TRIGGER.SEVERITY}
29
**当前状态:** {TRIGGER.STATUS}
30
**告警信息:** {TRIGGER.NAME}
31
**确认状态:** {EVENT.ACK.STATUS}
32
**事件ID:** {EVENT.ID}
33
34
35
{TRIGGER.STATUS}: {TRIGGER.NAME}
36
37
**## 故障恢复提示**
38
**事件名称:** {TRIGGER.NAME}
39
**事件状态:** {TRIGGER.STATUS}
40
**事件等级:** {TRIGGER.SEVERITY}
41
**事件ID:** {EVENT.ID}
42
**事件链接:** {TRIGGER.URL}
43
44
**事件列表:**
45
1. {ITEM.NAME1}({HOST.NAME1}:{ITEM.KEY1}): {ITEM.VALUE1}
46
2. {ITEM.NAME2}({HOST.NAME2}:{ITEM.KEY2}): {ITEM.VALUE2}
47
3. {ITEM.NAME3}({HOST.NAME3}:{ITEM.KEY3}): {ITEM.VALUE3}
48
'''
49
50
import os
51
import sys
52
import json
53
import logging
54
import argparse
55
56
import requests
57
58
def parse_cmd_args():
59
    '''处理命令行选项
60
    '''
61
    parser = argparse.ArgumentParser(
62
        prog='dingding robot',
63
        description='dingidng robot send message for zabbix')
64
65
    parser.add_argument("--webhook", dest='webhook',
66
                        action="store",required=True,
67
                        help="dingding webhook")
68
69
    parser.add_argument("--sendto", dest='sendto',
70
                        action="store",required=True,
71
                        help="msg sendto")
72
73
    parser.add_argument("--subject", dest='subject',
74
                        action="store",required=True,
75
                        help=("mesage title"))
76
77
    parser.add_argument("--message", action="store",
78
                        required=True,dest='message',
79
                        help="send message")
80
81
    parser.add_argument("--log", action="store",required=True,
82
                       dest='log',help="log save path")
83
84
85
    args = parser.parse_args()
86
    return args
87
88
def dingding_markdown_msg(webhook,sendto,subject,message):
89
    '''钉钉markdown格式消息报警'''
90
    headers = {'Content-Type': 'application/json;charset=utf-8'}
91
    json_text= {
92
     "msgtype": "markdown",
93
        "at": {
94
            "atMobiles": [
95
                sendto
96
            ],
97
            "isAtAll": False
98
        },
99
        "markdown": {
100
            "title":subject,
101
            "text": message
102
        }
103
    }
104
    try:
105
        info = requests.post(webhook,json.dumps(json_text),headers=headers).content
106
        logging.info('sendto: %s,subject: %s,message: %s,info: %s'%
107
                     (sendto,subject,message,info))
108
    except Exception as e:
109
        logging.error('sendto: %s,subject: %s,message: %s,info: %s'%
110
                      (sendto,subject,message,str(e)))
111
112
113
if __name__ == '__main__':
114
    args_msg = parse_cmd_args()
115
    log_path = '/tmp/'+ os.path.basename(args_msg.log)
116
    logging.basicConfig(level=logging.DEBUG,
117
                        format='%(asctime)s %(thread)d %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
118
                        datefmt='%a, %d %b %Y %H:%M:%S',
119
                        filename=log_path,
120
                        filemode='a'
121
                        )
122
    dingding_markdown_msg(args_msg.webhook,args_msg.sendto,
123
                          args_msg.subject,args_msg.message)

登录zabbix web端

管理 >> 报警媒介类型 >> 创建媒体类型

zabbix报警

创建报警

触发后脚本要发送的消息格式

创建动作

创建报警动作

添加触发条件

报警动作操作

1
服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
2
3
**告警主机:** {HOST.NAME}   
4
**告警地址:** {HOST.IP}   
5
**告警时间:** {EVENT.DATE} {EVENT.TIME}   
6
**监控项目:** {ITEM.NAME}   
7
**监控取值:** {ITEM.LASTVALUE}   
8
**告警等级:** {TRIGGER.SEVERITY}   
9
**当前状态:** {TRIGGER.STATUS}   
10
**告警信息:** {TRIGGER.NAME}   
11
**确认状态:** {EVENT.ACK.STATUS}   
12
**事件ID:** {EVENT.ID}

操作新的

告警操作

1-1 报警一次 1-0 一直报警 不断的发消息。持续的发消息

恢复后脚本要发送的消息格式

恢复操作

1
{TRIGGER.STATUS}: {TRIGGER.NAME}
2
3
# **故障恢复提示**    
4
**事件名称:** {TRIGGER.NAME}   
5
**事件状态:** {TRIGGER.STATUS}   
6
**事件等级:** {TRIGGER.SEVERITY}   
7
**事件ID:** {EVENT.ID}   
8
**事件链接:** {TRIGGER.URL}   
9
10
**事件列表:**    
11
1. {ITEM.NAME1}({HOST.NAME1}:{ITEM.KEY1}): {ITEM.VALUE1}

到此报警消息还是发不出去的。用户需要增加报警信息

为用户添加告警媒介

用户报警媒介添加

关掉一台服务器看看

微信图片_20180928094226

最后测试报警信息和恢复信息是否能正常发送,如果发送不成功请查看错误日志。消息未发送有可能是钉钉脚本日志问题。检查权限是否为zabbix用户