Назад | Перейти на главную страницу

Puppet, установка зависимостей

Начинаю настраивать марионетку. Я хочу настроить зависимости, согласно которым агент передачи почты должен быть установлен до того, как этот класс попытается установить или запустить что-либо. С марионеткой стандартный метод, кажется, устанавливает зависимость, кажется, 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 в будущем этот «конфликтующий-пакет-А» будет автоматически заменен на «конфликтующий-пакет-Б».