一、背景

随着目前企业沟通协调均可在钉钉群内沟通,何不使用将日常不管是阿里云实例的告警信息,或自定义脚本监控的信息通过钉钉机器人发送至钉钉群,从而实现及时通知和信息发布。
相比微信告警需要配置企业号还需要用户关注,较为麻烦,钉钉消息可以直接调用钉钉机器人的webhook直接发送消息,比较简单,在此简单记录下,可供参考借鉴。

二、钉钉群消息

利用钉钉机器人发送阿里云告警信息到钉钉群

云监控具有钉钉群接收报警通知的功能,您配置钉钉群接收报警通知。
已经创建的报警规则,只需要在联系人中增加钉钉机器人的回调地址,就可以收到钉钉群报警,不需要修改报警规则。

2.1在钉钉内发起群聊或创建群组

钉钉机器人巧用

2.2 创建钉钉机器人

添加自定义机器人,记录webhook值
钉钉机器人巧用

2.3 配置阿里云告警联系人

将第一步中创建好的钉钉机器人webhook地址添加在联系人中,该联系人所在联系组对应的报警规则即可通过钉钉群接收报警通知。

  • 登录云监控控制台,进入联系人页面。
    钉钉机器人巧用
  • 点击编辑在已有联系人中添加钉钉机器人的回调地址,或者点击新建联系人,创建包含钉钉机器人的联系人
    钉钉机器人巧用

    2.4 配置告警模版

    登录阿里云云监控后台-主机监控-告警模版-新建告警规则
    钉钉机器人巧用
    钉钉机器人巧用

    2.5 查看告警消息

    钉钉机器人巧用

    三、自定义告警

    3.1 钉钉群及钉钉机器人创建见2.1、2.2

    3.2 python调用发送消息

    利用python的urllib2的Request和urlopen方法实现调用钉钉机器人的webhook来发送message,由于python写的不好,简单实现发送消息功能。

    #!/bin/env python
    import json,urllib2,sys
    #钉钉机器人webhook变量
    WebHook="https://oapi.dingtalk.com/robot/send?access_token=8d0905d37edf9e91c33de8f2c60f4e1e3d1e99b765c2d2e46c59cff7e75a9c5a"
    #获取第一个参数为message
    def get_message():
            if len(sys.argv) < 2:
                    print "Usage:%s context." % sys.argv[0]
            else:
                    context = sys.argv[1]
            return context
    #处理消息
    def do_message(context):
            message = {
                    "msgtype":"text",
                    "text":{
                            "content":context
                    }
            }
            return message
    #调用发送消息
    def send_reques(webhook):
            context = get_message()
            message = do_message(context)
            json_dump = json.dumps(message)
            req_con = urllib2.Request(webhook,json_dump)
            req_con.add_header('Content-Type', 'application/json')
            response = urllib2.urlopen(req_con)
    
    if __name__ == '__main__':
            send_reques(WebHook)

    此时可以利用./dingding.py "消息内容"来发送消息到钉钉群了
    钉钉机器人巧用

    3.3 简单利用其结合shell监控脚本

    在此简单结合一个监控VPN隧道的脚本来测试,可根据自己生成业务来做。

    #!/bin/bash
    #mail:xuel@anchnet.com
    IP=10.10.10.2
    dir="/netdir/"
    if [ ! -d ${dir} ];then
        mkdir -p ${dir}
    fi
    echo 1 > ${dir}ping.lock
    while true
    do
        Time=`date +%F`
        TIME="${Time} 23:59"
        if [ "${data}" == "${TIME}" ];then
            mkdir ${dir}${Time} && mv ${dir}ping2.log ${dir}${Time}-ping2.log
            mv ${dir}${Time}-ping2.log ${dir}${Time}
        fi
        find ${dir} -mtime +7 -type d -exec rm -rf {} \;
    
        find ${dir} -mtime +7 -name "*-ping2.log" -exec rm -rf {} \;
        data=`date +%F' '%H:%M`
        data1=`date +%F' '%H:%M:%S`
        echo "------------${data1}---------------">>${dir}ping2.log
        ping -c 10 ${IP} >>${dir}ping2.log
        if [ $? -eq 1 ];then
            STAT=`cat ${dir}ping.lock`
            if [ ${STAT} -eq 1 ];then
                context1="VPN监控告警通知\nfrom 公有云(172.16.2.22) ping 金融云(10.10.10.2)中断\n请检查深信服VPN!\nTIME:${data1}"
                msg=`echo -e ${context1}`
                /usr/bin/python /netdir/dingding.py "${msg}"
                /usr/bin/python /netdir/GFweixin.py xuel  VPN "GLP from 公有云(172.16.2.22) ping 金融云(10.10.10.2)中断,请检查深信服VPN! TIME:${data1}"
                echo 0 > ${dir}ping.lock
            else
                continue
            fi
        else
            STAT=`cat ${dir}ping.lock`
            if [ ${STAT} -eq 0 ];then
                context1="VPN监控恢复通知\nfrom 公有云(172.16.2.22) ping 公有云(10.10.10.2)恢复\n厉害了VPN!\nTIME:${data1}"
                msg=`echo -e ${context1}`
                /usr/bin/python /netdir/dingding.py "${msg}"
                /usr/bin/python /netdir/GFweixin.py xuel VPN "GLP from 公有云(172.16.2.22) ping 公有云(10.10.10.2)恢复 \n TIME:${data1}"
                echo 1 > ${dir}ping.lock
            else
                continue
            fi
        fi
    
    done

    相关脚本可以查看:URL

    3.4 查看告警

    钉钉机器人巧用