我在RHEL 6上运行Puppet v3.0,并通过exec
资源进行包管理。我想通过onlyif
和unless
将一些控制门添加到我的清单中。
首先,我想使用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和带有unless
和onlyif
的CLI diff.script中的布尔值(0|1(?
我假设您的意思是,如果设置了$patch_now
,则在一次扫描中安装所有列出的包。
您不应该使用onlyif
进行测试。这是为了验证代理系统上的某些状态。如果master知道您的数据,您应该在清单结构中使用条件语句。
if $patch_now {
exec { ... }
}
但是,请使用true
和false
而不是1
和0
作为标志的值-在布尔上下文中,1
和0
都等于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
只使用不同的参数运行此脚本(。
在您的评论中收到更多信息后编辑。
为了使这项工作干净,我推荐以下内容。
让Puppet将您的Hiera数据传输到代理
file { '/opt/wanted-packages': content => inline_template('<%= package_list * "n" %>') }
diff会像你建议的那样工作,只是更简单而已。
diff /opt/wanted-packages <(facter ...)
只要确保exec
需要file
,你就应该没事了。