背景与适用场景
服务器运行状态直接关乎业务稳定性。当CPU、内存、磁盘或网络出现异常时,第一时间通知运维人员至关重要。钉钉群机器人通过Webhook可将告警消息实时推送到指定群组,无需额外安装客户端,配置简单、成本极低。本文以Linux服务器+Shell脚本为例,完整演示从创建机器人到触发告警的全流程。
第一步:创建钉钉群机器人
- 打开钉钉,进入目标群聊,点击右上角“…”进入群设置。
- 选择“智能群助手” → “添加机器人” → 在机器人列表中选择“自定义”(通过Webhook接入)。
- 填写机器人名称(如“服务器告警”),安全设置建议选择“加签”方式(推荐),或只使用“自定义关键词”。
- 勾选“我已阅读并同意”,点击“完成”。系统会生成独有的Webhook地址和Secret密钥(如果选择了加签)。
第二步:获取Webhook URL与Secret
复制完整的Webhook URL,形如:
https://oapi.dingtalk.com/robot/send?access_token=xxxxx
若选择加签,还需保存Secret密钥(32位字符串)。后续发送消息时需按时间戳+密钥生成签名。
第三步:编写Shell告警脚本
以下脚本可发送Markdown格式的告警消息到钉钉:
#!/bin/bash
WEBHOOK_URL="你的Webhook地址"
SECRET="你的Secret密钥"
# 获取当前时间戳
timestamp=$(date +%s%3N)
# 拼接签名
sign=$(echo -n "${timestamp}\n${SECRET}" | openssl dgst -sha256 -hmac "${SECRET}" -binary | base64)
# 构造消息体(Markdown格式)
msg='{
"msgtype": "markdown",
"markdown": {
"title":"服务器告警",
"text":"### ⚠️ 服务器告警\n- **主机**: '$(hostname)'\n- **时间**: '$(date "+%Y-%m-%d %H:%M:%S")'\n- **告警内容**: CPU使用率超过90%"
}
}'
# 发送请求
curl -s -X POST "${WEBHOOK_URL}×tamp=${timestamp}&sign=${sign}" \
-H "Content-Type: application/json" \
-d "${msg}"
如需发送纯文本消息,将msgtype改为text并调整数据结构即可。
第四步:集成到监控系统
将上述脚本与常见的监控工具结合:
- Zabbix:在告警媒介类型中创建“脚本”,调用该Shell脚本;并在动作配置中引用该媒介。
- Prometheus + Alertmanager:在Alertmanager配置中设置webhook接收器,指向一个中转服务(如Python Flask),由中转服务调用钉钉脚本。
- Grafana:在告警渠道中添加“Webhook”,填写由第三方服务(如钉钉告警网关)转化的地址,或直接使用Grafana的钉钉插件。
- crontab定时检测:直接编写检测条件,满足条件时调用脚本,适合轻量级场景。
注意事项
- 钉钉机器人消息频率有限制:每20条/分钟,超限会被限流1分钟。
- 安全设置建议“加签”与“自定义关键词”同时使用,防止恶意刷消息。
- 脚本中需对告警内容做转义,避免JSON解析失败。
- 生产环境建议使用独立非root用户运行监控脚本,并限制执行权限。
验证与调试
手动执行脚本,观察钉钉群是否收到消息。若无响应,检查:
- Webhook地址是否完整,access_token是否正确
- 签名算法中的时间戳是否与URL中timestamp参数一致
- 网络是否可达(curl -v 查看返回码)
成功配置后,服务器告警将秒级推送至钉钉,显著提升故障响应效率。