需求
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的配置如下:
(1)配置报警媒介类型:
配置---> 报警媒介类型,脚本参数如下:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
截图如下:
(2)配置动作
配置--->动作--->创建动作,把微信告警或者邮件告警的“操作”和恢复操作内容拷贝过来即可。
(3)最后配置用户
配置--->用户---> 报警媒介,把钉钉加进来即可。 其中收件人要写自己的电话号码。
Zabbix的配置就配置完了。我们看一下告警的效果图