Keepalived 通过 notify 钩子调用外部脚本实现邮件告警,需配置 notify 指令、赋予脚本执行权限,并使用 mail 命令发送邮件;脚本接收实例名、状态、优先级参数,按状态生成对应告警内容并发送至指定邮箱。

Keepalived 本身不内置邮件发送功能,但可通过 vrrp_script 或 notify 钩子(notify_master / notify_backup / notify_fault)触发自定义脚本,在状态切换时发送告警邮件。
配置 Keepalived 的 notify 脚本
Keepalived 支持在 VRRP 状态变化时调用外部脚本,并传入当前状态(MASTER/BACKUP/FAULT)和实例名。这是最可靠、语义清晰的告警触发方式。
- 在 keepalived.conf 的 vrrp_instance 块中添加:
notify /etc/keepalived/notify.sh - 脚本需具备可执行权限:
chmod +x /etc/keepalived/notify.sh - 脚本接收三个参数:
$1 = 实例名(如 VI_1)
$2 = 新状态(MASTER / BACKUP / FAULT)
$3 = 优先级(仅 MASTER/BACKUP 时有效)
编写轻量邮件通知脚本
推荐使用系统自带的 mail 命令(依赖 mailutils 或 mailx),避免引入复杂依赖。若未安装,可快速部署:
- Ubuntu/Debian:apt install mailutils
- CentOS/RHEL:yum install mailx 或 dnf install mailx
示例 /etc/keepalived/notify.sh:
#!/bin/bash
INSTANCE=$1
STATUS=$2
PRIORITY=$3
HOSTNAME=$(hostname)
DATE=$(date '+%Y-%m-%d %H:%M:%S')
case "$STATUS" in
"MASTER")
SUBJECT="? KEEPALIVED 切换告警:${HOSTNAME} 成为 ${INSTANCE} 主节点"
BODY="时间:${DATE}\n角色:${STATUS}\n实例:${INSTANCE}\n优先级:${PRIORITY}\n节点:${HOSTNAME}"
echo -e "$BODY" | mail -s "$SUBJECT" -r "keepalived@${HOSTNAME}" admin@example.com
;;
"BACKUP")
SUBJECT="? KEEPALIVED 切换告警:${HOSTNAME} 切为 ${INSTANCE} 备节点"
BODY="时间:${DATE}\n角色:${STATUS}\n实例:${INSTANCE}\n节点:${HOSTNAME}"
echo -e "$BODY" | mail -s "$SUBJECT" -r "keepalived@${HOSTNAME}" admin@example.com
;;
"FAULT")
SUBJECT="⚠️ KEEPALIVED 故障告警:${HOSTNAME} 上 ${INSTANCE} 进入异常状态"
BODY="时间:${DATE}\n状态:${STATUS}\n实例:${INSTANCE}\n节点:${HOSTNAME}\n请立即检查 Keepalived 日志及网络连通性。"
echo -e "$BODY" | mail -s "$SUBJECT" -r "keepalived@${HOSTNAME}" admin@example.com
;;
esac
确保邮件能正常发出
系统邮件发送依赖本地 MTA(如 postfix、sendmail 或 msmtp)。若直接使用 mail 命令失败,常见原因和解决方式如下:
- 未配置发信域名或 SMTP 认证?→ 使用 msmtp 配置 Gmail / 企业邮箱等外部 SMTP
- 邮件被拒收或进垃圾箱?→ 设置 -r 参数指定合法 From 地址;避免纯 IP 发信
- 脚本执行权限或环境变量问题?→ 在脚本开头显式声明 PATH:
PATH="/usr/local/bin:/usr/bin:/bin" - Keepalived 以非 root 用户运行?→ 确保该用户有执行 mail 和读取配置的权限(通常 keepalived 以 root 运行,无需额外授权)
验证与调试技巧
不要等故障才测试。主动模拟状态切换并观察日志与邮件是否到达:
- 查看 Keepalived 日志:journalctl -u keepalived -f 或 tail -f /var/log/messages
- 手动触发脚本测试:/etc/keepalived/notify.sh VI_1 MASTER 100
- 检查脚本输出(加 set -x 或重定向 stderr 到文件)定位执行卡点
- 确认邮件队列:mailq(postfix)或 sendmail -bp










