【问题标题】:Keepalived running bash script exit codes problemKeepalived运行bash脚本退出代码问题
【发布时间】:2023-10-30 03:33:01
【问题描述】:

我正在运行 keepalived 来平衡虚拟 IP。

我写了一个简单的脚本检查是否设置了变量,如果是,“绕过”节点并故障转移到“备份”节点。它退出了我可以用正确的变量判断的内容。

但显然,keepalived 没有看到那个退出代码。我哪里出错了?该脚本是从keepalived.conf 文件运行的——是的,它被设置为可执行文件。如果我“破坏”代码(出现语法错误),它会相应地失败。

#!/bin/bash
set -e
echo "$vrrpTVIPS"; #for testing purposes only

if [ "$vrrpTVIPS" != "bypass" ]; then
 exit 0
else
 exit 1
fi

如果vrrpTVIPS == bypass,该脚本应该以代码1 退出(当我自己运行它并检查echo $? 我得到1 时它会这样做)。为什么keepalived 脚本没有看到这一点并采取相应的行动(它记录脚本退出代码,并且没有任何退出状态的条目1)?

我也尝试过扭转这种情况,但无济于事:

#!/bin/bash
set -e
echo "$vrrpTVIPS";

if [ "$vrrpTVIPS" == "bypass" ]; then
 exit 1
else
 exit 0
fi

添加信息: 这是来自keepalived.conf/etc/keepalived/keepalived.conf 中的相关信息:

vrrp_script check_test_override {
        script "/usr/sbin/chktest.sh"
        internal 2
}

在文件后面的 V-Instance 配置中:

track_script {
check_test_override
}

【问题讨论】:

  • 你用什么keepalived配置来调用这个脚本(例如vrrp_script或类似的)?
  • 是的,我在帖子中发布了上面的复制粘贴以供审核。

标签: bash


【解决方案1】:

vrrp_script 接受rise 和/或fall 参数,以及weight 设置OK/KO 转换需要多少错误或成功,以及基于此给予多少优先级改变。

我相信默认情况下它们都是未定义的,因此您必须明确定义它们。例如要打开单个 OK/failure 退出代码,请设置:

vrrp_script check_test_override {
        script "/usr/sbin/chktest.sh"
        interval 2
        weight 2
        rise 1
        fall 1
}

【讨论】:

  • 我修改了我的配置并重新启动了keepalived - 没有变化。查看日志 - 它似乎实际上将keepalived节点的优先级从100(我手动设置的)提高到102。这让我相信keepalived没有正确处理我的脚本中的“退出1”,因为同样,当我从命令行手动运行它时,我看到它以 1 退出。
  • 如果反转逻辑,优先级会下降 2 吗?
  • 反转逻辑并没有证明有任何变化,但我认为问题正在发生,因为我没有正确设置变量以在由 keepalived 运行时被可执行脚本实际读取。这可能是我对脚本/变量的理解的问题 - 因为当我在脚本本身的第一行设置变量时,一切正常。
  • 要确认这一点,另一种方法是将值写入文件,然后读取而不是查看环境变量?
最近更新 更多