Додайте yum repo до маріонетки, перш ніж робити щось інше


26

Чи є спосіб змусити ляльку спочатку робити певні справи? Наприклад, мені це потрібно, щоб встановити RPM на всіх серверах, щоб додати сховище yum (IUS Community), перш ніж я встановити будь-який з пакетів.


Більш складний випадок використання див. Також моє відповідне питання .
Метт МакКлюр

Відповіді:


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 і т.д. Це означає , що , якщо я використовую рецепт третій партії / модуль я повинен налаштувати його.
Cristian Ciupitu

17

Хоча етапи можуть впоратися з цим і так можуть мати конкретні залежності від yum repo, краще оголосити відносини загально.

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

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

Це робить так, що всі типи yumrepo будуть оброблені перед будь-якими пакунками, які не мають 'rpm' в якості свого постачальника. Останнє виключення полягає в тому, що я можу використовувати (наприклад) пакет RPM epel-release, щоб допомогти встановити yum repo.


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

Ключове, що вам потрібно використовувати, - це ключове слово вимагати - "Оцініть один чи кілька класів, додавши необхідний клас як залежність".

Прикладом використання підходящого сховища може бути:

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

Лялька зчитує конфігурацію зверху вниз, тому якщо ви включите клас з першим 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
   }
}

Цей код вище додасть репо перед додаванням пакету.


10
Лялька використовує декларативну мову, тому не турбується про порядок речей у файлі. Ваш перший абзац неправильний, боюся. Правильний спосіб зробити це - використовувати 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 repos.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.