![为什么 Puppet 只需要每个包一次?](https://linux22.com/image/799879/%E4%B8%BA%E4%BB%80%E4%B9%88%20Puppet%20%E5%8F%AA%E9%9C%80%E8%A6%81%E6%AF%8F%E4%B8%AA%E5%8C%85%E4%B8%80%E6%AC%A1%EF%BC%9F.png)
在类中定义依赖项时,每个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”类。