前言

现在办公很多都使用钉钉,在群聊天里面,可以创建自定义的机器人来接受消息,并发送到群里面。我们可以利用这个钉钉机器人来发送告警信息。

部署步骤

1、创建自定义机器人

在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群。如果需要的话,可以为机器人设置一个头像。点击“完成添加”,完成后会生成 Hook 地址。

点击“复制”按钮,即可获得这个机器人对应的 Webhook 地址。

2、发送告警的脚本

这个脚本是基于 python3 写的,需要安装依赖模块 requests。

import requests
import json
import time
import sys

def send_message(token, message):
    url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token
    headers = {
        "Content-Type": "application/json"
    }
    data = {"msgtype": "text",
            "text": {
                "content": message
            },
           }
    response = requests.post(url, json=data, headers=headers)

def get_message(title, contents):
    messages = "标题:"+title+"\n\n" + "发送时间:" + \
        time.strftime("%Y年%m月%d日 %H时%M分%S秒")+"\n\n内容:\n" + \
        contents.replace("\\n", "\n") + "\n"
    return messages

if __name__ == "__main__":
    args = sys.argv
    if len(args) < 4:
        sys.exit(1)
    token = args[3]
    title = args[2]
    content = args[1]
    message = get_message(title, content)
    print(message)
    send_message(token, message)

3、设置 nagios 命令用来发送告警

在 commands.cfg 里面添加命令:(Python 的安装路径是/opt/python36)

define command{
	command_name	notify-host-by-dingding
	command_line	/opt/python36/bin/python3 /usr/local/nagios/scripts/dingding_send.py "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nGroup: $HOSTGROUPNAMES$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n"  "[nagios]** $NOTIFICATIONTYPE$ Host Alert: $HOSTADDRESS$-$HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$
	}

define command{
	command_name	notify-service-by-dingding
	command_line	/opt/python36/bin/python3 /usr/local/nagios/scripts/dingding_send.py "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nGroups: $HOSTGROUPNAMES$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n\nService_perfdata: $SERVICEPERFDATA$" "[nagios]** $NOTIFICATIONTYPE$ Service Alert: $HOSTADDRESS$-$HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
	}

4、添加钉钉机器人模板

在 templcates.cfg 里面添加模板:

define contact{
        name                            dingding-contact
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,c,r,f,s
        host_notification_options       d,u,r,f,s
        service_notification_commands   notify-service-by-dingding
        host_notification_commands      notify-host-by-dingding
        register                        0
        }

5、添加联系人

在 contacts.cfg 里面设置联系人:

define contact{
        contact_name                    dingding_robot1
        use                             dingding-contact
        alias                           kafka钉钉告警
        email                           XXXX
        }

nagios 默认是使用 mail 命令发送邮件,联系人里面有一个 email 选项就是填写 email 地址,我们可以替换成我们钉钉机器人的 access_token(XXXX 替换成 webhook 地址中的 access_token=后面的字符串即可),就可以将消息发送到对应的钉钉群

6、监控项目里面添加联系人

define service{
        use                             local-service
        host_name                       192.168.1.100
        service_description             all_DISK
        check_command                   check_nrpe/usr/local/nagios/libexec/check_all_disk.sh
	contacts    dingding_robot1
        }

总结

钉钉发送告警是有频率限制的,每个机器人每分钟最多发送 20 条。如果超过 20 条,会限流 10 分钟。因此,对比较重要的监控项设置钉钉告警,比较不重要的还是发送邮件就可以了。