我有一个执行检查并返回布尔值的bash脚本0|1.下面这样的脚本示例:
# 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
Run Code Online (Sandbox Code Playgroud)
要在Puppet中运行上面的shell脚本,我将使用以下代码:
$check_kernel_cmd="/path/to/script/check_kernel.sh"
exec {'check_kernel':
provider => shell,
returns => [ "0", "1", ],
command => "$check_kernel_cmd",
}
Run Code Online (Sandbox Code Playgroud)
所以现在我需要使用上面的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",
}
}
Run Code Online (Sandbox Code Playgroud)
或者可能使用另一种风格方法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'],
}
Run Code Online (Sandbox Code Playgroud)
建议的方法/代码将使用exec资源的退出状态作为exec同一清单中另一个资源的触发器会是什么?
TL; DR这不起作用.使您的第一个脚本成为外部事实,以便您可以从清单中的变量查询其结果.或者,如果它有效,则通过后者onlyif或unless参数调用先前脚本,而不是作为其自己的exec资源.
答案很长
您想到的方案与Puppet的主/代理范例不兼容.完整的清单一次编译,导致抽象表示,目录.整个目录被发送给代理商进行评估.只有这样,代理才会启动并同步资源,包括两种exec资源.有关其中任何一个的返回值的信息无法在清单中使用,因为此时清单不再可用.
主机使用代理机器信息的规范方式是Custom Facts.将代码放在代理程序使用的主服务器上并在编译之前运行.所有事实值都可以在清单中用作变量.
在诸如你的简单情况下,使用execcheck for script可能是不必要的.我相信以下内容可行.
exec {
'/sbin/shutdown -r':
unless => '/path/to/script/check_kernel.sh';
}
Run Code Online (Sandbox Code Playgroud)
最后注意事项:对Puppet代理进行编程以通过某些自行开发的逻辑重启节点可能相当危险 - 默认情况下代理在启动时运行,因此如果逻辑中断,它可能会以恶性循环结束(您可以在主服务器上修复它) ,但它仍然不是一个愉快的观点).