为什么 Puppet 只需要每个包一次?

为什么 Puppet 只需要每个包一次?

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

  Duplicate declaration: Package[wget] is already declared 

我应该使用这样的功能吗?

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

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

答案1

您可以使用来自标准库模块

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

因此,如果其他类已经安装了 git,则会跳过该步骤。您不必担心在整个 puppet 配置中只定义一次包。

答案2

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

声明虚拟资源

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

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

include packages
realize Package['pigz']

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

参考:虚拟资源 Puppet 文档

相关内容