我有2个app服务器都配置为运行php cron作业,但只有1个可以随时运行该作业。由于我已经将keepalived用于其他目的,我正在考虑在cron作业中使用一些逻辑来检查节点是否具有虚拟IP,然后执行该作业。因此理论上即使两个服务器同时运行cron作业,也只有1个将执行“真正的”作业。
但我的问题是如何检查节点是否有vip?有人可以告诉我吗?
谢谢。
我只是必须这样做。如果你只是想检查你所在的盒子是否正在浮动公共ip而ip是a.b.c.d,那么运行就足够了:
ip a | grep a.b.c.d
我很确定在bash中你可以使用该命令的输出作为条件本身。如果机器没有浮动公共ip,则输出应为空,因此评估为false,如果ip匹配,则应评估为true。
这是一个通用的脚本我建议调用is_primary来做到这一点:
#!/bin/bash
#
# Tells you if this node is the primary or secondary with keepalived
conf=/etc/keepalived/keepalived.conf
# Not sure why I can't do this in 1 step, but this works:
vip=$(expr "$(cat $conf)" : '.*\bvirtual_ipaddress\s*{\s*\(.*\)/*}')
vip=`expr "$vip" : '\([^ ]*\)' | sed 's/\./\\\\./g'`
if ip addr | grep -q "$vip"
then echo Primary ; exit 0
else echo Secondary ; exit 1
fi