При определении зависимостей в классе каждый Package
можно глобально определить только один раз. У меня есть иерархия конфигурации, и некоторые пакеты должны быть установлены на всех машинах (это относится к конфигурации по умолчанию), но другие должны быть установлены только на некоторых категориях машин. Как я должен проверять, находится ли этот пакет уже на машине, когда угроза Puppet представляет собой повторяющееся объявление?
Duplicate declaration: Package[wget] is already declared
я должен использовать такую функцию?
if defined( Package[$package] ) {
debug("$package already installed")
} else {
package { $package: ensure => $ensure }
}
Я ожидал, что инструмент настройки решит эту проблему по умолчанию ... Я что-то упускаю?
Вы можете использовать sure_resource () из модуль stdlib:
$packages = $::osfamily ? {
'Debian' => [ 'fcgiwrap', ],
'RedHat' => [ 'spawn-fcgi', 'git' ],
}
ensure_resource('package', $packages, {'ensure' => 'present'})
Так, скажем, если git уже установлен каким-то другим классом, это будет пропущено. Вам не следует заботиться об определении пакета только один раз в конфигурации марионетки.
Если у вас есть повторяющиеся пакеты, это один из способов борьбы с этим. Другой способ - в первую очередь избежать проблемы с помощью виртуальных ресурсов:
Объявление виртуального ресурса
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