Dodanie repozytorium yum do marionetki, zanim zrobisz cokolwiek innego

26

Czy istnieje sposób, aby zmusić kukiełkę do zrobienia pewnych rzeczy w pierwszej kolejności? Na przykład potrzebuję go, aby zainstalować RPM na wszystkich serwerach, aby dodać repozytorium yum (Społeczność IUS) przed zainstalowaniem któregokolwiek z pakietów.

Jon Haddad
źródło
Bardziej złożony przypadek użycia znajduje się również w moim powiązanym pytaniu .
Matt McClure,

Odpowiedzi:

37

Jeśli chcesz się upewnić, że repozytorium jest zainstalowane na wszystkich serwerach, sugeruję coś takiego

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

Następnie dla każdego rozszerzającego się węzła basemożesz powiedzieć

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

Zapewni to

  • Pakiet barnie zostanie zainstalowany, dopóki nie zostanie zdefiniowane repozytorium IUS
  • Pakiet nie będzie próbował zainstalować przed zdefiniowaniem repozytorium IUS
Dave Cheney
źródło
Ach, okej To jest niesamowite. Nie widziałem tam yumrepo - dzięki!
Jon Haddad
Działa tylko z dystrybucjami używającymi Yum, więc tylko Rhel5, a nie Rhel4
Dave Cheney
2
Co się stanie, jeśli nie wiem, które repozytorium zawiera pakiet? Na przykład pakiet może być dostępny w repozytorium fedora na Fedorze i repozytorium epel na RHEL, CentOS itp. Oznacza to, że jeśli użyję przepisu / modułu innej firmy, będę musiał go dostosować.
Cristian Ciupitu,
17

Chociaż etapy mogą sobie z tym poradzić, podobnie jak konkretne zależności yum repo, lepiej jest zadeklarować ogólny związek.

Po prostu włóż Yumrepo <| |> -> Package <| provider != 'rpm' |>manifest lalek.

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

Dzięki temu wszystkie typy yumrepo zostaną przetworzone przed wszelkimi pakietami, które nie mają „rpm” jako dostawcy. To ostatnie wykluczenie polega na tym, że mogę użyć (na przykład) pakietu RPM do wydania epel, aby pomóc zainstalować repozytorium yum.

Steven Roberts
źródło
8

(Znalazłem to pytanie po tym, jak odpowiedziałem prawie tak samo ... więc pomyślałem, że moja odpowiedź dotyczy również tutaj i warto je powtórzyć (bezpieczniej jest mieć odpowiedź w dwóch miejscach ..)

O ile rozumiem, właśnie po to są etapy - pozwalają grupować i porządkować wykonania klas. Używam „etapów” do aktualizacji i konfiguracji APT na serwerach Debiana, co powinno być bardzo podobne do tego, co zamierzasz zrobić z YUM.

Przede wszystkim deklarujesz etap „mniam” na najwyższym poziomie (powyżej „węzłów”), aby klasy w etapie „mniam” były wykonywane przed „głównymi”:

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

Następnie przypisujesz etap do klas. Możesz to zrobić w definicji węzła:

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

  include packages
}
Aleksander Azarow
źródło
Dzięki za to :) Osobiście wolę to podejście od przyjętej odpowiedzi.
Michael Mior
5

Możesz użyć tagów . Umożliwiłoby to oznaczenie instalatora repozytorium firstrunczymś,

następnie uruchomić

 puppetd --tags firstrun

i wykona tylko moduły / instrukcje pasujące do znacznika.

Tom O'Connor
źródło
Właśnie tego szukałem - dzięki Tom!
Jon Haddad
3

Kluczową rzeczą, której musisz użyć, jest słowo kluczowe wymagające - „Oceń jedną lub więcej klas, dodając wymaganą klasę jako zależność”.

Przykładem użycia repozytorium apt może być:

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

(Na podstawie tego przykładu ładowania marionetek ).

Możesz więc zobaczyć, jak każdy etap wymaga, aby poprzedni został wykonany jako pierwszy. Zostawię cię, abyś zastanowił się, jak zastosować to do yum, ponieważ nie wiem, gdzie to przechowuje swoje pliki.

Hamish Downer
źródło
0

Puppet czyta konfigurację od góry do dołu, więc jeśli włączysz klasę z repozytorium yum jako pierwsze w tej klasie, repozytorium to zostanie dodane przed czymkolwiek innym.

Jeśli użyjesz wymaganych ustawień pakietu, upewnisz się, że wymagany typ zasobu jest obecny przed dodaniem pakietu, jako taki:

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

Powyższy kod doda repozytorium przed dodaniem pakietu.

rozerwać
źródło
10
Lalek używa języka deklaratywnego, więc nie martwi się o kolejność elementów w pliku. Obawiam się, że pierwszy akapit jest błędny. Prawidłowym sposobem na to jest użycie requiresłowa kluczowego, które zostało zrobione w drugiej części.
Hamish Downer,
0

Coś takiego działało dla mnie:

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

Zawarłem coś takiego na mysite.pp. W ten sposób twoje moduły kukiełkowe są wolne od odniesień do repozytorium yum.

Oscar Montoya
źródło