添加告警媒介
脚本配置
打开钉钉机器人 添加机器人 自定义机器人
登录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端
管理 >> 报警媒介类型 >> 创建媒体类型
触发后脚本要发送的消息格式
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} |
到此报警消息还是发不出去的。用户需要增加报警信息
为用户添加告警媒介
关掉一台服务器看看
最后测试报警信息和恢复信息是否能正常发送,如果发送不成功请查看错误日志。消息未发送有可能是钉钉脚本日志问题。检查权限是否为zabbix用户