Обзор
Я только начал использовать Puppet и ничего не мог понять.
Проблема
Из-за нормализации, когда я добавляю два класса к узлу с пакетами, имеющими одинаковые зависимости, происходит сбой.
Проще говоря, у вас есть дублирующиеся ресурсы - в данном случае пакет libssl
.
Примечание: пакеты удерживаются, чтобы предотвратить установку последних пакетов.
Вопрос
Как лучше всего обойти это?
class ssh {
package { 'openssh-server':
ensure => installed,
require => Package['libssl'],
}
package { 'libssl': ensure => installed, }
}
class apache {
package { 'apache':
ensure => installed,
require => Package['libssl'],
}
package { 'libssl': ensure => installed, }
}
node server {
include apache
include openssl-server
У вас есть два варианта, которые будут выглядеть почти одинаково.
1: сделайте это своим классом.
class ssh {
package { 'openssh-server':
ensure => present,
require => Class['ssl'],
}
}
class ssl {
package { 'libssl': ensure => present, }
}
2: виртуальный ресурс
class vpackages {
@package { 'libssl': }
}
class ssh {
include vpackages
package { 'openssh-server':
ensure => present,
require => Package['libssl'],
}
realize Package['libssl']
}
Я считаю, что лучше разбить зависимости на их собственные модули, чем использовать виртуальные ресурсы.
Если вы используете стандартное управление пакетами для управления пакетами, установленными через Puppet, вы можете не включать libssl
зависимости пакетов в Puppet, поскольку это будет обрабатываться автоматически через систему управления пакетами в большинстве систем.
В Debian / Ubuntu, а также в системах RedHat / CentOS / SuSE инструменты управления пакетами будут искать зависимости, и, если вы не изо всех сил стараетесь остановить поведение по умолчанию, дополнительные зависимые пакеты будут включены, когда Puppet скажет системе об установке пакет (в вашем случае просто openssh-server
или apache
)
Это немного уродливо, но есть функция defined (), которая возвращает истину / ложь. Таким образом, вы можете определять ресурсы несколько раз, но «осознавать» их только при первой оценке. (используйте этапы марионеточного запуска!)
например.,
if defined(Package['libssl']) == false {
package { 'libssl':
ensure => installed,
}
}