Есть ли способ заставить куклу сначала делать определенные вещи? Например, мне нужно установить RPM на всех серверах, чтобы добавить репозиторий yum (сообщество IUS) перед установкой любого из пакетов.
Есть ли способ заставить куклу сначала делать определенные вещи? Например, мне нужно установить 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Хотя этапы могут справиться с этим, как и конкретные зависимости репозитория yum, лучше объявить отношения в общем виде.
Просто вставьте Yumrepo <| |> -> Package <| provider != 'rpm' |>
свой манифест марионетки.
node default {
Yumrepo <| |> -> Package <| provider != 'rpm' |>
}
Это делает так, что все типы yumrepo будут обработаны перед любыми пакетами, у которых нет 'rpm' в качестве их провайдера. Последнее исключение заключается в том, что я могу использовать (например) RPM-пакет epel-release, чтобы помочь установить репозиторий yum.
(Я нашел этот вопрос после того, как ответил почти одинаково .. поэтому я подумал, что мой ответ применим и здесь, и стоит повторить его (безопаснее иметь ответ в двух местах ...)
Насколько я понимаю, это именно то , для чего нужны этапы - они позволяют группировать и упорядочивать выполнение классов. Я использую «этапы» для обновления и настройки APT на серверах Debian, что должно быть очень похоже на то, что вы собираетесь делать с YUM.
Прежде всего, вы объявляете этап «yum» на верхнем уровне (выше «узлов»), чтобы классы на этапе «yum» выполнялись раньше, чем «основные»:
stage { 'yum' : before => Stage['main'] }
Затем вы назначаете сцену классам. Вы можете сделать это прямо в определении вашего узла:
node default {
class { 'yumrepos' : stage => yum }
include packages
}
Вы можете использовать теги . Это позволит вам пометить установщик репо с firstrun
чем-то,
тогда беги
puppetd --tags firstrun
и он будет выполнять только модули / операторы, соответствующие тегу.
Главное, что вам нужно использовать, это ключевое слово 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, так как я не знаю, где он хранит свои файлы.
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
}
}
Этот код выше добавит репо перед добавлением пакета.
require
ключевое слово, которое вы сделали во второй части.
Как-то так у меня сработало
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.