美文网首页
Zabbix使用钉钉webhock机器人报警

Zabbix使用钉钉webhock机器人报警

作者: 左舷的风 | 来源:发表于2019-12-06 18:02 被阅读0次

    更新日志:
    2019.12.06  初次创建;

      原来zabbix使用的短信接口废弃不用了,之前也研究过微信报警,但是需要使用单独的APP企业微信,正好我司现在都在用钉钉做考勤,这次研究下使用钉钉报警;
      zabbix/python版本都很老了,具体版本如下:

    zabbix-2.0.6
    python2.7.8
    

      基本的思路就是:
      1. 把要收到的报警人拉倒一个钉钉群里;
      2. 在这个钉钉群里创建个webhook机器人;
      3. 写个python脚本通过钉钉的api调这个机器人发送报警信息;
      3. 使用zabbix的自定义脚本调这个python脚本;

      1,2这两步就省略了,直接看下面的官方文档按步骤操作就可以了:
      钉钉开发文档 - 获取自定义机器人webhook

      第3步也不废话,直接上python脚本,其实很简单:dingding_alarm.py(我使用的是官方文档中第二种方式 加签,为什么呢,因为有官方的python方法!)

    #! /usr/bin/python
    # -*- coding:utf-8 -*-
    # author: cerberus43
    
    import time
    import hmac
    import hashlib
    import base64
    import urllib
    import requests
    import json
    import sys
    import logging
    from dingding_var import init_url, secret_key
    
    
    def encrypt_url(url, secret):
        timestamp = long(round(time.time() * 1000))
        secret_enc = bytes(secret).encode('utf-8')
        string_to_sign = '{}\n{}'.format(timestamp, secret)
        string_to_sign_enc = bytes(string_to_sign).encode('utf-8')
        hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
        sign = urllib.quote_plus(base64.b64encode(hmac_code))
        post_url = url + '&timestamp=' + str(timestamp) + '&sign=' + sign
        return post_url
    
    
    def post_msg(post_url, msg, phone_num_list):
        headers = {'Content-Type': 'application/json'}
        if not phone_num_list:
            post_data = {
                            "msgtype": "text",
                            "text": {
                                "content": msg
                            },
                        }
        else:
            post_data = {
                            "msgtype": "text",
                            "text": {
                                "content": msg
                            },
                            "at": {
                                "atMobiles": phone_num_list,
                                "isAtAll": "false"
                            }
                        }
        post_json = json.dumps(post_data)
        r = requests.post(post_url, headers=headers, data=post_json)
        return r.text
    
    def input_log(phone, msg, post_result):
        logging.basicConfig(filename="dingding_alarm.log", filemode="w", format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=logging.INFO)
        logging.info('PHONE: %s | Message: %s | RESULT: %s' %(phone, msg.replace("\n",""), post_result))
        
    
    if __name__ == '__main__':
        alarm_phone_num = sys.argv[1]
        alarm_msg = sys.argv[3]
    
        alarm_phone_list = alarm_phone_num.split(",")
        post_url = encrypt_url(init_url, secret_key)
        request_result = post_msg(post_url, alarm_msg, alarm_phone_list)
        input_log(alarm_phone_num, alarm_msg, request_result)
    

      注意同目录下还需要dingding_var.py(记录第1,2部创出的init_url和secret_key),dingding_var.py这俩文件:

    #! /usr/bin/python
    # -*- coding:utf-8 -*-
    
    init_url = 'https://oapi.dingtalk.com/robot/send?access_token=a08f7exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    secret_key = 'SECexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    
    dingding_var.py  #记录报警log的文件;
    dingding_alarm.py  #报警主脚本;
    dingding_var.py  #变量配置文件,需要在报警脚本里from引用下;
    

      第4步,添加到zabbix自定义脚本中:

    dingding_alarm_01.jpg
    dingding_alarm_02.jpg
    dingding_alarm_03.jpg
      注意这一步:zabbix调用dingding_alarm.py(其他自定义脚本也是一样)传值的时候:
      手机号是$1
      默认标题是$2
      默认信息是$3

      最终效果图:

    dingding_alarm_04.jpg
      待解决的问题:
      1. 报警风暴的问题没有解决;
      初步解决思路:之前使用短信报警的时候其实解决了报警风暴的文件,大致思路就是报警信息先存库,然后每5分钟查库判断,如果5分钟内同项目超过多少条自动合并发送条XX项目产生报警风暴,如无报警风暴就把此5分钟的再发出来...
      2. 一触发报警会让整个组的人都收到信息;
      初步解决思路:按项目创建报警组,每个报警组只拉自己项目的人...

    相关文章

      网友评论

          本文标题:Zabbix使用钉钉webhock机器人报警

          本文链接:https://www.haomeiwen.com/subject/rbpegctx.html