gpt4 book ai didi

Puppet,如何使用exec返回值作为触发器?

转载 作者:行者123 更新时间:2023-12-04 23:21:24 26 4
gpt4 key购买 nike

我有一个 bash 脚本,它执行检查并返回一个 bool 值 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

要在 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同一 list 中的资源?

最佳答案

TL; DR 这行不通。将您的第一个脚本设为 external fact以便您可以从 list 中的变量查询其结果。或者,如果这是有效的,则通过后者的 onlyif 调用先前的脚本或 unless参数,而不是它自己的 exec资源。

长答案

您想到的方案与 Puppet 的主/代理范式不兼容。完整的 list 是一次性编译的,导致抽象表示,即目录。将整个目录发送给代理进行评估。只有这样代理才会启动和同步资源,包括 exec资源。无法在 list 中使用有关它们中任何一个的返回值的信息,因为此时 list 不再可用。

主机使用来自代理机器的信息的规范方式是自定义事实。您将代码放置在代理在编译之前使用和运行的主服务器上。所有事实值都可以在 list 中用作变量。

在像您这样的简单情况下,使用 exec因为检查脚本可能是不必要的。我相信以下方法会奏效。

exec {
'/sbin/shutdown -r':
unless => '/path/to/script/check_kernel.sh';
}

最后说明:编写您的 Puppet 代理以通过一些自有逻辑重新启动您的节点可能相当危险——代理默认在启动时运行,因此如果该逻辑中断,它可能最终陷入恶性循环(您可能可以在主服务器上修复它,但它是仍然不是一个愉快的观点)。

关于Puppet,如何使用exec返回值作为触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25263746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com