2

Zabbix下发往钉钉告警

 1 year ago
source link: https://bajie.dev/posts/20221130-zabbix_dingding/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Zabbix下发往钉钉告警

2022-11-30 3 分钟阅读

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

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

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

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

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

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

image-20221130195533865

当然,这里更加建议IP,IP是死的,报警里带关键词意味着发送内容被部分固定了。

如上,我们会得到一个钉钉机器人的Webhook地址:

https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx
shell

然后我们要准备一个发送的脚本,python很合适

#!/usr/bin/env python
#coding:utf-8
 
#zabbix钉钉报警
import requests,json,sys,os,datetime
#说明:这里改为自己创建的机器人的webhook
webhook="https://oapi.dingtalk.com/robot/send?access_token=xxxxxx"     

def log(info):
    if os.path.isfile("/tmp/dingding.log") == False:
        f = open(log_file, 'a+')
    else:
        f = open(log_file,'w+')
    f.write(info)
    f.close()

def msg(text,user):
    json_text= {
      "msgtype": "markdown",
      "markdown": {
         "title": "zabbix monitor",
         "text": text
      },
      "at": {
         "atMobiles": [
             user
             ],
         "isAtAll": False
      }
    }
    
    headers = {'Content-Type': 'application/json'}
    r=requests.post(url=webhook,data=json.dumps(json_text),headers=headers).json()
    code = r["errcode"]
    time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    if code == 0:
        log(time + ":消息发送成功 返回码:" + str(code) + "\n")
    else:
        log(time + ":消息发送失败 返回码:" + str(code) + "\n")
        exit(3)

if __name__ == '__main__':
    user = sys.argv[1] #用户
    subject = sys.argv[2] #标题
    text = sys.argv[3] #消息
    msg(text,user)
python

我们把上面的文件内容放到 /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

    这里就是关键了:

    发现问题的模板:

    ![告警平台信息](http://www.rendoumi.com/fire.png)
    > * ##### 告警主机: {HOSTNAME1}
    > * ##### 告警时间: {EVENT.DATE} {EVENT.TIME}
    > * ##### 告警等级: {TRIGGER.SEVERITY}
    > * ##### 告警信息: {TRIGGER.NAME}
    > * ##### 告警项目: {TRIGGER.KEY1}
    > * ##### 问题详情: {ITEM.NAME}:{ITEM.VALUE}
    > * ##### 当前状态: {TRIGGER.STATUS}:{ITEM.VALUE1}
    > * ##### 事件ID: {EVENT.ID}
    
    fallback

    Problem recovery(问题恢复)的模板:

    ![告警平台信息](http://www.rendoumi.com/recover.png)
    > * #### 警告解除:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
    > * ##### 告警持续时长: {EVENT.DURATION}
    > * ##### 告警主机: {HOST.NAME}
    > * ##### 告警信息: {EVENT.NAME}
    > * ##### 告警等级: {EVENT.SEVERITY}
    > * ##### 事件ID: {EVENT.ID}
    > * ##### {TRIGGER.URL}
    
    fallback

    有这两个就够了

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

    image-20221130204220981

    添加告警条件

    image-20221130204324423

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

image-20221130204451489

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

image-20221130204704354

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

image-20221130205304248

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

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

image-20221130204921458

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK