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

标签 puppet exit

我有一个 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/

相关文章:

ssl - 通过 vagrant vm 生成用于测试 nginx 的自签名证书

linux - 我可以使用 puppet 停止 Linux 服务器上的服务吗?

android - Application.Quit()导致游戏应用崩溃

ruby - 如何使用 Puppet Ruby DSL 定义类继承

function - 如何从与其定义的模块不同的模块调用 puppet 函数

使用 Puppet & Hiera 的 Git 工作流

javascript - 满足特定条件时停止 JavaScript 函数

c - 分配var = 0.0时程序退出;

javascript - 无错误/异常地终止 Javascript

windows - 为什么这个 Perl 脚本在 60 秒后不退出或死掉?