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

26

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

Джон Хаддад
источник
Для более сложного варианта использования см. Также мой связанный вопрос .
Мэтт МакКлюр

Ответы:

37

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

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
Дейв Чейни
источник
Ах хорошо. Это довольно круто. Я не видел там yumrepo - спасибо!
Джон Хаддад
Он работает только с дистрибутивами, использующими Yum, поэтому только Rhel5, а не Rhel4
Дейв Чейни
2
Что произойдет, если я не знаю, в каком репозитории есть пакет? Например, пакет может быть доступен в хранилище fedora на Fedora и в хранилище epel на RHEL, CentOS и т. Д. Это означает, что если я использую сторонний рецепт / модуль, мне придется его настраивать.
Кристиан Чиупиту
17

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

Просто вставьте Yumrepo <| |> -> Package <| provider != 'rpm' |>свой манифест марионетки.

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

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

Стивен Робертс
источник
8

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

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

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

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

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

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

  include packages
}
Александр Азаров
источник
Спасибо за это :) Я лично предпочитаю этот подход принятому ответу.
Майкл Миор
5

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

тогда беги

 puppetd --tags firstrun

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

Том О'Коннор
источник
Это именно то, что я искал - спасибо, Том!
Джон Хаддад
3

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

Примером использования репозитория 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, так как я не знаю, где он хранит свои файлы.

Хэмиш Даунер
источник
0

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
   }
}

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

tore-
источник
10
Puppet использует декларативный язык, поэтому он не беспокоится о порядке вещей в файле. Боюсь, ваш первый абзац неверен. Правильный способ сделать это - использовать requireключевое слово, которое вы сделали во второй части.
Хэмиш Даунер
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.

Оскар Монтойя
источник