我有一个执行检查并返回布尔值0|1
的bash脚本。
下面这样的脚本示例:
# less /path/to/script/check_kernel.sh
#! /bin/bash
# Check if running kernel match default=0 kernel in grub.conf
KERNEL_RUNN=`/bin/uname -r | /bin/sed -e 's/^//' -e 's/[[:space:]]*$//'`
KERNEL_GRUB=`/bin/grep kernel /boot/grub/menu.lst | /bin/grep -v '#' \
| /bin/awk '{print $2}' | /bin/sed -e 's/\/vmlinuz-//g' | /usr/bin/head -1 \
| /bin/sed -e 's/^//' -e 's/[[:space:]]*$//'`
if [ "$KERNEL_RUNN" == "$KERNEL_GRUB" ]; then
exit 0
else
exit 1
fi
要在Puppet中运行上面的shell脚本,我将使用以下代码:
$check_kernel_cmd="/path/to/script/check_kernel.sh"
exec {'check_kernel':
provider => shell,
returns => [ "0", "1", ],
command => "$check_kernel_cmd",
}
所以现在我需要使用上面的exec资源Exec['check_kernel']
的返回退出状态作为另一个exec资源Exec['reboot_node']
的触发器,类似于:
if $check_kernel == '1' {
$reboot = "/sbin/runuser - root -s /bin/bash -c '/sbin/shutdown -r'"
exec {'reboot_node':
provider => shell,
command => "$reboot",
}
}
或者另一种风格方法可能是使用unless
,如下所示:
$reboot = "/sbin/runuser - root -s /bin/bash -c '/sbin/shutdown -r'"
exec {'reboot_node':
provider => shell,
command => "$reboot",
unless => "/bin/echo $check_kernel",
require => Exec['check_kernel'],
}
使用exec
资源的退出状态作为同一清单中另一个exec
资源的触发器,推荐的方法/代码是什么?
答案 0 :(得分:8)
TL; DR这不起作用。将您的第一个脚本设为external fact,以便您可以从清单中的变量查询其结果。或者,如果这是有效的,请通过后者的onlyif
或unless
参数调用之前的脚本,而不是作为自己的exec
资源。
答案很长
您考虑的方案与Puppet的主/代理范例不兼容。完整的清单一次编译,导致抽象表示,目录。整个目录被发送给代理商进行评估。只有这样,代理才会启动并同步资源,包括exec
个资源。有关其中任何一个的返回值的信息无法在清单中使用,因为此时清单不再可用。
主人使用代理机器信息的规范方式是Custom Facts。将代码放在代理程序使用的主服务器上并在编译之前运行。所有事实值都可以在清单中用作变量。
在诸如您的简单情况下,使用exec
作为检查脚本可能是不必要的。我相信以下内容可行。
exec {
'/sbin/shutdown -r':
unless => '/path/to/script/check_kernel.sh';
}
最后注意事项:通过某些自行开发的逻辑对您的Puppet代理进行编程以重启您的节点可能相当危险 - 默认情况下代理在启动时运行,因此最终可能会如果这种逻辑中断了(你可能会在主人身上解决这个问题,但它仍然不是一个令人愉快的观点)。