0

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

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

我使用以下层次数据:

---
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",
   }
}

unless我将如何在上面的上下文中测试来自 Hiera 的布尔值 (0|1)和CLI diff.script onlyif

4

1 回答 1

0

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

您不应该使用onlyif. 这是为了验证代理系统上的某些状态。如果主人知道你的数据,你应该在清单结构中使用条件。

if $patch_now {
    exec { ... }
}

但是请使用trueandfalse而不是1and0作为标志的值 -在布尔上下文中两者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 <() <()应该如何工作。整个方法看起来有点复杂。我怀疑通过一些调整,您的差异脚本可能会自行执行更新(因此exec只需使用不同的参数运行此脚本)。

在您的评论中收到更多信息后进行编辑。

为了使这项工作干净利落,我推荐以下内容。

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

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

  2. 然后差异将按照您的建议工作,只是更简单。

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

只要确保exec需要file,你应该没问题。

于 2014-07-23T20:35:12.587 回答