文章总结: 本文档详细介绍了Zabbix6.4LTS配置钉钉告警的完整流程,涵盖钉钉机器人创建、Python告警脚本编写、ZabbixWeb端媒介类型及动作设置等关键步骤。文档提供了具体的代码示例与参数配置,包含高级告警模板、测试验证及故障排除方法,并提出了保护Webhook密钥等安全建议,是一份具备较高可操作性的运维监控集成指南。 综合评分: 88 文章分类: 安全运营,安全建设,安全工具
Zabbix 6.4 LTS 钉钉告警配置教程
原创
刘军军 刘军军
运维星火燎原
2026年1月31日 00:01 河北
一、钉钉告警配置流程
1.1 在钉钉创建机器人
- 进入钉钉群设置:
- 打开需要接收告警的钉钉群
- 点击群设置 → 智能群助手
- 添加自定义机器人:
- 选择”添加机器人” → “自定义”
- 设置机器人名称(如:Zabbix监控告警)
- 选择安全设置(推荐使用”加签”)
- 复制Webhook地址和加签密钥
- 获取Webhook信息:
# 示例Webhook格式
https://oapi.dingtalk.com/robot/send?access_token=YOUR_ACCESS_TOKEN
# 加签密钥(如果有)
SECXXXXXX # 复制保存这个值
1.2 安装Python依赖
# 安装Python3和pip
sudo apt install python3 python3-pip -y
# 安装钉钉SDK
sudo pip3 install requests
# 创建脚本目录
sudo mkdir -p /usr/lib/zabbix/alertscripts
sudo chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts
二、创建钉钉告警脚本
2.1 创建Python告警脚本
sudo vim /usr/lib/zabbix/alertscripts/dingtalk.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
import hmac
import hashlib
import base64
import time
import urllib.parse
classDingTalkSender:
def__init__(self, webhook_url, secret=None):
self.webhook_url = webhook_url
self.secret = secret
defgenerate_sign(self):
"""生成加签"""
ifnot self.secret:
return self.webhook_url
timestamp = str(round(time.time() * 1000))
secret_enc = self.secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, self.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))
returnf"{self.webhook_url}×tamp={timestamp}&sign={sign}"
defsend_message(self, subject, message, at_mobiles=None, is_at_all=False):
"""发送钉钉消息"""
# 构建消息内容
data = {
"msgtype": "markdown",
"markdown": {
"title": subject,
"text": message
},
"at": {
"atMobiles": at_mobiles if at_mobiles else [],
"isAtAll": is_at_all
}
}
# 获取签名后的URL
url = self.generate_sign()
# 发送请求
headers = {'Content-Type': 'application/json'}
try:
response = requests.post(
url,
data=json.dumps(data),
headers=headers,
timeout=10
)
result = response.json()
if result.get('errcode') == 0:
print("消息发送成功")
returnTrue
else:
print(f"发送失败: {result.get('errmsg')}")
returnFalse
except Exception as e:
print(f"请求异常: {str(e)}")
returnFalse
defmain():
if len(sys.argv) < 4:
print("Usage: dingtalk.py <webhook_url> <subject> <message> [secret] [at_mobiles]")
sys.exit(1)
webhook_url = sys.argv[1]
subject = sys.argv[2]
message = sys.argv[3]
secret = sys.argv[4] if len(sys.argv) > 4elseNone
at_mobiles = sys.argv[5].split(',') if len(sys.argv) > 5elseNone
# 创建发送器实例
sender = DingTalkSender(webhook_url, secret)
# 发送消息
success = sender.send_message(subject, message, at_mobiles)
ifnot success:
sys.exit(1)
if __name__ == "__main__":
main()
2.2 创建Shell包装脚本(可选)
sudo vim /usr/lib/zabbix/alertscripts/dingtalk.sh
#!/bin/bash
# Zabbix钉钉告警脚本
WEBHOOK_URL="$1"
SUBJECT="$2"
MESSAGE="$3"
SECRET="$4"
AT_MOBILES="$5"
# 调用Python脚本
python3 /usr/lib/zabbix/alertscripts/dingtalk.py "$WEBHOOK_URL""$SUBJECT""$MESSAGE""$SECRET""$AT_MOBILES"
exit $?
2.3 设置脚本权限
# 设置执行权限
sudo chmod +x /usr/lib/zabbix/alertscripts/dingtalk.py
sudo chmod +x /usr/lib/zabbix/alertscripts/dingtalk.sh
# 设置所属用户
sudo chown zabbix:zabbix /usr/lib/zabbix/alertscripts/dingtalk.py
sudo chown zabbix:zabbix /usr/lib/zabbix/alertscripts/dingtalk.sh
# 测试脚本
cd /usr/lib/zabbix/alertscripts
sudo -u zabbix ./dingtalk.py"https://oapi.dingtalk.com/robot/send?access_token=TEST""测试标题""测试消息"
三、Zabbix Web界面配置
3.1 创建报警媒介类型
- 进入Zabbix Web界面
- Administration → Media types
- 点击”Create media type”
配置参数:
- Name: DingTalk Alert
- Type: Script
- Script name: dingtalk.py
- Script parameters:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
{ALERT.SECRET}
{ALERT.AT_MOBILES}
Message templates配置:
# 告警主题:
Problem: {TRIGGER.NAME}
# 告警消息:
## [{TRIGGER.SEVERITY}] 告警通知
**主机**: {HOST.NAME}
**IP地址**: {HOST.IP}
**问题**: {TRIGGER.NAME}
**严重程度**: {TRIGGER.SEVERITY}
**当前状态**: {TRIGGER.STATUS}
**发生时间**: {EVENT.DATE} {EVENT.TIME}
**持续时间**: {EVENT.AGE}
**事件ID**: {EVENT.ID}
**监控项值**:
{ITEM.NAME}: {ITEM.VALUE}
**触发条件**:
{TRIGGER.EXPRESSION}
**详细信息**:
{TRIGGER.URL}
3.2 创建用户和报警媒介
- Administration → Users
- 选择或创建用户
- 点击”Media”标签页 → “Add”
用户媒介配置:
- Type: DingTalk Alert
- Send to: 钉钉Webhook URL
- When active: 1-7,00:00-24:00
- Use if severity: 选择需要的严重级别
- Status: Enabled
高级配置:
- Secret: 钉钉加签密钥
- At Mobiles: 要@的手机号(逗号分隔)
3.3 配置报警动作
- Configuration → Actions
- 选择”Trigger actions”
- 点击”Create action”
Action配置:
-
Name: DingTalk Alert Action
-
Conditions:
-
Trigger severity = Disaster
-
Trigger severity = High
-
Trigger severity = Average
Operations配置:
-
Default operation step duration: 1h
-
Operations:
-
Send message to Users: DingTalk Alert
-
Send message to User groups: Zabbix administrators
Recovery operations:
- Operation type: Send message
- Send to Users: DingTalk Alert
四、高级告警配置
4.1 多级别告警模板
#!/usr/bin/env python3
# 高级钉钉告警脚本(支持不同严重级别)
defformat_message(event_type, trigger_data):
"""格式化不同级别的告警消息"""
templates = {
'problem': {
'title': '🚨 [{SEVERITY}] 告警: {TRIGGER_NAME}',
'template': """## 🚨 [{SEVERITY}] 告警通知
**主机**: {HOST_NAME}
**IP**: {HOST_IP}
**问题**: {TRIGGER_NAME}
**严重程度**: {SEVERITY}
**发生时间**: {EVENT_TIME}
**持续时间**: {EVENT_AGE}
**监控项值**:
{ITEM_VALUES}
**触发条件**:
{TRIGGER_EXPRESSION}
[查看详情]({TRIGGER_URL})"""
},
'recovery': {
'title': '✅ 恢复: {TRIGGER_NAME}',
'template': """## ✅ 问题已恢复
**主机**: {HOST_NAME}
**问题**: {TRIGGER_NAME}
**恢复时间**: {EVENT_TIME}
**持续时间**: {EVENT_AGE}
**监控项值**:
{ITEM_VALUES}
[查看详情]({TRIGGER_URL})"""
}
}
return templates[event_type]
4.2 告警频率控制
# 在Zabbix动作中配置频率控制
# Operation steps:
# - Step 1: 立即发送
# - Step 2: 每隔30分钟发送(如果问题持续)
# - Step 3: 每隔2小时发送(如果问题持续)
五、测试告警配置
5.1 手动测试脚本
# 测试告警脚本
cd /usr/lib/zabbix/alertscripts
sudo -u zabbix ./dingtalk.py \
"https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" \
"测试告警" \
"## 测试消息\n这是一条测试告警消息\n**时间**: $(date)" \
"YOUR_SECRET" \
"13800138000"
5.2 创建测试触发器
-- 在Zabbix数据库中创建测试触发器
INSERTINTOtriggers (
description, expression, priority, status, value, type
) VALUES (
'Test DingTalk Alert',
'{Template OS Linux:system.cpu.util[,idle].last()}<>0',
4, # High severity
0,
1,
0
);
5.3 使用zabbix_sender测试
# 发送测试数据
zabbix_sender -z zabbix-server-ip -s "test-host" -k"system.cpu.util[,idle]" -o10
# 检查告警是否触发
tail -f /var/log/zabbix/zabbix_server.log | grep dingtalk
六、故障排除
6.1 常见问题解决
# 检查脚本权限
ls -la /usr/lib/zabbix/alertscripts/
# 检查Zabbix用户权限
sudo -u zabbix /usr/lib/zabbix/alertscripts/dingtalk.py --help
# 查看Zabbix Server日志
tail -f /var/log/zabbix/zabbix_server.log | grep alert
# 调试模式运行
sudo -u zabbix python3 -u /usr/lib/zabbix/alertscripts/dingtalk.py \
"WEBHOOK_URL""测试""消息""SECRET"
6.2 日志分析
# 查看脚本执行日志
grep dingtalk /var/log/zabbix/zabbix_server.log
# 查看Python错误
sudo -u zabbix python3 /usr/lib/zabbix/alertscripts/dingtalk.py2>&1
# 检查网络连接
sudo -u zabbix curl -I https://oapi.dingtalk.com
6.3 性能优化
# 添加超时控制
sudo vim /usr/lib/zabbix/alertscripts/dingtalk.py
# 在requests.post中添加timeout参数
# 添加重试机制
defsend_message_with_retry(self, subject, message, max_retries=3):
for attempt in range(max_retries):
if self.send_message(subject, message):
returnTrue
time.sleep(2 ** attempt)
returnFalse
七、监控和统计
7.1 告警发送统计
-- 查询钉钉告警发送统计
SELECT
mediaid,
COUNT(*) as total_count,
SUM(CASEWHENstatus = 1THEN1ELSE0END) as success_count,
SUM(CASEWHENstatus = 0THEN1ELSE0END) as failed_count
FROM alerts
WHERE mediatypeid = (SELECT mediatypeid FROM media_type WHEREname = 'DingTalk Alert')
GROUPBY mediaid;
7.2 创建监控项
# 监控钉钉告警成功率
# 使用Zabbix Agent自定义监控项
UserParameter=dingtalk.success.rate,/usr/bin/python3 /path/to/monitor_script.py
八、安全建议
8.1 安全配置
# 保护Webhook URL和Secret
sudo chmod 600 /usr/lib/zabbix/alertscripts/dingtalk.py
# 使用环境变量存储敏感信息
export DINGTALK_WEBHOOK="your_webhook"
export DINGTALK_SECRET="your_secret"
# 定期轮换密钥
8.2 访问控制
# 限制脚本目录访问
sudo chmod 700 /usr/lib/zabbix/alertscripts
sudo chown zabbix:zabbix /usr/lib/zabbix/alertscripts
# 配置SELinux(如启用)
sudo chcon -t zabbix_alertscript_t /usr/lib/zabbix/alertscripts/dingtalk.py
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:运维星火燎原 刘军军 刘军军《Zabbix 6.4 LTS 钉钉告警配置教程》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论