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

Добавление репозитория yum в марионетку, прежде чем делать что-либо еще

Есть ли способ заставить марионетку сначала делать определенные вещи? Например, мне нужно установить RPM на всех серверах, чтобы добавить репозиторий yum (Сообщество IUS) перед установкой любого из пакетов.

Если вы хотите убедиться, что репозиторий установлен на всем вашем сервере, я бы предложил что-то вроде этого

node default {
   include base
}

class base {
   yumrepo { "IUS":
      baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture",
      descr => "IUS Community repository",
      enabled => 1,
      gpgcheck => 0
   }
}

Тогда для любого узла, который расширяется base ты можешь сказать

class foo {
   package { "bar": ensure => installed, require => Yumrepo["IUS"] }
}

Это гарантирует, что

  • Посылка bar не будет установлен, если не определен репозиторий IUS
  • Пакет не будет пытаться установить, пока не будет определен репозиторий IUS.

Хотя этапы могут справиться с этим, как и определенные зависимости репозитория yum, лучше объявить связь в общем виде.

Просто положи Yumrepo <| |> -> Package <| provider != 'rpm' |> в вашем марионеточном манифесте.

node default {
  Yumrepo <| |> -> Package <| provider != 'rpm' |>
}

Это делает так, что все типы yumrepo будут обрабатываться перед любыми пакетами, у которых в качестве поставщика нет rpm. Последнее исключение состоит в том, что я могу использовать (например) пакет RPM epel-release для установки репозитория yum.

(Я нашел этот вопрос после того, как ответил почти тот же самый.. так что подумал, что мой ответ применим и здесь, и его стоит повторить (безопаснее иметь ответ в двух местах ..)

Насколько я понимаю, это именно то, что этапы для - они позволяют группировать и упорядочивать выполнение классов. Я использую «этапы» для обновления и настройки APT на серверах Debian, что должно быть очень похоже на то, что вы собираетесь делать с YUM.

Прежде всего, вы объявляете стадию «yum» на верхнем уровне (над «узлами»), чтобы классы на стадии «yum» выполнялись раньше, чем «main»:

stage { 'yum' : before => Stage['main'] }

Затем вы назначаете этап на классы. Вы можете сделать это прямо в определении вашего узла:

node default {
  class { 'yumrepos' : stage => yum }

  include packages
}

Вы могли бы использовать Теги. Это позволит вам пометить установщик репо с помощью firstrun или что-то,

затем беги

 puppetd --tags firstrun

и он будет выполнять только модули / операторы, соответствующие тегу.

Главное, что вам нужно - это требовать ключевое слово - «Оценить один или несколько классов, добавив требуемый класс в качестве зависимости».

Примером использования репозитория apt может быть:

class installcustompackages {
   # make sure we have the repository file and public key
   file { "/etc/apt/sources.list.d/myrepo.list":
      source => "puppet://puppet/files/etc/apt/sources.list.d/myrepo.list",
      ensure => present;
          "/etc/apt/trusted.gpg":
      source => "puppet://puppet/files/etc/apt/trusted.gpg",
   }

   # do an update whenever the list or trusted key file change
   exec { "/usr/bin/apt-get update":
      alias => "aptgetupdate",
      require => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
      subscribe => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
      refreshonly => true;
   }

   package { "mypackage":
      ensure => latest,
      require => Exec["aptgetupdate"];
             "mypackage2":
      ensure => latest,
      require => Exec["aptgetupdate"];
   }

   service { "myservice":
      enable => false,
      require => Package[mypackage];
   }
}

(Адаптировано из этот пример марионеточной начальной загрузки).

Таким образом, вы можете видеть, как каждый этап требует, чтобы сначала выполнялся предыдущий. Я оставлю вам разобраться, как применить это к yum, поскольку я не знаком с тем, где он хранит свои файлы.

Puppet читает конфигурацию сверху вниз, поэтому, если вы сначала включите класс с репозиторием yum в этот класс, это репо будет добавлено раньше всего.

Если вы используете требуемые параметры в пакете, вы убедитесь, что требуемый тип ресурса присутствует перед добавлением пакета, как такового:

node 'yournode.domain.com' {
   package { "bar": ensure => installed, require => Yumrepo["IUS"] }
   yumrepo { "IUS":
      baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture",
      descr => "IUS Community repository",
      enabled => 1,
      gpgcheck => 0
   }
}

Этот код выше добавит репо перед добавлением пакета.

У меня сработало что-то вроде этого:

yumrepo { A:
  descr    => "A repo",
  baseurl  => '',
  enabled  => 1,
  gpgcheck => 1,
  gpgkey   => "",
  priority => 3
}

yumrepo { B:
  descr    => "B repo",
  baseurl  => '',
  enabled  => 1,
  gpgcheck => 1,
  gpgkey   => "",
  priority => 3
}

yumrepo { C:
  descr    => "C repo",
  baseurl  => '',
  enabled  => 1,
  gpgcheck => 1,
  gpgkey   => "",
  priority => 3;
}

Package {
  require => [Yumrepo[A], Yumrepo[B], Yumrepo[C]]
}

Я включил что-то подобное на mysite.pp. Таким образом, ваши модули марионеток не содержат ссылок на репозитории yum.