Puppet onlyif,除非来自Hiera和CLI脚本输出中的布尔数据的条件测试

时间:2014-07-23 15:02:46

标签: diff puppet hiera

我在RHEL 6上运行Puppet v3.0并且正在通过exec资源进行包管理。 我想通过onlyifunless在我的清单中添加一些控制门。

首先,我想使用Hiera [自动查找功能]中定义的布尔值。 其次,我想使用运行diff <() <()的bash脚本中的布尔值。

我使用以下hiera数据:

---
my-class::package::patch_now:
 0

my-class::package::package_list:
 acl-2.2.49-6.el6-x86_64
 acpid-1.0.10-2.1.el6-x86_64
...etc

我的清单如下:

# less package.pp
class my-classs::package(
$package_list,
$patch_now,
){
   exec {'patch_packages':
      provider => shell,
      path => [ "/bin/", "/usr/bin/" ],
      logoutput => true,
      timeout => 100,
      command => "yum update -e0 -d0 -y $package_list",
      unless => "/path/to/my-diff.script 2>&1 > /dev/null",
      onlyif => "test 0 -eq $patch_now",
   }
}

我如何测试Hiera中的布尔值(0 | 1)和上面上下文中带有unlessonlyif的CLI diff.script?

1 个答案:

答案 0 :(得分:0)

如果设置$patch_now,我假设您要在一次扫描中安装所有列出的软件包。

您不应使用onlyif对其进行测试。这是为了验证代理系统上的某些状态。如果主服务器知道您的数据,则应在清单结构中使用条件。

if $patch_now {
    exec { ... }
}

但请使用truefalse代替10作为标记的值 - 10都是在布尔上下文中等于true

无论如何,你的YAML看起来很有趣。

定义单个值:

my-class::package::patch_now: false

定义数组:

my-class::package::package_list:
  - acl-2.2.49-6.el6-x86_64
  - acpid-1.0.10-2.1.el6-x86_64
  - ...

在类中使用数组时,不能只将它放在"yum update -e0 -d0 -y $package_list"之类的字符串中,因为它会扩展为"yum update -e0 -d0 -y acl-2.2.49-6.el6-x86_64acpid-1.0.10-2.1.el6-x86_64...",元素之间没有空格。

要使用空格连接元素,请使用stdlib中的join函数 模块。

$packages = join($package_list, ' ')
...
"yum update -e0 -d0 -y $packages"

老实说,我不知道你的diff <() <()应该如何运作。整个方法看起来有点复杂。我怀疑通过一些调整,你的diff脚本可能会自己执行更新(因此exec只运行带有不同参数的脚本)。

在您的评论中收到更多信息后,

编辑

为了使这项工作干净利落,我建议如下。

  1. 让Puppet将您的Hiera数据传输到代理

    file { '/opt/wanted-packages': content => inline_template('<%= package_list * "\n" %>') }

  2. 然后差异就会像你建议的那样工作,只会更简单。

    diff /opt/wanted-packages <(facter ...)

  3. 请确保exec需要file,您应该没问题。