Question Ajouter un repo yum à la marionnette avant de faire autre chose


Y a-t-il un moyen de forcer la marionnette à faire certaines choses en premier? Par exemple, il me faut installer un RPM sur tous les serveurs pour ajouter un référentiel yum (communauté IUS) avant d'installer l'un des packages.


25
2018-02-11 00:49


origine


Pour un cas d'utilisation plus complexe, voir aussi mon question connexe. - Matt McClure


Réponses:


Si vous voulez vous assurer qu'un référentiel est installé sur tout votre serveur, je vous suggérerais quelque chose comme ça

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

Ensuite, pour tout noeud qui s'étend base tu peux dire

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

Cela garantira que

  • Le paquet bar ne sera pas installé à moins que le référentiel IUS soit défini
  • Le paquet ne tentera pas de s'installer avant que le référentiel IUS soit défini

35
2018-02-21 04:52



Ah ok. C'est vraiment génial. Je n'y ai pas vu le yumrepo - merci! - Jon Haddad
Il ne fonctionne qu'avec les distributions utilisant Yum, donc uniquement Rhel5, pas Rhel4. - Dave Cheney
Que se passe-t-il si je ne sais pas quel référentiel contient un paquet? Par exemple, un package peut être disponible dans le feutre référentiel sur Fedora et dans le epel référentiel sur RHEL, CentOS, etc. Cela signifie que si j'utilise une recette / un module tiers, je devrai le personnaliser. - Cristian Ciupitu


Bien que les étapes puissent gérer cela et les dépendances spécifiques de yum repo, il est préférable de déclarer la relation de manière générique.

Il suffit de mettre Yumrepo <| |> -> Package <| provider != 'rpm' |> dans votre manifeste de marionnettes.

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

Cela fait en sorte que tous les types yumrepo soient traités avant tous les paquets qui n'ont pas «rpm» en tant que fournisseur. Cette dernière exclusion a pour but d’utiliser le package RPM de epel-release (par exemple) pour faciliter l’installation du référentiel yum.


17
2017-12-31 01:01





(J'ai trouvé cette question après avoir répondu presque le même.. donc pensé que ma réponse s'applique ici aussi et qu'il vaut la peine de la répéter (il est plus sûr d'avoir une réponse à deux endroits ..)

Pour autant que je sache, c’est exactement ce que étapes sont pour - ils vous permettent de grouper et d’ordonner les exécutions de classe. J'utilise des «étapes» pour mettre à jour et configurer APT sur les serveurs Debian, ce qui devrait être très similaire à ce que vous allez faire avec YUM.

Tout d’abord, vous déclarez l’étape "yum" au niveau supérieur (au-dessus de "nœuds"), de sorte que les classes de l’étape "yum" soient exécutées avant celles "principales":

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

Ensuite, vous affectez stage aux classes. Vous pouvez le faire directement dans la définition de votre nœud:

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

  include packages
}

8
2018-06-06 12:53



Merci pour cela :) Je préfère personnellement cette approche à la réponse acceptée. - Michael Mior


Vous pourriez utiliser Mots clés. Cela vous permettrait de baliser le programme d'installation du référentiel avec firstrun ou quelque chose,

puis courir

 puppetd --tags firstrun

et il n'exécuterait que les modules / instructions correspondant à la balise.


5
2018-02-11 08:51



C'est exactement ce que je cherchais - merci Tom! - Jon Haddad


La chose clé que vous devez utiliser est le exiger keyword - "Evalue une ou plusieurs classes, en ajoutant la classe requise en tant que dépendance."

Un exemple utilisant un référentiel apt pourrait être:

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

(Adapté de cet exemple d'amorçage de marionnettes).

Ainsi, vous pouvez voir comment chaque étape exige que la précédente soit faite en premier. Je vous laisserai trouver comment appliquer cela à miam, car je ne connais pas bien l'emplacement de stockage de ses fichiers.


3
2018-02-20 23:22





Puppet lit la configuration de haut en bas, donc si vous incluez une classe avec le référentiel yum en premier dans cette classe, ce référentiel sera ajouté avant toute autre chose.

Si vous utilisez les paramètres requis sur un package, vous devez vous assurer que le type de ressource requis est présent avant d'ajouter le package, en tant que tel:

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

Ce code ci-dessus ajoutera le référentiel avant d'ajouter le package.


0
2018-02-27 12:00



Puppet utilise un langage déclaratif, donc ne pas s'inquiéter de l'ordre des choses dans le fichier. Votre premier paragraphe est faux, je le crains. La bonne façon de faire est d’utiliser le require mot-clé, ce que vous avez fait dans la deuxième partie. - Hamish Downer


Quelque chose comme ça a fonctionné pour moi:

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

J'ai inclus quelque chose comme ceci sur mysite.pp. De cette façon, vos modules de marionnettes ne contiennent aucune référence à yum repos.


0
2018-02-09 23:56