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



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

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

我使用以下层次结构数据:

---
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和带有unlessonlyif的CLI diff.script中的布尔值(0|1(?

我假设您的意思是,如果设置了$patch_now,则在一次扫描中安装所有列出的包。

您不应该使用onlyif进行测试。这是为了验证代理系统上的某些状态。如果master知道您的数据,您应该在清单结构中使用条件语句。

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会像你建议的那样工作,只是更简单而已。

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

只要确保exec需要file,你就应该没事了。

相关内容

  • 没有找到相关文章

最新更新