钉钉webhook实现告警通知

2017年7月31日 发表评论 阅读评论

之前的运维告警多通过SMS、mail 等方式通知到相应的人员。不过虽着 IM 和手机APP的发展,很多告警也会发送到IM软件上去。目前比较常用的是发送到微信和钉钉上。不过微信发送时,需要开通企业公众号,比较麻烦。而钉钉在今年更新的机器人功能比较易用,只要启用的有钉钉,可以通过官方提供的API,可以很方便的post数据到相应的接收人 。其支持的机器人类型也比较丰富,除支持自定义webhook发送消息外,其还有gitlab、github、jira等机器人。

一、创建自定义webhook

通过桌面版或手机APP的钉钉发起聊天,选取相应的联系人创建聊天:

create-dingding-chat

点选右上角的机器人

dingding-robot

这里选取自定义webhook

点击创建后,指定机器人名称并编辑头像后,会后成一个hook地址 。记得复制下来该hook地址。其包含唯一的access tokenid 。

二、python post调用

当前自定义机器人支持文本(text)、连接(link)、markdown(markdown)等消息类型,需要注意的是发起POST请求时,必须将字符集编码设置成UTF-8,并且指定header的类型为json格式---注意字符和header不能少,少了无法正常发送消息。具体可以参考官方文档

这里以text类型为例,如下:

#code from www.361way.com
#coding: utf-8
import json,urllib2
url = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxx"
header = {
    "Content-Type": "application/json",
    "charset": "utf-8"
    }
data = {
     "msgtype": "text",
        "text": {
            "content": "www.361way.com告警测试"
        },
     "at": {
            "isAtAll":True   # at为非必须
         }
    }
sendData = json.dumps(data)
request = urllib2.Request(url,data = sendData,headers = header)
urlopen = urllib2.urlopen(request)
print urlopen.read()

当然在python下可以使用的post请求模块比较多,也可以使用requests模块进行操作。其用法如下:

req = requests.post(url, data=String_textMsg, headers=HEADERS)

成功调用后示例如下:

dingding-alter

三、zabbix告警发送钉钉

将上面的代码修改下,我们将tokenid、suject、message做为参数,具体脚本如下:

#code from www.361way.com
#coding=utf-8
import json,urllib2,sys
def usage():
    '''usage'''
    print 'Usage: %s %s %s %s' %(sys.argv[0],'tokenid','Subject','Content')
    sys.exit()
def dingding(tokenid,subject,message):
    url = "https://oapi.dingtalk.com/robot/send?access_token=" + tokenid
    header = {
        "Content-Type": "application/json",
        "charset": "utf-8"
        }
    data = {
         "msgtype": "text",
            "text": {
                "content": subject + '\n' + content
            }
        }
    sendData = json.dumps(data)
    request = urllib2.Request(url,data = sendData,headers = header)
    urlopen = urllib2.urlopen(request)
    return urlopen.read()
def main():
    if len(sys.argv) != 4:
        usage()
    tokenid = sys.argv[1]
    subject = sys.argv[2]
    message = sys.argv[3]
    dingding(tokenid, subject,message)
if __name__ == "__main__":
    main()

将上面的脚本放到zabbix_server.conf中的AlertScriptsPath目录下,并给其可执行权限。并在zabbix的web管理界面找到报警媒介类型---创建媒介类型---脚本---并给脚本创建参数,指定传的三个参数:{ALERT.SENDTO}、 {ALERT.SUBJECT} 、{ALERT.MESSAGE}。

zabbix-dingding

并新增一个zabbix用户,指定其接收人为tokenid

zabbix-dingding-user

接下来在配置---动作中创建新的动作或编辑已存在的动作,指定触发条件,并选择发送到刚刚的用户,选择使用的脚本为刚刚创建的ding宕机告警。

四、其他

由于钉钉机器人配置起来比较便捷,其适用于自动化巡检、svn和git的提交、现网版本发布等各种场景。同时由于官方提供的便捷示例,也可以很方便的创建富文本消息。官方同时提供了java和php调用的demo 。




本站的发展离不开您的资助,金额随意,欢迎来赏!

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.