钉钉/企业微信推送服务器故障告警:服务器故障告警推送配置
为什么需要给服务器配一个告警推送
服务器一旦出问题(如CPU过高、磁盘爆满、进程挂掉),如果能第一时间通过手机收到通知,就能快速响应。
钉钉和企业微信都支持通过机器人或应用发送消息,配置起来不算复杂,关键是要把步骤走对。
本文就把完整流程拆开,从注册机器人到写脚本、验证效果,一步步说清楚。
前置准备:你需要什么
- 一台Linux服务器(本文以CentOS 7/8为例,命令通用)
- 一个钉钉或企业微信账号,且拥有创建群机器人的权限(或企业微信应用管理权限)
- 服务器能访问外网(机器人Webhook需要HTTP请求)
- 基本的命令行操作能力(会复制粘贴、改文件)
在钉钉里创建群机器人
- 打开钉钉,进入任意一个群聊(建议新建一个“服务器告警”群)。
- 点击群设置 → 智能群助手 → 添加机器人 → 选择“自定义”(通过Webhook接入)。
- 给机器人起个名字,比如“告警小助手”,安全设置建议勾选“加签”(密钥),但为简化首次配置,可以先选择“自定义关键词”(例如输入“告警”),之后发送的消息必须包含该关键词才会被接收。
- 点击完成,会得到一个 Webhook地址,长这样:
https://oapi.dingtalk.com/robot/send?
access_token=xxxxxxxx
保存好这个地址。
在企业微信里创建机器人
- 登录企业微信管理后台,找到“应用管理” → “自建” → “创建应用”。
- 填写应用名称(如“服务器告警”)、可见范围(选自己或整个部门)。
- 创建成功后,进入应用详情,找到 Webhook 一栏,点击“配置” → 选择“启用”,复制生成的URL:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?
key=xxxx-xxxx-xxxx
注意:企业微信的Webhook URL结构里是 key=...,不是 access_token。
写Shell脚本发送告警消息
不管是钉钉还是企业微信,本质都是向一个HTTP地址发送JSON格式的消息。
我们可以写一个通用脚本,通过参数选择发送到哪个渠道。
新建文件 /usr/local/bin/server_alert.sh,内容如下:
#!/bin/bash
# 钉钉和企业微信的Webhook地址(请替换为你的实际地址)
DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=你的token"
WECHAT_WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key"
# 消息内容(必须包含关键词“告警”才能触发钉钉机器人)
MESSAGE="【服务器告警】服务器 $(hostname) 出现异常,请立即检查。时间:$(date '+%Y-%m-%d %H:%M:%S')"
# 钉钉消息格式(Markdown类型)
DINGTALK_PAYLOAD="{
\"msgtype\": \"markdown\",
\"markdown\": {
\"title\": \"服务器告警\",
\"text\": \"$MESSAGE\"
}
}"
# 企业微信消息格式(文本类型)
WECHAT_PAYLOAD="{
\"msgtype\": \"text\",
\"text\": {
\"content\": \"$MESSAGE\"
}
}"
# 发送到钉钉
curl -s -H "Content-Type: application/json" -d "$DINGTALK_PAYLOAD" "$DINGTALK_WEBHOOK"
# 发送到企业微信
curl -s -H "Content-Type: application/json" -d "$WECHAT_PAYLOAD" "$WECHAT_WEBHOOK"
echo "告警消息已发送"
给脚本执行权限:
chmod +x /usr/local/bin/server_alert.sh
测试运行:
bash /usr/local/bin/server_alert.sh
如果配置正确,钉钉和企业微信都会收到一条消息。
集成到监控工具中
实际运用时,你可以在以下场景自动调用这个脚本:
- 磁盘使用率告警:在crontab里每隔5分钟执行检测脚本,超过阈值就调用
server_alert.sh。 - 进程守护:在systemd服务中,如果服务重启失败,触发告警。
- 配合Zabbix/Prometheus:在告警动作中配置运行此脚本。
以最简单的磁盘监控为例,在crontab中添加:
# 每5分钟检查磁盘使用率,超过80%就告警
*/5 * * * * df -h | grep -E '^/dev/' | awk '{if (NR>1 && $5+0 > 80) system("/usr/local/bin/server_alert.sh")}'
避坑与高频问题解答
Q1:钉钉机器人说“消息内容未包含关键词”
检查消息文本是否包含你在安全设置里指定的关键词(本文示例是“告警”),注意全半角标点。最好通过 echo $MESSAGE 查看实际内容。
Q2:企业微信返回错误“不合法的消息类型”
检查payload中的 msgtype 是否支持。企业微信文本类型必须为“text”,不能是“markdown”(除非你特意用了markdown类型)。本文用的是文本类型。
Q3:curl请求无响应或超时
确认服务器能访问外网:ping oapi.dingtalk.com。如果无法访问,检查防火墙或DNS。也可以尝试在curl命令后面加上 --connect-timeout 10 设置超时。
Q4:消息发得太频繁被限流
钉钉和企业微信对单个机器人都有频率限制(如钉钉每分钟20条)。如果你的告警脚本触发太频繁,可以在脚本里加一个速率控制,比如每次发送后 sleep 2 秒,或者使用简单的计数锁。
Q5:不想暴露Token在脚本里?
可以把Webhook地址存成环境变量,或者使用配置文件(权限设为600)。例如:
# 在脚本开头
source /etc/server_alert.conf
然后将实际地址写进 /etc/server_alert.conf,并设置 chmod 600。
如何验证告警能真正通知到你
- 手动运行脚本一次,检查手机是否收到消息。
- 模拟一个故障:比如故意创建一个大文件占满磁盘(不要在生产环境做)、或者停掉一个关键进程。
- 触发告警后,确认消息中的内容(主机名、时间)正确。
- 如果有多人需要接收,可以在钉钉群里添加机器人(所有群成员都能收到),或者企业微信将应用推送给指定成员。
总结
钉钉和企业微信的服务器故障告警配置核心就是:获取Webhook地址 → 构造JSON消息 → 用curl发送。
本文提供的脚本可以直接拿来用,配合crontab或监控工具就能实现自动化通知。
如果你在实际操作中遇到其他问题,建议先检查网络连通性、消息格式和机器人安全设置,大部分问题都出在这三点上。