需求

Zabbix配置钉钉告警和Prometheus配置钉钉告警类似。只不过Zabbix通过钉钉告警是通过Python脚本实现。而Prometheus是通过钉钉的二进制包实现。

钉钉的设置可以参看我的另外一篇博文(Prometheus 配置钉钉告警): Prometheus 配置钉钉告警_叱咤少帅(少帅)的博客- 

我们现在主要来讲解Zabbix的设置实现

官网

###
https://open.dingtalk.com/document/robots/custom-robot-access

钉钉Webhook代码实现

vim /usr/local/zabbix/share/zabbix/alertscripts/dingding.py

采用webook的ip白名单形式脚本如下:

#!/usr/bin/env python
#coding:utf-8
# 博客地址: 

import requests,json,sys,os,datetime
webhook="https://oapi.dingtalk.com/robot/send?access_token=6e5bcfee12bc6fa7f3c6bd16b7d6c333d86266cecadd3fe5e77a29cedae9f9"    #这里改为自己创建的机器人的webhook的值

user=sys.argv[1]
text=sys.argv[3]
data={
    "msgtype": "text",
    "text": {
        "content": text
    },
    "at": {
        "atMobiles": [
            user
        ],
        "isAtAll": False
    }
}
headers = {'Content-Type': 'application/json'}
x=requests.post(url=webhook,data=json.dumps(data),headers=headers)
if os.path.exists("/tmp/dingding.log"):
    f=open("/tmp/dingding.log","a+")
else:
    f=open("/tmp/dingding.log","w+")
f.write("\n"+"--"*30)
if x.json()["errcode"] == 0:
    f.write("\n"+str(datetime.datetime.now())+"    "+str(user)+"    "+"发送成功"+"\n"+str(text))
    f.close()
else:
    f.write("\n"+str(datetime.datetime.now()) + "    " + str(user) + "    " + "发送失败" + "\n" + str(text))
    f.close()

采用webook的加标签的脚本如下:

#!/usr/bin/python3
import requests
import json
import sys
import time
import hmac
import hashlib
import base64
import urllib.parse
 
## 钉钉群使用label标签形式 

def send_to_dingtalk(content):
    # 根据实际修改1:钉钉机器人地址
    dingding_url = 'https://oapi.dingtalk.com/robot/send?access_token=3f315311a1a747cff049853de5a95392e20eb25eb0d7f3b0a91f48616f06d83d'
    # 根据实际修改2:钉钉的加签
    secret = 'SEC47ea613bfb85492cfa80783f2af300c3312bd7b1f0bf5163834b164efa873886'
 
    # 加签算法,钉钉文档里的
    timestamp = str(round(time.time() * 1000))
    secret_enc = secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
 
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    api_url = dingding_url + "×tamp={}&sign={}".format(timestamp, sign)
 
    json_text = {
        "msgtype": "markdown",
        "markdown": {
            "title": "zabbix",
            "text": content
        }
    }
 
    requests.post(api_url, json.dumps(json_text), headers=headers)
 
 
if __name__ == '__main__':
    #input_message = sys.argv[1]
    send_to_dingtalk = sys.argv[3]
    msg(input_message)

注意

如果采用markdown格式的钉钉,告警模板如下:

<font color=#FF0000 size=5 face="黑体">【告警】zabbix通知</font>
------
**主机名: {HOST.NAME}**  
**主机IP: {HOST.IP}**
> - 监控项目: {ITEM.NAME}
> - 监控取值: {ITEM.LASTVALUE} 
> - 告警等级: {TRIGGER.SEVERITY}
> - 当前状态: {TRIGGER.STATUS}
> - 告警信息: {TRIGGER.NAME}
> - 告警时间: {EVENT.DATE} {EVENT.TIME}
> - 事件ID: {EVENT.ID}
 
 
 
  
 
<font color=#006400 size=5 face="黑体">【恢复】zabbix通知</font>
------
**主机名: {HOST.NAME}**  
**主机IP: {HOST.IP}**
> - 监控项目: {ITEM.NAME}
> - 监控取值: {ITEM.LASTVALUE}
> - 告警等级: {TRIGGER.SEVERITY}
> - 当前状态: {TRIGGER.STATUS}
> - 告警信息: {TRIGGER.NAME}
> - 告警时间: {EVENT.DATE} {EVENT.TIME}
> - 恢复时间: {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
> - 持续时间: {EVENT.AGE}
> - 事件ID: {EVENT.ID}
 
 
 
<font color=#800000 size=5 face="黑体">【确认】zabbix通知</font>
------
 
**主机IP: {HOSTNAME1}**  
**确认人: {USER.FULLNAME}**
> - 确认时间: {ACK.DATE} {ACK.TIME} 
- 确认信息如下:
> "{ACK.MESSAGE}"
> - 问题ID: {EVENT.ID}
- 当前的问题是:
> {TRIGGER.NAME}

执行一下:

chmod +x dingding.py  # 加执行权限
python dingding.py  a b "测试"

我们看钉钉能不能收到告警(记得钉钉要加服务器的公网ip的白名单)

zabbix 告警发到哪个钉钉群 zabbix配置钉钉告警_钉钉告警

Zabbix的配置如下:

(1)配置报警媒介类型:

配置---> 报警媒介类型,脚本参数如下:

{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

截图如下:

zabbix 告警发到哪个钉钉群 zabbix配置钉钉告警_IP_02

(2)配置动作

 配置--->动作--->创建动作,把微信告警或者邮件告警的“操作”和恢复操作内容拷贝过来即可。

zabbix 告警发到哪个钉钉群 zabbix配置钉钉告警_钉钉告警_03

(3)最后配置用户

配置--->用户---> 报警媒介,把钉钉加进来即可。 其中收件人要写自己的电话号码。

zabbix 告警发到哪个钉钉群 zabbix配置钉钉告警_IP_04

Zabbix的配置就配置完了。我们看一下告警的效果图

zabbix 告警发到哪个钉钉群 zabbix配置钉钉告警_IP_05