Keepalived 业务 VIP 迁移告警

本文档说明如何在两台 Keepalived 节点上配置邮件告警(当 VRRP 状态发生迁移时发送邮件通知),包含环境准备、脚本与 keepalived 配置、测试与常见问题排查。
1 概要
目标:当 Keepalived 的 VRRP 状态由 MASTER/BACKUP/Fault 变化时,自动发送邮件告警,以便运维人员及时知晓 VIP 迁移情况。
思路:利用 s-nail(mailx)+ postfix 发送邮件;Keepalived 的 notify_* 回调执行脚本发送邮件。
2 前提与环境
- 两台机器(例如 KA1、KA2),并且 Keepalived 已安装并正常运行。
- 系统:基于 RHEL/Fedora/CentOS 的发行版(命令使用 dnf)。
- 可以使用外部 SMTP(例如 163 SMTP)或本机 postfix 做转发。
- 需要一个用于接收告警的邮箱(示例用 18717458451@163.com)。
3 安装邮件相关软件
在两台节点上安装 s-nail 与 postfix:
bash
#安装邮件软件# 在两台节点上执行
dnf install -y s-nail postfix
启动并设置 postfix#启动邮件代理:
bash
[root@KA1 KA2 ~] systemctl enable --now postfix.service
(可选)如果使用本机 postfix 作为 relaying,需保证 postfix 配置允许本机提交邮件并能通过公网 SMTP 路由到目标 SMTP。
4 配置 s-nail
(/etc/mail.rc)
在每台节点上配置 /etc/mail.rc,使 s-nail 能通过外部 SMTP 发送邮件(示例使用 163):
bash
在Linux主机中配置mailrc(KA1+KA2)
[root@KA1+KA2 ~]# vim /etc/mail.rc
set smtp=smtp.163.com
set smtp-auth=login
set smtp-auth-user=your_account@163.com
set smtp-auth-password=your_authorization_password
set from=your_account@163.com
set ssl-verify=ignore
示例内容(请替换邮箱账号/授权码):
获取授权码:qq邮箱
获取163邮箱

说明:
smtp-auth-password使用 SMTP 授权码(不是邮箱登录密码)------视邮件服务商要求。- 若使用本机 postfix 转发到 ISP 或外部 SMTP,可不用配置 /etc/mail.rc,直接让 postfix 发信。
测试发信:
[root@KA1 mail]echo hello | mailx -s "填写发送内容" your_receive_mail@163.com
# 查看邮件队列
[root@KA1 mail]mailq
# 查看本地 /var/spool/mail/root 是否有退信等
[root@KA1 mail]mail

2.设定keepalived告警脚本
在两台节点创建脚本目录并编写脚本:
bash
mkdir -p /etc/keepalived/scripts
vim /etc/keepalived/scripts/warning.sh
脚本示例(请根据需要调整接收邮箱、主题等):
bash
#!/bin/bash
mail_dest='@163.com' # 告警接收邮箱
mail_send()
{
mail_subj="$HOSTNAME -> $1 : VIP 转移告警"
mail_mess="$(date +'%F %T'): vrrp 转移, $HOSTNAME 变为 $1"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case "$1" in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac

授权并测试脚本:
[root@KA1+2 ~]# chmod +x /etc/keepalived/scripts/waring.sh
[root@KA1 ~]# /etc/keepalived/scripts/waring.sh master
#对应邮箱中会出现邮件

配置keepalived告警
[root@KA1 ~]# vim /etc/keepalived/keepalived.conf
#在KA1和KA2中设定配置文件
! Configuration File for keepalived
global_defs {
notification_email {
timinglee_zln@163.com
}
notification_email_from timinglee_zln@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 1
vrrp_gna_interval 1
vrrp_mcast_group4 224.0.0.44
enable_script_security
script_user root
}
vrrp_instance WEB_VIP {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
# unicast_src_ip 172.25.254.50
# unicast_peer {
# 172.25.254.60
# }
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
notify_master "/etc/keepalived/scripts/waring.sh master"
notify_backup "/etc/keepalived/scripts/waring.sh backup"
notify_fault "/etc/keepalived/scripts/waring.sh fault"
}


#重启 keepalived[root@KA1+2 ~]# systemctl restart keepalived.service
测试流程
-
确认 keepalived 在两台机器上正常运行,VIP 已绑定在 MASTER 节点。
-
停掉主节点的 keepalived,观察 backup 变为 MASTER:
- 在主节点执行:
systemctl stop keepalived.service - 检查另一台节点是否收到邮件告警(notify_backup/on master)。
- 在主节点执行:
-
重启主节点的 keepalived(或启动),观察主节点重新成为 MASTER 并收到告警。
-
查看 /var/log/maillog 或 /var/log/maillog 的 postfix 日志以排查发送失败原因;查看 /var/spool/mqueue(如有)或
mailq。#测试
[root@KA1 ~]# systemctl stop keepalived.service #停止服务后查看邮件

[root@KA1 ~]# systemctl start keepalived.service #开启服务后查看邮件

常见问题与排查建议
-
收不到告警邮件:
- 检查 /etc/mail.rc 或 postfix 是否配置正确,尝试手动用
mailx发送邮件排查。 - 检查防火墙或网络是否阻塞 SMTP(端口 25/465/587)。
- 查看本地邮件队列
mailq和邮件日志(/var/log/maillog 或 /var/log/maillog)。 - 一些邮件服务商会将自动化邮件判为垃圾,检查目标邮箱垃圾箱与拦截策略。
- 检查 /etc/mail.rc 或 postfix 是否配置正确,尝试手动用
-
keepalived 无法执行脚本:
- 确认脚本可执行 (
chmod +x),并有正确的 shebang(#!/bin/bash)。 - 若启用了
enable_script_security,确认script_user有权限执行脚本和调用 mailx。 - 在脚本内显式使用全路径(例如
/usr/bin/mail或/usr/bin/mailx),避免 PATH 问题。
- 确认脚本可执行 (
-
脚本执行但邮件发送失败:
-
在脚本中记录日志(重定向输出到 /var/log/keepalived-notify.log)以便排查:
echo "$mail_mess" | /usr/bin/mail -s "$mail_subj" $mail_dest >> /var/log/keepalived-notify.log 2>&1
-
或 /usr/bin/mailx),避免 PATH 问题。
-
脚本执行但邮件发送失败:
-
在脚本中记录日志(重定向输出到 /var/log/keepalived-notify.log)以便排查:
echo "$mail_mess" | /usr/bin/mail -s "$mail_subj" $mail_dest >> /var/log/keepalived-notify.log 2>&1
-
-
SMTP 验证失败:确认使用的用户名/授权码正确,且邮件服务开启了 SMTP/授权码功能。