Notify script is not working on Keepalived v1.3.5

在公司内网通过Keepalived的VIP机制及诊断脚本提供一些高可用服务及智能选择服务,但由于内网网络设备及环境复杂,导致在上面组建的Overlay网络内的ARP广播不通畅,在Keepalived主备切换切换后当前有效节点的MAC地址通知不到客户端,从而导致客户端不能连接到正确的服务节点,因此就想使用Keepalived的notify scripts, 在Keepalived状态转变后在所有客户端执行一个脚本更新MAC地址。

脚本也简单,定义客户端列表直接shell上去设置MAC地址(节点间通过ssh key 配置了自动登录):

#!/bin/sh

declare -a nodes=(
  "192.168.126.8"
  "192.168.126.9"
  "192.168.126.10"
  "192.168.126.11"
  "192.168.126.12"
  "192.168.126.13"
  "192.168.126.14"
  "192.168.126.15"
)

ip addr show eth0 | grep 192.168.126.99
foundVip=$?

for ip in "${nodes[@]}"; do
    if [ $foundVip -eq 0 ]; then
        MAC=`ip addr show eth0 | grep ff:ff:ff:ff:ff:ff | awk '{print $2}'`
        ssh root@$ip arp --set 192.168.126.99 $MAC
    fi
done

环境:CentOS 7.6, Kernel 4.20.5, Keepalived v1.3.5

按照track_script和real_server中定义MISC_TASK脚本的惯例用法, 把脚本放在了/usr/libexec/keepalived目录下, 配置了execute权限, 单独测试脚本工作正常。在vrrp_instance中配置notify 脚本路径及执行用户root, 如下:

vrrp_instance VI_POSTGRESQL {
...
    virtual_ipaddress {
        192.168.126.99/24 dev eth0 label eth0:1
    }
...
    notify "/usr/libexec/keepalived/update_mac_for_vip.sh" root
}

配置完成后停止/启动脚本测试了多次, 都不能得到执行, Google了半天, 有些资料提到Keepalive其中的一个patch把notify的配置方法改成了array, 于是尝试按列表方式配置notify scripts, 如下:

notify {

    "/usr/libexec/keepalived/update_mac_for_vip.sh" root

}

依然不奏效。

 

一个偶然的尝试把脚本从/usr/libexec/keepalived路径移到了/etc/keepalived目录下, 并更新Keepalived配置文件/etc/keepalived/keepalived.conf, 重启Keepalived后, notify机制竟然工作正常了。

暂未探寻究竟,也未尝试其它目录,权且记录,以备后查。

 

Leave a Comment