{"id":257,"date":"2012-07-10T14:09:12","date_gmt":"2012-07-10T13:09:12","guid":{"rendered":"http:\/\/almin.tf\/blog\/?p=257"},"modified":"2026-01-24T01:16:58","modified_gmt":"2026-01-24T00:16:58","slug":"puppet","status":"publish","type":"post","link":"https:\/\/almic.fr\/blog\/2012\/07\/10\/puppet\/","title":{"rendered":"Puppet"},"content":{"rendered":"<p style=\"text-align: justify;\">Puppet permet de centraliser et de simplifier l\u2019administration de plusieurs serveurs. Notamment, on peut diffuser des modifications des fichiers de configuration, lister des paquets qui devront \u00eatre install\u00e9s sur les serveurs esclaves, \u2026<\/p>\n<p style=\"text-align: justify;\">Ce tutoriel a \u00e9t\u00e9 tenu \u00e0 jour jusqu\u2019au <b>18 octobre 2016<\/b>.<\/p>\n<p><!--more--><\/p>\n<h2>Installation du serveur ma\u00eetre<\/h2>\n<h4>Configuration de base<\/h4>\n<p style=\"text-align: justify;\">Par d\u00e9faut, les serveurs clients s\u2019attendent \u00e0 communiquer avec un h\u00f4te \u00ab\u00a0puppet\u00a0\u00bb. Il est donc recommand\u00e9 de placer un CNAME vers le syst\u00e8me o\u00f9 vous avez install\u00e9 le serveur ma\u00eetre (que ce syst\u00e8me soit une machine physique, une VM ou un VE). Ce CNAME doit faire partie du premier r\u00e9seau mentionn\u00e9 dans la ligne search de vos <i>\/etc\/resolv.conf<\/i>. C\u2019est-\u00e0-dire que si votre ligne search comporte plusieurs r\u00e9seaux, il faut placer en premier celui par lequel ma\u00eetre et clients se verront. De plus, si vous avez une ligne domain, il faut la placer avant la ligne search.<\/p>\n<p>Par exemple, chez moi \u00e7a donne :<\/p>\n<pre># \/etc\/resolv.conf on MainServer.lxc\ndomain lxc\nsearch lxc almin.tf domain.net\nnameserver 192.168.Y.Z<\/pre>\n<p style=\"text-align: justify;\">Le CNAME puppet se trouvant dans le r\u00e9seau lxc.<\/p>\n<p>Ensuite on installe puppet :<\/p>\n<p><code># apt-get install puppetmaster<\/code><\/p>\n<p style=\"text-align: justify;\">Dans le fichier <i>\/etc\/puppet\/fileserver.conf<\/i>, il faut autoriser l\u2019acc\u00e8s pour les syst\u00e8mes de votre r\u00e9seau local.<\/p>\n<pre>[files]\npath \/etc\/puppet\/files\nallow *.lxc\nallow *.almin.tf\nallow Machine1.domain.net\n[plugins]\nallow *.lxc\nallow *.almin.tf\nallow Machine1.domain.net<\/pre>\n<p style=\"text-align: justify;\">Si vous comptez ajouter des syst\u00e8mes clients qui ne sont dans le r\u00e9seau local, il faut les lister (dans cet exemple, almin.tf et domain.net).<\/p>\n<p style=\"text-align: justify;\">J\u2019ai personnalis\u00e9 la configuration du fichier <i>\/etc\/puppet\/puppet.conf<\/i>.<\/p>\n<pre>[master]\ncertname=puppet\nca_server=MainServer.lxc\ndns_alt_names=MainServer.lxc,puppet,puppet.lxc<\/pre>\n<p style=\"text-align: justify;\">Si vous faites de m\u00eame, il faut signifier \u00e0 Puppet qu\u2019il doit reg\u00e9n\u00e9rer un certificat avec les bonnes entr\u00e9es DNS :<\/p>\n<p><code># rm -fr \/var\/lib\/puppet\/ssl<br \/>\n# puppet master --verbose --no-daemonize<\/code><\/p>\n<p style=\"text-align: justify;\">La configuration de base du serveur ma\u00eetre est termin\u00e9e. Il faut maintenant cr\u00e9er les manifestes, et aussi cr\u00e9er les fichiers mod\u00e8les qui seront dupliqu\u00e9s sur les syst\u00e8mes clients.<\/p>\n<h4>Les manifestes<\/h4>\n<p style=\"text-align: justify;\">Il faut commencer par \u00e9diter <i>\/etc\/puppet\/manifests\/site.pp<\/i>. Voici un exemple :<\/p>\n<pre># \/etc\/puppet\/manifests\/site.pp on MainServer.lxc\n\nExec { path => \"\/usr\/sbin:\/sbin:\/usr\/bin:\/bin\" }\n\nimport \"resolv\"\nimport \"ssh\"\nimport \"apt\"\nimport \"cron-apt\"\nimport \"local-bin\"\nimport \"zsh\"\nimport \"sudo\"\nimport \"vim\"\n\nnode \"MainServer.lxc\" {\n  include resolv-MainServer, ssh, apt-server-cacher-jessie,\n  cron-apt, local-bin, zsh-server, sudo-MainServer, vim\n}\n\nclass generic-ve-jessie {\n  include resolv-ve, ssh-ve-jessie, apt-ve-cacher-jessie,\n  cron-apt-nomail, zsh-ve, vim\n}\n\nnode \"DnsVE.lxc\" {\n  include resolv-DnsServer, ssh-ve-jessie, apt-ve-cacher-jessie,\n  cron-apt-nomail, zsh-ve, vim\n}\nnode \"YetAnotherVE1.lxc\" {\n  include generic-ve-jessie\n}\nnode \"YetAnotherVE2.lxc\" {\n  include generic-ve-jessie\n}<\/pre>\n<p>On constate plusieurs \u00e9l\u00e9ments :<\/p>\n<ul style=\"text-align: justify;\">\n<li>on peut d\u00e9finir des manifestes pour chaque entit\u00e9 (ssh, apt, zsh, vim\u2026) et ensuite les importer dans le fichier principal site.pp ;<\/li>\n<li>Puppet g\u00e8re les notions de classes et d\u2019h\u00e9ritage ;<\/li>\n<li>chaque syst\u00e8me client a son n\u0153ud (node).<\/li>\n<\/ul>\n<p><!-- M\u00c0J 17\/01\/2016: Depuis mon passage \u00e0 la version 3.7, j\u2019ai un warning par rapport \u00e0 l\u2019utilisation de --><\/p>\n<p style=\"text-align: justify;\">Dans cet exemple, je cr\u00e9e une classe \u00ab generic-ve-jessie \u00bb, pour ne pas avoir \u00e0 lister tous les manifestes n\u00e9cessaires \u00e0 chaque fois que je cr\u00e9e un n\u0153ud pour un VE. Je n\u2019ai qu\u2019\u00e0 inclure cette classe quand je cr\u00e9e le n\u0153ud de YetAnotherVE1.lxc, et tous les manifestes que cette classe contient seront appliqu\u00e9s sur ce syst\u00e8me.<\/p>\n<p style=\"text-align: justify;\">Ensuite il faut cr\u00e9er les manifestes pour les diff\u00e9rentes entit\u00e9s que vous souhaitez g\u00e9rer via Puppet.<\/p>\n<p>Voici un exemple basique pour Vim :<\/p>\n<pre># \/etc\/puppet\/manifests\/vim.pp on MainServer.lxc\nclass vim {\n  file { \"\/etc\/vim\/vimrc.local\":\n    owner => root,\n    group => root,\n    mode => 644,\n    source => \"puppet:\/\/\/files\/etc\/vim\/vimrc.local\"\n  }\n}<\/pre>\n<p style=\"text-align: justify;\">Cr\u00e9ez le fichier <i>\/etc\/puppet\/files\/etc\/vim\/vimrc.local<\/i> avec le contenu qui devra \u00eatre dupliqu\u00e9 sur les syst\u00e8mes clients. Incluez la classe vim dans les n\u0153uds des syst\u00e8mes clients concern\u00e9s. D\u00e9sormais, le fichier <i>\/etc\/vim\/vimrc.local<\/i> sera cr\u00e9\u00e9 sur les clients d\u00e9sign\u00e9s s\u2019il n\u2019existait pas d\u00e9j\u00e0, et le plus important, il sera automatiquement tenu \u00e0 jour apr\u00e8s chaque modification sur le ma\u00eetre.<\/p>\n<h2>Installation d\u2019un client<\/h2>\n<p style=\"text-align: justify;\">On va voir comment installer Puppet sur un syst\u00e8me client. Vous pourrez dupliquer cette proc\u00e9dure pour chaque syst\u00e8me que vous voulez g\u00e9rer avec Puppet.<\/p>\n<h4>Configuration de base sur le client<\/h4>\n<p style=\"text-align: justify;\">Sur les syst\u00e8mes clients, <i>\/etc\/resolv.conf<\/i> doit \u00eatre ordonn\u00e9 de la m\u00eame fa\u00e7on que sur le serveur.<\/p>\n<p style=\"text-align: justify;\">Ensuite \u00e9ditez <i>\/etc\/hosts<\/i> pour rajouter, juste apr\u00e8s l\u2019IP via laquelle le ma\u00eetre verra le client, le FQDN local qui d\u00e9signe ce client.<\/p>\n<pre># \/etc\/hosts on YetAnotherVE1.lxc\n127.0.0.1            localhost loopback\n192.168.Y.Z          <strong>YetAnotherVE1.lxc<\/strong> YetAnotherVE1\n::1                  localhost ip6-localhost ip6-loopback\nff02::1              ip6-allnodes\nff02::2              ip6-allrouters<\/pre>\n<p>Puis on installe puppet :<\/p>\n<p><code># apt-get install puppet<\/code><\/p>\n<p>On l\u2019active :<\/p>\n<p><code># puppet agent --enable<\/code><\/p>\n<p>On g\u00e9n\u00e8re le certificat du syst\u00e8me client :<\/p>\n<p><code># puppet agent --test<\/code><\/p>\n<p style=\"text-align: justify;\">Si tout se passe bien, alors le client puppet va trouver le serveur ma\u00eetre, g\u00e9n\u00e9rer son certificat et l\u2019envoyer au ma\u00eetre. Et ensuite sur la console le client va nous r\u00e9pondre :<\/p>\n<p><code>Exiting; no certificate found and waitforcert is disabled<\/code><\/p>\n<p style=\"text-align: justify;\">On pourrait croire \u00e0 une erreur, mais en fait ce message ambigu nous indique une bonne nouvelle : tout s\u2019est bien pass\u00e9, la configuration de base du client est termin\u00e9e, on peut passer sur le serveur.<\/p>\n<p><!--Si le certificat g\u00e9n\u00e9r\u00e9 n'est pas avec le bon domaine :\n    \/etc\/puppet\/puppet.conf :\n        [main]\n        certname=rigel.leprovost.info\n        dns_alt_names=rigel.leprovost.info,rigel.lan\n    apt-get remove puppet-common\n    rmf \/var\/lib\/puppet\/ssl\n    Serveur : puppet cert clean host.lxc && service puppetmaster restart\n    apt-get install puppet\n    puppet agent --test--><\/p>\n<p><!--  Si c\u2019est un chroot : (?? depuis jessie) puppet agent --fqdn thuban.lan --test -v --><\/p>\n<h4>Configuration du nouveau client sur le serveur<\/h4>\n<p style=\"text-align: justify;\">Sur le serveur, la premi\u00e8re chose \u00e0 faire c\u2019est de c\u00e9er un manifeste pour le nouveau syst\u00e8me client, de la mani\u00e8re qu\u2019on a vue ci-dessus.<\/p>\n<p>Puis listez les certificats en attente :<\/p>\n<p><code># puppet cert list<\/code><\/p>\n<p style=\"text-align: justify;\">Vous devriez voir une ligne correspondant au nouveau syst\u00e8me. Signez le certificat :<\/p>\n<p><code># puppet cert sign YetAnotherVE1.lxc<\/code><\/p>\n<h4>Retour sur le syst\u00e8me client<\/h4>\n<p style=\"text-align: justify;\">Enfin, sur le syst\u00e8me client, il ne vous reste plus qu\u2019\u00e0 faire :<\/p>\n<p><code># puppet agent --test -v<\/code><\/p>\n<p style=\"text-align: justify;\">Et si tout s\u2019est bien pass\u00e9, vous allez voir d\u00e9filer toutes les modifications requises pour ce syst\u00e8me.<\/p>\n<h2>Op\u00e9rations diverses<\/h2>\n<h4>Tester des modifications de config<\/h4>\n<p>Sur un syst\u00e8me client :<\/p>\n<p><code># puppet agent --test -v<\/code><\/p>\n<p>Sur le serveur ma\u00eetre :<\/p>\n<p><code># puppet apply \/etc\/puppet\/manifests\/<\/code><\/p>\n<h4>Lister tous les certificats<\/h4>\n<p style=\"text-align: justify;\">Pour avoir la liste de tous les certificats stock\u00e9s sur le serveur, faites :<\/p>\n<p><code># puppet cert list --all<\/code><\/p>\n<h4>Signer tous les certificats en attente<\/h4>\n<p><code># puppet cert sign --all<\/code><\/p>\n<h4>D\u00e9terminer o\u00f9 est le manifeste<\/h4>\n<p style=\"text-align: justify;\">Si vous avez un doute sur le manifeste qui sera appliqu\u00e9, faites :<\/p>\n<p><code># puppet config print manifest<\/code><\/p>\n<h4>Pour r\u00e9initialiser un syst\u00e8me client<\/h4>\n<p>Sur le client :<\/p>\n<p><code># apt-get purge puppet-common<br \/>\n# rm -fr \/var\/lib\/puppet<\/code><\/p>\n<p>Sur le serveur :<\/p>\n<p><code># puppet cert clean YetAnotherVE1.lxc<br \/>\n# service puppetmaster restart<\/code><\/p>\n<p style=\"text-align: justify;\">Puis suivez la proc\u00e9dure comme si vous ajoutiez un nouveau syst\u00e8me client.<\/p>\n<h2>Bugs<\/h2>\n<p>Voici quelques probl\u00e8mes que j\u2019ai rencontr\u00e9.<\/p>\n<h4>R\u00e9voquer un certificat non-sign\u00e9<\/h4>\n<p style=\"text-align: justify;\">Si vous n\u2019avez pas encore sign\u00e9 un certificat, et que pour une raison X vous d\u00e9cidez de le r\u00e9voquer, Puppet va vous r\u00e9pondre :<\/p>\n<p><code>Error: Could not find a serial number for YetAnotherVE1.lxc<\/code><\/p>\n<p>Il faut signer un certificat avant de le r\u00e9voquer\u2026<\/p>\n<p><code># puppet cert sign YetAnotherVE1.lxc<br \/>\n# puppet cert clean YetAnotherVE1.lxc<\/code><\/p>\n<h4>Commentaires en fran\u00e7ais<\/h4>\n<p style=\"text-align: justify;\">Si vous d\u00e9cidez d\u2019utiliser votre langue maternelle pour les commentaires dans les manifestes, et que cette langue contient des caract\u00e8res qui ne font pas partie de la table ASCII, vous tomberez sur cette erreur :<\/p>\n<p><code>Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not parse for environment production: invalid byte sequence in US-ASCII at \/etc\/puppet\/manifests\/apt.pp:1 on node YetAnotherVE1.lxc<\/code><\/p>\n<p style=\"text-align: justify;\">Apr\u00e8s recherches et plusieurs workarounds test\u00e9s sans succ\u00e8s, j\u2019ai \u00e9t\u00e9 oblig\u00e9 d\u2019enlever les accents, donc de faire les commentaires en anglais.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Puppet permet de centraliser et de simplifier l\u2019administration de plusieurs serveurs. Notamment, on peut diffuser des modifications des fichiers de configuration, lister des paquets qui devront \u00eatre install\u00e9s sur les serveurs esclaves, \u2026 Ce tutoriel a \u00e9t\u00e9 tenu \u00e0 jour jusqu\u2019au 18 octobre 2016.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-257","post","type-post","status-publish","format-standard","hentry","category-systeme","radius"],"_links":{"self":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/257","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/comments?post=257"}],"version-history":[{"count":69,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/257\/revisions"}],"predecessor-version":[{"id":767,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/257\/revisions\/767"}],"wp:attachment":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/media?parent=257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/categories?post=257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/tags?post=257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}