在类中定义依赖关系时,每个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