钉钉告警消息类型常用的为text,但markdown的样式要比text的好看,所以想使用markdown格式来进行告警推送。
先看看对比图,
text消息类型:
markdown消息类型:
一、阅读本文需具备的知识
本文默认读者
1、对zabbix有一定的了解:知道zabbix的安装方式,启动方式,配置,能够完成一般告警的配置
2、知道钉钉机器人的创建
3、markdown语法
扫描二维码关注公众号,回复:
14577128 查看本文章
如果上述有不懂的话,一搜一大把,本文重点说说我将text格式切到markdown格式遇到的问题
二、我之前的text消息类型发送思路
由于我创建的机器人使用的是加签的方式,故使用python语言开发告警脚本。
说到python那么必然就需要虚拟环境,所以我考虑的是,zabbix调用shell脚本,并将告警消息以参数的方式传给脚本。
shell脚本source加载虚拟环境,并将传给shell给脚本的参数继续传递给python脚本。
这在消息类型为text之前都是好好的,改成markdown之后,就会出现告警内容只有第一个空格之前字符串的情况。
三、解决办法
简单粗暴:不使用虚拟环境的python,直接使用CentOS7系统上的python,zabbix也不调用shell脚本了,直接调用python脚本,就能正确的传参了。
四、参考配置
python代码:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
import json
import sys
import time
import hmac
import hashlib
import base64
import urllib.parse
def msg(content):
# 根据实际修改1:钉钉机器人地址
dingding_url = 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxx'
# 根据实际修改2:钉钉的加签
secret = 'xxxxxxxxxx'
# 加签算法,钉钉文档里的
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]
msg(input_message)
告警模板
<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}