方法一:使用 Zabbix Webhook 媒介(推荐)
1. 创建钉钉机器人
# 在钉钉群添加自定义机器人
# 获取 Webhook URL,格式如:
# https://oapi.dingtalk.com/robot/send?access_token=xxx
2. 创建 JavaScript 脚本
/usr/lib/zabbix/alertscripts/dingtalk.js
const https = require('https');
const url = require('url');
try {
// 解析传入的参数
const params = JSON.parse(process.argv[2]);
// 钉钉机器人 Webhook URL
const webhookUrl = params.webhook_url || 'YOUR_DINGTALK_WEBHOOK_URL';
// 构建消息内容
const message = {
msgtype: "markdown",
markdown: {
title: `Zabbix告警: ${params.subject}`,
text: `### ${params.subject}\n\n` +
`**告警级别**: ${params.severity}\n\n` +
`**主机**: ${params.hostname}\n\n` +
`**时间**: ${new Date().toLocaleString('zh-CN')}\n\n` +
`**问题**: ${params.message}\n\n` +
`**详情**: ${params.event_id ? `[查看事件](http://your-zabbix-server/zabbix.php?action=problem.view&eventid=${params.event_id})` : ''}`
},
at: {
atMobiles: params.at_mobiles ? params.at_mobiles.split(',') : [],
isAtAll: params.is_at_all === 'true'
}
};
// 解析 URL
const parsedUrl = url.parse(webhookUrl);
const options = {
hostname: parsedUrl.hostname,
port: parsedUrl.port || 443,
path: parsedUrl.path,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(JSON.stringify(message))
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
const response = JSON.parse(data);
if (response.errcode === 0) {
console.log('Message sent successfully');
process.exit(0);
} else {
console.error(`Error: ${response.errmsg}`);
process.exit(1);
}
});
});
req.on('error', (e) => {
console.error(`Request error: ${e.message}`);
process.exit(1);
});
// 发送请求
req.write(JSON.stringify(message));
req.end();
} catch (error) {
console.error(`Script error: ${error.message}`);
process.exit(1);
}
3. 设置脚本权限并测试
chmod +x /usr/lib/zabbix/alertscripts/dingtalk.js
chown zabbix:zabbix /usr/lib/zabbix/alertscripts/dingtalk.js
# 测试脚本
node /usr/lib/zabbix/alertscripts/dingtalk.js '{
"webhook_url": "https://oapi.dingtalk.com/robot/send?access_token=xxx",
"subject": "测试告警",
"severity": "High",
"hostname": "TestServer",
"message": "CPU使用率超过90%",
"event_id": "12345",
"at_mobiles": "13800138000",
"is_at_all": "false"
}'
方法二:使用 Zabbix Webhook 媒介类型
1. 在 Zabbix 前端配置
创建媒介类型:
管理 →
媒介类型 →
创建媒介类型
配置参数:
- 名称:DingTalk Webhook
- 类型:Webhook
- 脚本:dingtalk.js
JavaScript 脚本内容:
try {
// 解析传入的变量
var params = JSON.parse(value),
req = new HttpRequest(),
resp;
// 构建钉钉消息
var message = {
msgtype: "markdown",
markdown: {
title: "Zabbix告警: " + params.subject,
text: "### " + params.subject + "\n\n" +
"**告警级别**: " + params.severity + "\n\n" +
"**主机**: " + params.hostname + "\n\n" +
"**时间**: " + params.datetime + "\n\n" +
"**问题**: " + params.message + "\n\n" +
"**详情**: [查看事件](" + params.event_url + ")"
},
at: {
atMobiles: params.at_mobiles ? params.at_mobiles.split(',') : [],
isAtAll: params.is_at_all === 'true'
}
};
// 添加自定义签名(如果需要)
if (params.secret) {
var timestamp = Date.now();
var stringToSign = timestamp + "\n" + params.secret;
var sign = CryptoJS.HmacSHA256(stringToSign, params.secret).toString(CryptoJS.enc.Base64);
var signEncoded = encodeURIComponent(sign);
params.webhook_url += "×tamp=" + timestamp + "&sign=" + signEncoded;
}
// 发送请求
req.addHeader('Content-Type: application/json');
resp = req.post(params.webhook_url, JSON.stringify(message));
// 解析响应
if (req.getStatus() !== 200) {
throw 'HTTP error: ' + req.getStatus();
}
var response = JSON.parse(resp);
if (response.errcode !== 0) {
throw 'DingTalk error: ' + response.errmsg;
}
return JSON.stringify({
status: 'success',
message: 'Message sent successfully'
});
} catch (error) {
return JSON.stringify({
status: 'failed',
error: error.toString()
});
}
2. 配置媒介类型参数
必需的参数:
// 在媒介类型配置中添加这些参数
{name: "webhook_url", value: "{ALERT.SENDTO}"}
{name: "subject", value: "{ALERT.SUBJECT}"}
{name: "message", value: "{ALERT.MESSAGE}"}
{name: "hostname", value: "{HOST.HOST}"}
{name: "severity", value: "{TRIGGER.SEVERITY}"}
{name: "event_id", value: "{EVENT.ID}"}
{name: "datetime", value: "{EVENT.DATE} {EVENT.TIME}"}
{name: "event_url", value: "{$ZABBIX.URL}/zabbix.php?action=problem.view&eventid={EVENT.ID}"}
// 可选参数
{name: "at_mobiles", value: "{ALERT.MOBILE}"}
{name: "is_at_all", value: "false"}
{name: "secret", value: "YOUR_SECRET"} // 钉钉机器人加签密钥
方法三:使用 Python 脚本(备用方案)
如果你更喜欢 Python,也可以使用以下脚本:
#!/usr/bin/env python3
# /usr/lib/zabbix/alertscripts/dingtalk.py
import json
import sys
import requests
import time
import hmac
import hashlib
import base64
import urllib.parse
def send_dingtalk(message, webhook_url, secret=None):
"""发送钉钉消息"""
# 添加签名(如果需要)
if secret:
timestamp = str(round(time.time() * 1000))
string_to_sign = f"{timestamp}\n{secret}"
hmac_code = hmac.new(
secret.encode('utf-8'),
string_to_sign.encode('utf-8'),
digestmod=hashlib.sha256
).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
webhook_url = f"{webhook_url}×tamp={timestamp}&sign={sign}"
headers = {'Content-Type': 'application/json'}
try:
response = requests.post(
webhook_url,
data=json.dumps(message),
headers=headers,
timeout=10
)
result = response.json()
if result.get('errcode') == 0:
print("Message sent successfully")
return True
else:
print(f"Error: {result.get('errmsg')}")
return False
except Exception as e:
print(f"Request error: {str(e)}")
return False
if __name__ == "__main__":
try:
# 解析参数
params = json.loads(sys.argv[1])
# 构建消息
dingtalk_msg = {
"msgtype": "markdown",
"markdown": {
"title": f"Zabbix告警: {params.get('subject', '')}",
"text": f"### {params.get('subject', '')}\n\n"
f"**告警级别**: {params.get('severity', '')}\n\n"
f"**主机**: {params.get('hostname', '')}\n\n"
f"**时间**: {params.get('datetime', '')}\n\n"
f"**问题**: {params.get('message', '')}\n\n"
f"**详情**: [查看事件]({params.get('event_url', '')})"
}
}
# 添加 @ 某人
if params.get('at_mobiles'):
dingtalk_msg['at'] = {
'atMobiles': params['at_mobiles'].split(','),
'isAtAll': params.get('is_at_all', 'false') == 'true'
}
# 发送消息
success = send_dingtalk(
dingtalk_msg,
params['webhook_url'],
params.get('secret')
)
sys.exit(0 if success else 1)
except Exception as e:
print(f"Script error: {str(e)}")
sys.exit(1)
配置步骤总结
1. 钉钉机器人配置
在钉钉群创建自定义机器人
获取 Webhook URL
设置安全设置(关键词、加签、IP白名单)
2. Zabbix 配置步骤
创建脚本:将上述任一脚本放入
/usr/lib/zabbix/alertscripts/
设置权限:
chmod +x 和
chown zabbix:zabbix
创建媒介类型:
- 管理 → 媒介类型 → 创建媒介类型
- 选择脚本类型或Webhook类型
- 配置脚本和参数
创建用户媒介:
- 管理 → 用户 → 选择用户 → 媒介 → 添加
- 类型选择 DingTalk
- 收件人填写钉钉 Webhook URL
创建动作:
- 配置 → 动作 → 创建动作
- 配置条件(触发器、主机组等)
- 操作中发送消息到钉钉媒介
3. 测试配置
手动触发一个测试告警
检查钉钉群是否收到消息
查看 Zabbix 管理 → 报表 → 动作日志
注意事项
安全设置:钉钉机器人需要配置安全设置(IP白名单、关键词等)
频率限制:钉钉机器人有限频,避免频繁发送
编码问题:确保消息内容使用 UTF-8 编码
HTTPS:钉钉 Webhook 只支持 HTTPS
错误处理:脚本中要包含完善的错误处理
日志查看:查看
/var/log/zabbix/zabbix_server.log 调试问题
高级功能
消息模板:可以根据不同严重级别使用不同模板
@特定人员:通过手机号 @相关人员
按钮链接:在消息中添加快速操作按钮
签名验证:支持钉钉机器人的加签验证
选择适合你环境的方法进行配置即可。推荐使用 Webhook 媒介类型,因为它更灵活且易于维护。