Начинаю настраивать марионетку. Я хочу настроить зависимости, согласно которым агент передачи почты должен быть установлен до того, как этот класс попытается установить или запустить что-либо. С марионеткой стандартный метод, кажется, устанавливает зависимость, кажется, require blah
. Проблема в том, что я не использую один и тот же MTA на всех своих системах. Некоторые из систем, которые являются фактическими почтовыми серверами, у меня есть полный MTA (exim), но в подавляющем большинстве моих систем установлен ssmtp. Я хочу настроить требование, чтобы любой из этих MTA был установлен и работал до того, как foo
класс обрабатывается.
Вот конфигурация, которая отчасти демонстрирует то, что я пытаюсь сделать.
node default {
if $fqdn in ["mail1.example.org",
"mail2.example.org",
"mail3.example.org"] {
include fullmta # mailhub, and so on
} else {
include ssmtp # really basic send-only mta.
}
include foo # class that requries an mta be installed
}
class foo {
require MTA # FIXME, A valid mta is required.
package { foo: ensure => present, }
... # also a service, and some files, and so on...
}
Итак, в моем классе foo, как мне потребовать, чтобы один из возможных классов MTA был обработан?
Если вы разделите логику MTA на отдельный класс, вы можете обрабатывать логику там - и вашим ресурсам может потребоваться класс MTA для обеспечения отношения зависимости.
node default {
include mta
include foo # class that requries an mta be installed
}
class mta {
if $fqdn in ["mail1.example.org",
"mail2.example.org",
"mail3.example.org"] {
include fullmta # mailhub, and so on
} else {
include ssmtp # really basic send-only mta.
}
}
class foo {
package { foo: ensure => present,
require => Class['mta'], }
... # also a service, and some files, and so on...
}
Используйте псевдоним. Что-то вроде этого:
service { "ssmtp":
...
alias => "MTA",
}
service { "fullmta":
...
alias => "MTA",
}
class foo {
package { foo:
ensure => present,
require => Service["mta"],
...
}
...
}
Вы можете указать require
зависимости как массивы, и в этом случае Puppet проверит соблюдение всех зависимостей, прежде чем продолжить. В этой ситуации я обычно делаю что-то вроде следующего:
node default {
include mta
include foo # class that requries an mta be installed
}
class mta {
if $fqdn in ["mail1.example.org",
"mail2.example.org",
"mail3.example.org"] {
package { "conflicting-package-A": ensure => present, }
package { "conflicting-package-B": ensure => absent, }
} else {
package { "conflicting-package-A": ensure => absent, }
package { "conflicting-package-B": ensure => present, }
}
}
class foo {
package { foo: ensure => present,
require => [Package["conflicting-package-A",
"conflicting-package-B"], }
... # also a service, and some files, and so on...
}
Таким образом, вы не только убедитесь, что foo
пакет явно зависит от обоих других пакетов, но вы настроили его так, чтобы при удалении хоста из mail*.example.org
list в будущем этот «конфликтующий-пакет-А» будет автоматически заменен на «конфликтующий-пакет-Б».