为什么 Puppet 可以要求每个包一次?

Tom*_*art 6 configuration-management puppet

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

  Duplicate declaration: Package[wget] is already declared 
Run Code Online (Sandbox Code Playgroud)

我应该使用这样的函数吗?

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

我希望配置工具默认处理这个问题......我错过了什么吗?

小智 7

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

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

所以,如果 git 已经被其他一些类安装了,那将被跳过。您不应该在整个 puppet 配置中只定义一次包。

  • 更好的是 `ensure_packages(['git'])`,它也是 stdlib 的一个函数 (4认同)

Cra*_*son 5

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

声明一个虚拟资源

class packages {
  @package {
    ['cryptsetup-bin',
     'cryptsetup',
     'cifs-utils',
     'e2fsprogs',
     'libmysql-ruby',
     'parted',
     'pigz',
      'sshfs' ]:
        ensure => present,
    }
}
Run Code Online (Sandbox Code Playgroud)

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

include packages
realize Package['pigz']
Run Code Online (Sandbox Code Playgroud)

另一种方法是将重复的代码分离到另一个类中——即“wget”类。

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