Zabbix下发往钉钉告警

zabbix 是很熟悉的东西,但是实际上博主已经跳过了这个东西,直接蹦到 Prometheus 去了

但是,存在即合理,当下公司用的是这个,那么用就用吧,zabbix发到钉钉告警。

那么我们也研究一下如何发到钉钉告警,而且好看一些

原理:

原理就是用 post 向钉钉机器人的 webhook 地址提交 Markdown 的 json 信息

首先我们要建立个钉钉群,然后在群中添加一个群机器人,这里就会有两个选择,一个是这个机器人只接受特定的词语,二是向机器人发送消息的机器的ip是固定的。

阿里云建议的是关键词:云监控、云服务、监控、Monitor、ECS、报警

image-20221130195533865

当然,这里更加建议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参数的详解:

img

可以根据自己需求来修改。

接下来我们配置Zabbix的告警配置

  • 创建新的告警媒介:媒介类型选择脚本,提前将上方的脚本放置于/usr/lib/zabbix/alertscripts中并在脚本名称处填写你命名的文件名。

image-20221130202403729

  • 添加告警参数:这里用到了3个参数,第一个是{ALERT.SENDTO}告警对象,第二个是{ALERT.SUBJECT}告警对象,第三个是{ALERT.MESSAGE}告警正文,按照填写即可。

    ALERT.SENDTO}

    #对应Python脚本中的,user=sys.argv1

    {ALERT.SUBJECT}

    #发送的信息的标题

    {ALERT.MESSAGE}

    #对应Python脚本中的,text=sys.argv3

image-20221130202515847

  • 增加Message type:一般增加3个就足够了,发现问题、问题恢复、问题更新,详细的设置在下方说明。

    image-20221130203406737

    这里就是关键了:

    发现问题的模板:

    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}
    

    有这两个就够了

  • 创建动作(点击左边菜单的配置—>动作)

    image-20221130204220981

    添加告警条件

    image-20221130204324423

    添加 触发器示警度 大于等于 警告

image-20221130204451489

操作,选择发送给Admin组,或者其他组。

image-20221130204704354

在操作细节里,我们发送告警到Admin组,然后方式选dingding,这样就跟报警媒介联系起来了。

image-20221130205304248

这样一轮轮的更新以后,就可以使用了。注意要研究Markdown的语法。另外提前准备好图片。

我们就得到一个跟阿里云告警一摸一样的东西了,说实话,好看,没有鸟用。

image-20221130204921458


Kubernetes使用nfs做持久化卷存储
Sed中的正则表达式用法
comments powered by Disqus