为什么Puppet只需要一个包?

在类中定义依赖关系时,每个Package可以全局定义一次。 我有configuration的层次结构,一些软件包应该安装在所有机器上(进入默认configuration),但其他应该只安装在某些类别的机器上。 当Puppet威胁是重复的声明时,我该如何检查这个包是否已经在机器上?

  Duplicate declaration: Package[wget] is already declared 

我应该使用这样的function吗?

  if defined( Package[$package] ) { debug("$package already installed") } else { package { $package: ensure => $ensure } } 

我期望从configuration工具默认处理这个问题…我错过了什么?

您可以使用stdlib模块中的ensure_resource():

 $packages = $::osfamily ? { 'Debian' => [ 'fcgiwrap', ], 'RedHat' => [ 'spawn-fcgi', 'git' ], } ensure_resource('package', $packages, {'ensure' => 'present'}) 

所以说,如果git已经被其他一些类安装了,那么就会跳过。 你不应该只在整个傀儡configuration中定义一个包。

当你有重复的软件包时,这是处理它的一种方法。 另一种方法是首先通过使用虚拟资源来避免这个问题:

声明一个虚拟资源

 class packages { @package { ['cryptsetup-bin', 'cryptsetup', 'cifs-utils', 'e2fsprogs', 'libmysql-ruby', 'parted', 'pigz', 'sshfs' ]: ensure => present, } } 

实现虚拟资源(可以多次实现资源):

 include packages realize Package['pigz'] 

另一种方法是将重复的代码分离出来,也就是一个“wget”类。

木偶文件: http : //docs.puppetlabs.com/guides/virtual_resources.html