Frage Hinzufügen eines Yum-Repos zu einer Puppe, bevor Sie etwas anderes tun


Gibt es eine Möglichkeit, die Puppe dazu zu bringen, bestimmte Dinge zuerst zu tun? Zum Beispiel muss ich ein RPM auf allen Servern installieren, um ein Yum-Repository (IUS Community) hinzuzufügen, bevor ich eines der Pakete installiere.


25
2018-02-11 00:49


Ursprung


Für einen komplexeren Anwendungsfall, siehe auch my verwandte Frage. - Matt McClure


Antworten:


Wenn Sie sicherstellen möchten, dass ein Repository auf Ihrem gesamten Server installiert ist, würde ich Ihnen Folgendes vorschlagen

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

Dann für jeden Knoten, der sich ausdehnt base Sie können sagen

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

Dies wird sicherstellen, dass

  • Das Paket bar wird nur installiert, wenn das IUS-Repository definiert ist
  • Das Paket wird nicht versuchen zu installieren, bevor das IUS-Repository definiert ist

35
2018-02-21 04:52



Ah, ok. Das ist ziemlich toll. Ich habe das Yumrepo nicht dort gesehen - danke! - Jon Haddad
Es funktioniert nur mit Distributionen, die Yum verwenden, also nur Rhel5, nicht Rhel4 - Dave Cheney
Was passiert, wenn ich nicht weiß, in welchem ​​Repository ein Paket enthalten ist? Zum Beispiel könnte ein Paket in der Fedora Repository auf Fedora und in der Epel Repository auf RHEL, CentOS usw. Das bedeutet, dass wenn ich ein Rezept / Modul eines Drittanbieters verwende, muss ich es anpassen. - Cristian Ciupitu


Obwohl Phasen damit umgehen können und auch spezifische Yum-Repo-Abhängigkeiten, ist es besser, die Beziehung generisch zu deklarieren.

Einfach gesagt Yumrepo <| |> -> Package <| provider != 'rpm' |> in deinem Puppenmanifest.

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

Dies macht es so, dass alle yumrepo-Typen vor allen Paketen verarbeitet werden, die nicht 'rpm' als ihren Provider haben. Dieser letztere Ausschluss ist so, dass ich das (zB) RPM-Paket von epel-release verwenden kann, um bei der Installation des yum-Repos zu helfen.


17
2017-12-31 01:01





(Ich habe diese Frage gefunden, nachdem ich fast geantwortet habe das Gleiche.. so dachte meine Antwort gilt auch hier und es ist es wert, es zu wiederholen (es ist sicherer, eine Antwort an zwei Stellen zu haben ..)

Soweit ich verstehe, ist dies genau das Phasen sind für - sie ermöglichen es Ihnen, Klassenausführungen zu gruppieren und zu bestellen. Ich benutze "Stufen", um APT auf Debian-Servern zu aktualisieren und zu konfigurieren, was sehr ähnlich zu dem sein soll, was Sie mit YUM machen werden.

Als erstes deklarieren Sie die Stufe "yum" auf oberster Ebene (oberhalb von "nodes"), so dass Klassen in der "yum" -Stufe vor "main" ausgeführt werden:

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

Dann weisen Sie den Klassen eine Stufe zu. Sie können dies in Ihrer Knotendefinition richtig machen:

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

  include packages
}

8
2018-06-06 12:53



Danke dafür :) Ich persönlich bevorzuge diese Herangehensweise an die angenommene Antwort. - Michael Mior


Du könntest benutzen Stichworte. Dies würde es Ihnen ermöglichen, den Repo-Installer mit zu markieren firstrun oder so,

dann renne

 puppetd --tags firstrun

und es würde nur die Module / Anweisungen ausführen, die dem Tag entsprechen.


5
2018-02-11 08:51



Genau das habe ich gesucht - danke Tom! - Jon Haddad


Der Schlüssel, den Sie verwenden müssen, ist der benötigen Schlüsselwort - "Evaluiere eine oder mehrere Klassen und füge die erforderliche Klasse als Abhängigkeit hinzu."

Ein Beispiel für ein Apt-Repository könnte sein:

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

(Angepasst von Dieses Beispiel des Marionettenbootstrappings).

So können Sie sehen, wie jede Stufe erfordert, dass die vorherige zuerst getan wird. Ich überlasse es dir, herauszufinden, wie ich dies auf yum anwenden kann, da ich nicht weiß, wo es seine Dateien speichert.


3
2018-02-20 23:22





Puppet liest die Konfiguration von oben nach unten. Wenn Sie also eine Klasse mit dem yum-Repo zuerst in diese Klasse aufnehmen, wird dieser Repo vor allem anderen hinzugefügt.

Wenn Sie die erforderlichen Einstellungen für ein Paket verwenden, stellen Sie sicher, dass der erforderliche Ressourcentyp vor dem Hinzufügen des Pakets vorhanden ist:

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

Dieser Code oben fügt das Repo hinzu, bevor das Paket hinzugefügt wird.


0
2018-02-27 12:00



Puppet verwendet eine deklarative Sprache, das tut es auch nicht Sorgen Sie sich um die Reihenfolge der Dinge in der Datei. Dein erster Absatz ist falsch, fürchte ich. Der richtige Weg, dies zu tun, ist die Verwendung der require Stichwort, das Sie im zweiten Teil getan haben. - Hamish Downer


So etwas funktionierte für mich:

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

Ich habe so etwas auf mysite.pp eingefügt. Auf diese Weise sind Ihre Puppenmodule frei von Referenzen auf Yum-Repos.


0
2018-02-09 23:56