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

时间:2014-08-12 12:00:23

标签: puppet exit

我有一个执行检查并返回布尔值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资源的触发器,推荐的方法/代码是什么?

1 个答案:

答案 0 :(得分:8)

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


答案很长

您考虑的方案与Puppet的主/代理范例不兼容。完整的清单一次编译,导致抽象表示,目录。整个目录被发送给代理商进行评估。只有这样,代理才会启动并同步资源,包括exec个资源。有关其中任何一个的返回值的信息无法在清单中使用,因为此时清单不再可用。

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

在诸如您的简单情况下,使用exec作为检查脚本可能是不必要的。我相信以下内容可行。

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

最后注意事项:通过某些自行开发的逻辑对您的Puppet代理进行编程以重启您的节点可能相当危险 - 默认情况下代理在启动时运行,因此最终可能会如果这种逻辑中断了(你可能会在主人身上解决这个问题,但它仍然不是一个令人愉快的观点)。