钉钉机器人运维告警对接零基础教程
为什么要对接钉钉机器人做运维告警
服务器跑久了,CPU 飙升、磁盘写满、服务挂掉都是常事。
如果每次都要手动登机器看,不仅累还容易遗漏。把钉钉机器人当作告警通道,让服务器在发生异常时自动往钉钉群发消息,运维人员就能第一时间收到通知,快速响应。
本文以最简单的 Shell 脚本 + curl 命令为例,不依赖任何监控平台,零基础也能照着做。
如果你后续改用 Zabbix 或 Prometheus,原理完全一致:只要把告警消息拼成 JSON,发给机器人的 Webhook 地址即可。
前置准备:完成这三步就可以开始
开始操作前,请确保你已经具备以下条件:
- 一个 钉钉群(普通群或内部群均可),群成员至少 3 人(包含自己),否则机器人无法启用。
- 服务器能访问外网(能 curl 到
oapi.dingtalk.com)。 - 一个 服务器登录账号(建议用 root,避免权限问题)。
如果群人数不够,临时拉两个测试号进群,配置完再踢掉即可。
第一步:在钉钉群里创建自定义机器人
这是配置中最关键的一步,操作路径如下:
- 打开目标钉钉群,点击右上角 群设置(齿轮图标)。
- 选择 智能群助手 → 添加机器人。
- 在机器人列表中找到 自定义(通过 Webhook 接入自定义服务),点击 添加。
- 输入机器人名字(比如“运维告警机器人”),安全设置 建议勾选 加签,复制生成的密钥并保存好(后面脚本签名要用)。如果不勾选签名,则跳过此步骤。
- 点击 完成,页面会显示一个 Webhook 地址(类似
https://oapi.dingtalk.com/robot/send?access_token=xxx),立即复制保存,关闭后无法再次查看。
安全设置建议至少开启一个,最常用的是“加签”+“自定义关键词”组合:关键词设为“告警”,这样消息中必须包含“告警”二字才能发送成功。
第二步:编写推送告警的 Shell 脚本
在服务器上新建一个脚本文件,比如 /usr/local/bin/dingtalk_alert.sh,内容如下(关键地方根据你的实际信息替换):
#!/bin/bash
# 钉钉机器人运维告警对接脚本
# 配置区域 —— 换成你自己的值
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=你的TOKEN"
SECRET="你的加签密钥" # 如果没开启加签,这行可以删掉
# 消息标题和内容(支持 Markdown 格式)
TITLE="【服务器告警】"
TEXT="### 告警通知\n- **时间**: $(date '+%Y-%m-%d %H:%M:%S')\n- **主机**: $(hostname)\n- **IP**: $(curl -s ifconfig.me)\n- **CPU 负载**: $(uptime | awk -F'load average:' '{print $2}')\n- **磁盘使用率**: $(df -h / | awk 'NR==2{print $5}')\n- **内存使用率**: $(free -m | awk 'NR==2{printf "%.1f%%", $3/$2*100}')\n"
# 构建消息体(如果开启了加签,需要额外算出签名参数)
if [ -n "$SECRET" ]; then
TIMESTAMP=$(date +%s%3N)
SIGN_STRING="${TIMESTAMP}\n${SECRET}"
SIGN=$(echo -n "$SIGN_STRING" | openssl dgst -sha256 -hmac "$SECRET" -binary | base64)
URL="${WEBHOOK_URL}×tamp=${TIMESTAMP}&sign=${SIGN}"
else
URL="$WEBHOOK_URL"
fi
# 发送消息
curl -s -X POST "$URL" \
-H "Content-Type: application/json" \
-d "{
\"msgtype\": \"markdown\",
\"markdown\": {
\"title\": \"$TITLE\",
\"text\": \"$TEXT\"
}
}"
保存后赋予执行权限:
chmod +x /usr/local/bin/dingtalk_alert.sh
几点说明:
- 脚本自动收集了当前服务器的 CPU 负载、磁盘和内存使用率,你可以按需增减。
- 如果不需要签名,直接删掉
SECRET相关行,URL直接用 WEBHOOK_URL。 - 消息体使用 Markdown 格式,钉钉群内会渲染成卡片,可读性更好。
第三步:手动测试机器人与脚本是否可用
直接执行脚本,看钉钉群是否收到消息:
bash /usr/local/bin/dingtalk_alert.sh
如果群内弹出卡片消息,说明对接成功。
如果没收到,检查以下几点:
- Webhook 地址是否完整,access_token 有没有复制错(常见错误是多复制了一个空格)。
- 如果开启了加签,确认
SECRET值是否正确。 - 检查服务器能否访问外网:
curl -I https://oapi.dingtalk.com(返回 200 或 302 即可)。 - 如果安全设置选了“自定义关键词”,必须保证消息文本中包含该关键词(脚本中默认包含“告警”)。
避坑说明:这些细节不注意容易翻车
- Webhook 地址不要泄露:任何人拿到这个地址都可以给你的群发消息,建议只在信任的服务器使用,可以用加签防止伪造。
- JSON 格式必须严格正确:钉钉机器人只接受标准 JSON,引号必须是双引号,字段不能多逗号。如果脚本报错,可以用
echo "$JSON" | jq .验证格式。 - 消息长度限制:单条消息文本不超过 20KB,如果告警内容太长会被截断,建议精简。
- 频率限制:每个机器人每分钟最多发送 20 条消息,如果服务器疯狂报警,会被钉钉限流,注意告警收敛(比如同一问题 5 分钟只发一次)。
- 加签时间戳必须准确:如果服务器时间偏差超过 1 分钟,签名会失效,务必同步 NTP 时间。
效果验证:模拟一次真实告警场景
你可以写一个简单的监测脚本,比如当磁盘使用率超过 90% 时自动触发告警:
#!/bin/bash
THRESHOLD=90
CURRENT=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')
if [ "$CURRENT" -gt "$THRESHOLD" ]; then
/usr/local/bin/dingtalk_alert.sh
fi
将其加入 crontab,每分钟检查一次:
crontab -e
* * * * * /path/to/check_disk.sh
然后手动往根目录写入一个大文件填充磁盘(测试结束后记得删除),观察钉钉群是否收到告警。
收到告警即表示对接成功,可以放心用于生产环境。
总结
钉钉机器人运维告警对接并不复杂,核心就是拿到 Webhook 地址,按钉钉要求的 JSON 格式发送消息。
本文给出的 Shell 脚本可以直接复制使用,你只需替换 token、密钥和自定义告警内容。
如果遇到发送失败,优先检查脚本中的 JSON 格式和网络连通性。
如果你正在处理类似需求,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。