zabbix 是很熟悉的东西,但是实际上博主已经跳过了这个东西,直接蹦到 Prometheus 去了
但是,存在即合理,当下公司用的是这个,那么用就用吧,zabbix发到钉钉告警。
那么我们也研究一下如何发到钉钉告警,而且好看一些
原理:
原理就是用 post 向钉钉机器人的 webhook 地址提交 Markdown 的 json 信息
首先我们要建立个钉钉群,然后在群中添加一个群机器人,这里就会有两个选择,一个是这个机器人只接受特定的词语,二是向机器人发送消息的机器的ip是固定的。
阿里云建议的是关键词:云监控、云服务、监控、Monitor、ECS、报警
当然,这里更加建议IP,IP是死的,报警里带关键词意味着发送内容被部分固定了。
如上,我们会得到一个钉钉机器人的Webhook地址:
1https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx
然后我们要准备一个发送的脚本,python很合适
1#!/usr/bin/env python
2#coding:utf-8
3
4#zabbix钉钉报警
5import requests,json,sys,os,datetime
6#说明:这里改为自己创建的机器人的webhook
7webhook="https://oapi.dingtalk.com/robot/send?access_token=xxxxxx"
8
9def log(info):
10 if os.path.isfile("/tmp/dingding.log") == False:
11 f = open(log_file, 'a+')
12 else:
13 f = open(log_file,'w+')
14 f.write(info)
15 f.close()
16
17def msg(text,user):
18 json_text= {
19 "msgtype": "markdown",
20 "markdown": {
21 "title": "zabbix monitor",
22 "text": text
23 },
24 "at": {
25 "atMobiles": [
26 user
27 ],
28 "isAtAll": False
29 }
30 }
31
32 headers = {'Content-Type': 'application/json'}
33 r=requests.post(url=webhook,data=json.dumps(json_text),headers=headers).json()
34 code = r["errcode"]
35 time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
36 if code == 0:
37 log(time + ":消息发送成功 返回码:" + str(code) + "\n")
38 else:
39 log(time + ":消息发送失败 返回码:" + str(code) + "\n")
40 exit(3)
41
42if __name__ == '__main__':
43 user = sys.argv[1] #用户
44 subject = sys.argv[2] #标题
45 text = sys.argv[3] #消息
46 msg(text,user)
我们把上面的文件内容放到 /usr/lib/zabbix/alertscripts 目录下,名字就叫做 dingding.py ,只能是这个目录,因为这是 zabbix 缺省外挂脚本文件的目录。
从上面代码里我们可以看到,实际是发送了一个 markdown 的文本,那么自然,各种markdown的语法就可以用起来了,仔细看一下钉钉markdown参数的详解:
可以根据自己需求来修改。
接下来我们配置Zabbix的告警配置
- 创建新的告警媒介:媒介类型选择脚本,提前将上方的脚本放置于
/usr/lib/zabbix/alertscripts
中并在脚本名称处填写你命名的文件名。
-
添加告警参数:这里用到了3个参数,第一个是
{ALERT.SENDTO}
告警对象,第二个是{ALERT.SUBJECT}
告警对象,第三个是{ALERT.MESSAGE}
告警正文,按照填写即可。ALERT.SENDTO}
#对应Python脚本中的,user=sys.argv1 。
{ALERT.SUBJECT}
#发送的信息的标题
{ALERT.MESSAGE}
#对应Python脚本中的,text=sys.argv3 。
-
增加Message type:一般增加3个就足够了,发现问题、问题恢复、问题更新,详细的设置在下方说明。
这里就是关键了:
发现问题的模板:
1![告警平台信息](http://www.rendoumi.com/fire.png) 2> * ##### 告警主机: {HOSTNAME1} 3> * ##### 告警时间: {EVENT.DATE} {EVENT.TIME} 4> * ##### 告警等级: {TRIGGER.SEVERITY} 5> * ##### 告警信息: {TRIGGER.NAME} 6> * ##### 告警项目: {TRIGGER.KEY1} 7> * ##### 问题详情: {ITEM.NAME}:{ITEM.VALUE} 8> * ##### 当前状态: {TRIGGER.STATUS}:{ITEM.VALUE1} 9> * ##### 事件ID: {EVENT.ID}
Problem recovery(问题恢复)的模板:
1![告警平台信息](http://www.rendoumi.com/recover.png) 2> * #### 警告解除:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME} 3> * ##### 告警持续时长: {EVENT.DURATION} 4> * ##### 告警主机: {HOST.NAME} 5> * ##### 告警信息: {EVENT.NAME} 6> * ##### 告警等级: {EVENT.SEVERITY} 7> * ##### 事件ID: {EVENT.ID} 8> * ##### {TRIGGER.URL}
有这两个就够了
-
创建动作(点击左边菜单的配置—>动作)
添加告警条件
添加 触发器示警度 大于等于 警告
操作,选择发送给Admin组,或者其他组。
在操作细节里,我们发送告警到Admin组,然后方式选dingding,这样就跟报警媒介联系起来了。
这样一轮轮的更新以后,就可以使用了。注意要研究Markdown的语法。另外提前准备好图片。
我们就得到一个跟阿里云告警一摸一样的东西了,说实话,好看,没有鸟用。