zabbix告警推送钉钉
一、钉钉端配置
- 创建一个群聊,群类型为“内部群”
- 添加自定义机器人
- 复制保存【加签密钥】和【Webhook地址】后续脚本需要
二、zabbix服务器端配置
1. 创建专用目录
mkdir -p /usr/lib/zabbix/alertscripts/dingtalk
chmod 755 /usr/lib/zabbix/alertscripts/dingtalk进入目录
cd /usr/lib/zabbix/alertscripts/dingtalk
2. 编写钉钉告警脚本(Python3版本)
vim dingtalk.py
#!/usr/bin/env python3
import requests
import sys
import time
import hmac
import hashlib
import base64
import urllib.parse
import jsondef generate_sign(secret):"""生成钉钉加签字符串(Zabbix 6.4专用)"""timestamp = str(round(time.time() * 1000))secret_enc = secret.encode('utf-8')string_to_sign = f'{timestamp}\n{secret}'hmac_code = hmac.new(secret_enc, string_to_sign.encode('utf-8'), hashlib.sha256).digest()sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))return timestamp, signdef send_dingtalk(title, text, webhook, secret):"""发送消息到钉钉(支持Zabbix 6.4的Markdown格式)"""timestamp, sign = generate_sign(secret)headers = {"Content-Type": "application/json;charset=utf-8"}# Zabbix 6.4优化的消息格式(支持颜色和跳转)data = {"msgtype": "markdown","markdown": {"title": title,"text": text},"at": {"isAtAll": False}}# 带加签的完整URLurl = f"{webhook}×tamp={timestamp}&sign={sign}"try:response = requests.post(url, json=data, headers=headers, timeout=8)result = response.json()if result.get("errcode") == 0:print("钉钉消息发送成功")return 0else:print(f"钉钉API错误: {result.get('errmsg')}")return 1except Exception as e:print(f"请求失败: {str(e)}")return 1if __name__ == "__main__":if len(sys.argv) < 5:print("用法: dingtalk.py <标题> <内容> <webhook> <secret>")sys.exit(1)# Zabbix 6.4会传递5个参数(含脚本名)title = sys.argv[1]text = sys.argv[2]webhook = sys.argv[3]secret = sys.argv[4]sys.exit(send_dingtalk(title, text, webhook, secret))
3.设置脚本权限
赋予执行权限
chmod +x /usr/lib/zabbix/alertscripts/dingtalk/dingtalk.py
chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts/dingtalk验证Python3路径(确保第一行#!/usr/bin/env python3正确)
which python3
测试脚本
python dingtalk.py <标题> <内容>
4.安装必要依赖(如未安装)
# 对于CentOS/RHEL
yum install -y python3-requests# 对于Ubuntu/Debian
apt-get install -y python3-requests
三、Zabbix Web界面配置
1. 创建媒介
告警——>媒介——>创建媒介类型
在用户配置中,添加报警媒介
2. 创建触发器动作
在操作选项卡中配置“默认操作”和“恢复操作”
自定义内容:
默认操作
主题: {EVENT.STATUS}: {TRIGGER.NAME}
消息:
## {EVENT.STATUS}: {TRIGGER.NAME}**⏰ 触发时间**: {EVENT.DATE} {EVENT.TIME}
**🖥 主机名称**: {HOST.NAME}
**🌐 主机IP**: {HOST.IP}
**❗ 严重级别**: {TRIGGER.SEVERITY}
**📊 监控项**: {ITEM.NAME} = {ITEM.VALUE} ---
**🔍 问题详情**:
{TRIGGER.DESCRIPTION}[👉 点击查看问题详情]({TRIGGER.URL})
恢复操作
主题: 已恢复: {TRIGGER.NAME}
消息:
## ✅ 问题已恢复: {TRIGGER.NAME}**🔄 恢复时间**: {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
**⏱️ 持续时间**: {EVENT.DURATION}
**📊 恢复值**: {ITEM.NAME} = {ITEM.VALUE} [查看详情]({TRIGGER.URL})
配置用户
建议只选严重和灾难级的事件来推送,不然消息就太多了。。。
自动推送成功