Чи є спосіб змусити ляльку спочатку робити певні справи? Наприклад, мені це потрібно, щоб встановити RPM на всіх серверах, щоб додати сховище yum (IUS Community), перш ніж я встановити будь-який з пакетів.
Чи є спосіб змусити ляльку спочатку робити певні справи? Наприклад, мені це потрібно, щоб встановити RPM на всіх серверах, щоб додати сховище yum (IUS Community), перш ніж я встановити будь-який з пакетів.
Відповіді:
Якщо ви хочете переконатися, що сховище встановлено на всіх ваших серверах, я б запропонував щось подібне
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 repo, краще оголосити відносини загально.
Просто покладіть Yumrepo <| |> -> Package <| provider != 'rpm' |>
у свій ляльковий маніфест.
node default {
Yumrepo <| |> -> Package <| provider != 'rpm' |>
}
Це робить так, що всі типи yumrepo будуть оброблені перед будь-якими пакунками, які не мають 'rpm' в якості свого постачальника. Останнє виключення полягає в тому, що я можу використовувати (наприклад) пакет RPM epel-release, щоб допомогти встановити yum repo.
(Я знайшов це запитання після того, як я відповів майже так само . Тому я подумав, що моя відповідь застосовується і тут, і це варто повторити (безпечніше відповісти у двох місцях.)
Наскільки я розумію, саме для цього і є етапи - вони дозволяють групувати та замовляти виконання класів. Я використовую "етапи" для оновлення та налаштування APT на серверах Debian, що має бути дуже схожим на те, що ви збираєтеся робити з YUM.
Перш за все, ви оголошуєте "yum" етап на верхньому рівні (над "вузлами"), так що класи на "yum" стадії будуть виконуватися перед "основними" з них:
stage { 'yum' : before => Stage['main'] }
Потім ви присвоюєте етап класам. Це можна зробити правильно у визначенні вашого вузла:
node default {
class { 'yumrepos' : stage => yum }
include packages
}
Ви можете використовувати теги . Це дозволить вам позначити інсталятор РЕПО firstrun
чи іншим,
потім біжи
puppetd --tags firstrun
і він би виконував лише модулі / оператори, що відповідають тегу.
Ключове, що вам потрібно використовувати, - це ключове слово вимагати - "Оцініть один чи кілька класів, додавши необхідний клас як залежність".
Прикладом використання підходящого сховища може бути:
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, оскільки я не знайомий з тим, де він зберігає файли.
Лялька зчитує конфігурацію зверху вниз, тому якщо ви включите клас з першим yum repo в цей клас, це репо буде додано раніше.
Якщо ви використовуєте параметри вимагати в пакеті, ви перед тим, як додати пакет, переконайтесь, що потрібний тип ресурсу присутній:
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 repos.