Можно использовать функцию ensure_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'.
Puppet Doc: http://docs.puppetlabs.com/guides/virtual_resources.html