【问题标题】:Puppet, how to use the exec return value as a trigger?Puppet,如何使用 exec 返回值作为触发器?
【发布时间】:2023-03-27 09:36:01
【问题描述】:

我有一个执行检查并返回布尔值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 资源的触发器?

【问题讨论】:

    标签: puppet exit


    【解决方案1】:

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


    长答案

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

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

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

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

    最后说明:对 Puppet 代理进行编程以通过一些本地逻辑重新启动节点可能相当危险 - 代理默认在启动时运行,因此它可能会结束如果该逻辑中断,将陷入恶性循环(您可能可以在 master 上解决此问题,但这仍然不是一个令人愉快的观点)。

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 2013-04-24
      • 2017-09-08
      • 2017-04-07
      • 1970-01-01
      相关资源
      最近更新 更多