我在RHEL 6上运行Puppet v3.0并且正在通过exec
资源进行包管理。
我想通过onlyif
和unless
在我的清单中添加一些控制门。
首先,我想使用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)和上面上下文中带有unless
和onlyif
的CLI diff.script?
答案 0 :(得分:0)
如果设置$patch_now
,我假设您要在一次扫描中安装所有列出的软件包。
您不应使用onlyif
对其进行测试。这是为了验证代理系统上的某些状态。如果主服务器知道您的数据,则应在清单结构中使用条件。
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 /opt/wanted-packages <(facter ...)
请确保exec
需要file
,您应该没问题。