Titre: Déploiement et automatisation avec Puppet 4.9 - partie 1 Auteur: skhaen Date: Tue 14 Feb 2017 10:18:32 +0100 Lien: http://linuxfr.org/users/skhaen/journaux/deploiement-et-automatisation-avec-puppet-4-9-partie-1 Sommaire * Installation[1] * MASTER / [2]puppetserver[3] * SLAVE / puppet-agent (node)[4] * Un peu de configuration[5] * puppet.conf[6] * Ajouter un node au master[7] * sur le SLAVE[8] * Sur le MASTER[9] * Troubleshooting (install)[10] * Premier manifest[11] * sur le MASTER[12] * partie 1 : installation et 1er manifest. * original : www.cyphercat.eu/deploiement-et-automatisation-avec-puppet-partie-1[13] Puppet est l'outil de gestion de configuration le plus connu, il a vu le jour en 2005, bien avant ses principaux concurrents (2009 pour Chef[14], 2011 pour Salt[15], 2012 pour Ansible[16]). Il propose depuis maintenant longtemps une solution open-source en parallèle de la version entreprise (qui est évidemment payante) et il a eu le temps de grandir pour atteindre une taille plus que respectable. Au contraire d'Ansible où ça reste plutôt simple pour le moment, les premières recherches que vous allez faire ont toutes les chances de vous laisser quelque part entre "mais je commence par quoi bordel ?!" et "mais… mais… c'est horriblement compliqué". Parce que oui, évidemment, en plus de 10 ans le logiciel a eu le temps de se développer, sa communauté aussi et quand on parle maintenant de puppet certains termes comme control-repo[17], R10K[18], puppetdb[19] , hiera[20], rspec[21], modules[22], librarian-puppet[23] reviennent souvent. Si vous vous posez la question, oui, c'est le bon moment pour se faire un thé (et je veux bien un rubis birman[24] pendant que l'on y est). Avant de continuer, n'oubliez pas que : * il y a une seule chose importante à retenir pour le moment : la documentation est sur docs.puppet.com[25]. * mon serveur "master" se nomme master.cyphercat.eu * mon serveur "slave1" ou "node1" s'appelle slave1.cyphercat.eu N'oubliez donc pas de changer les noms des serveurs avez les vôtres au fur et à mesure de cet article. Je vous déconseille BEAUCOUP de tenter le coup avec des configurations dans /etc/hosts, vous avez toutes les chances que ça foutent une pagaille mémorable avec les certificats (je viens de tester chez scaleway[26]). Installation Nous allons installer un puppet-server (que l'on pourrait appeler serveur maitre), c'est lui qui s'occupera de tout orchestrer. Puis, sur chaque node, on installera puppet-agent, ce qui leur permettra de communiquer avec le master. PuppetLabs met à disposition puppet-collection[27] pour les installations, c'est un ensemble d'outils[28] (par exemple facter, hiera, ruby, openssl et mcollective pour puppet-agent) packagés. En utilisant ceci, nous sommes donc sûr d'avoir des logiciels compatibles entre eux. MASTER / puppetserver[3] Vous pouvez voir les détails sur puppet-server[29] et sur puppet_collections[30] , nous allons faire ici une installation la plus simple possible (ah ah) sur une debian 8 (Jessie). root@master:# wget https://apt.puppetlabs.com/puppetlabs-release-pc1-jessie.deb dpkg -i puppetlabs-release-pc1-jessie.deb root@master:# apt-get update root@master:# apt-get install puppetserver Puis on démarre le service (si ça plante, allez voir la section "memory allocation[31]") : root@master:# service puppetserver start Attention !dpkg -l|grep puppet nous donne les résultats suivants : puppet-agent 1.9.1-1jessie puppetlabs-release-pc1 1.1.0-4jessie puppetserver 2.7.2-1puppetlabs1 On pourrait donc croire que l'on se retrouve avec un puppet v2.7 (on en est à la v4)… mais point du tout : Puppet Server 2.x supporte Puppet 4, alors que Puppet Server 1.x supporte Puppet 3.x et supérieur[32]. SLAVE / puppet-agent (node) Vous pouvez voir les détails sur puppet-agent[33], l'installation se passe aussi sur une Debian 8 (Jessie) : root@slave1:# wget https://apt.puppetlabs.com/puppetlabs-release-pc1-jessie.deb root@slave1:# dpkg -i puppetlabs-release-pc1-jessie.deb root@slave1:# apt-get update root@slave1:# apt-get install puppet-agent Un peu de configuration Voici une bonne chose de faite. En lisant la doc vous verrez que les exécutables de puppet[34] sont maintenant dans /opt/puppetlabs/bin/ (ce qui n'est pas dans notre PATH[35] par défaut). Pour régler ce problème pour le moment : root@slave1:# PATH=/opt/puppetlabs/bin:$PATH puppet.conf Pour les détails sur le fichier puppet.conf, voir config_file_main.html[36] * exemple de configuration pour un agent[37] * exemple de configuration pour un master[38] Par défaut[39], un node recherche son master sur un serveur qui s’appelle "puppet". Nous allons donc ajouter deux lignes pour spécifier notre configuration dans /etc/puppetlabs/puppet/puppet.confsur le slave pour y ajouter ces deux lignes : * sur le MASTER [main]certname= master.cyphercat.euserver= puppetmaster[master]dns_alt_names= puppet,puppetmaster,master.cyphercat.euvardir= /opt/puppetlabs/server/data/puppetserverlogdir= /var/log/puppetlabs/puppetserverrundir= /var/run/puppetlabs/puppetserverpidfile= /var/run/puppetlabs/puppetserver/puppetserver.pidcodedir= /etc/puppetlabs/code * sur le SLAVE [main]certname= slave1.cyphercat.euserver= master.cyphercat.euenvironment= production Ajouter un node au master Vous êtes prêt-e-s ? Il existe 2 méthodes[40] pour dire à un node de se connecter au master, la première en "tâche de fond", et la seconde "à la main" que l'on peut mettre en cron[41]. sur le SLAVE Utilisons la commande manuelle pour voir ce qui se passe : root@slave1:# /opt/puppetlabs/bin/puppet agent --test Info: Creating a new SSL key for slave1.cyphercat.eu Info: Caching certificate for ca Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml Info: Creating a new SSL certificate request for slave1.cyphercat.eu Info: Certificate Request fingerprint (SHA256): 55:A1:EE:A6:1D:D2:85:9D:7F:5F:69:72:7E:BF:54:BA:74:BD:7F:8E:43:0D:AC:A1:D1:1B:4A:FF:4A:F6:54:3B Info: Caching certificate for ca Exiting; no certificate found and waitforcert is disabled Ce qui veut dire que : 1.slave1 a créé un certificat pour lui et il arrive à se connecter au master 2.le master ne veut pas de lui vu qu'il ne le connaît pas, nous allons donc régler ça. Sur le MASTER root@master:# /opt/puppetlabs/bin/puppet cert list "slave1.cyphercat.eu"(SHA256)55:A1:EE:A6:1D:D2:85:9D:7F:5F:69:72:7E:BF:54:BA:74:BD:7F:8E:43:0D:AC:A1:D1:1B:4A:FF:4A:F6:54:3B Bonne nouvelle, le premier contact a vraiment eu lieu ! Le MASTER a bien reçu le certificat de SLAVE, et il nous attend pour le valider[42] avec la commande suivante : /opt/puppetlabs/bin/puppet cert sign slave1.cyphercat.eu Signing Certificate Request for: "slave1.cyphercat.eu"(SHA256)55:A1:EE:A6:1D:D2:85:9D:7F:5F:69:72:7E:BF:54:BA:74:BD:7F:8E:43:0D:AC:A1:D1:1B:4A:FF:4A:F6:54:3B Notice: Signed certificate request for slave1.cyphercat.eu Notice: Removing file Puppet::SSL::CertificateRequest slave1.cyphercat.eu at '/etc/puppetlabs/puppet/ssl/ca/requests/slave1.cyphercat.eu.pem' Et si on relance notre puppet agent -t sur le slave : root@slave1:# /opt/puppetlabs/bin/puppet agent --test Info: Caching certificate for slave1.cyphercat.eu Info: Caching certificate_revocation_list for ca Info: Caching certificate for slave1.cyphercat.eu Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for slave1.cyphercat.eu Info: Applying configuration version '1486920585' Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml Notice: Applied catalog in 0.07 seconds Troubleshooting (install) Vous avez peut être rencontré des problèmes au cours de cette installation, je vous conseille de regarder les points suivants pour vous aider à trouver une solution : * dns_alt_names[43] : liste de noms que votre master peut utiliser? Le nom que vos nodes utilisent (puppet, puppetmaster, master.cyphercat.eu…) DOIT etre inclus dedans ainsi que dans son certificat (voir aussi dnsaltnames[44] ), * puppet.conf[36] * Configuration: Short list of important settings[45] * puppet troubleshooting[46] ou l'original[47] (bon courage) Premier manifest Personnellement, j'aime bien avoir mes outils[48] sur mes serveurs, ainsi que quelques raccourcis, commençons donc par ça : sur le MASTER cd /etc/puppetlabs/code/environments/production/manifests * Nous créons le fichier site.pp pour déclarer notre node[49] et ce qu'il devra utiliser : # /etc/puppetlabs/puppet/manifests/site.pp node 'slave1.cyphercat.eu'{ include common} * et nous allons faire notre premier manifest pour installer des paquets dans le fichier common.pp que nous créons aussi : class common {$packages_list=['apt-transport-https', 'bzip2', 'curl', 'deborphan', 'htop', 'less', 'lsof', 'ncdu', 'pbzip2', 'pigz', 'pwgen', 'rpl', 'screen', 'strace', 'sudo', 'tar', 'unzip', 'vim', 'wget', 'whois', 'zip'] package {$packages_list: ensure=> 'installed'}} Puis nous relançons notre commande /opt/puppetlabs/bin/puppet agent -t sur notre slave1. Si vous n'avez pas d'erreurs, vous devriez voir quelque comme ceci qui s'affiche : Info: Using configured environment 'production' Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for slave1.cyphercat.eu Info: Applying configuration version '1486926845' Notice: /Stage[main]/Common/Package[deborphan]/ensure: created Notice: /Stage[main]/Common/Package[ncdu]/ensure: created Notice: /Stage[main]/Common/Package[pbzip2]/ensure: created Notice: /Stage[main]/Common/Package[pigz]/ensure: created Notice: /Stage[main]/Common/Package[pwgen]/ensure: created Notice: /Stage[main]/Common/Package[rpl]/ensure: created Notice: /Stage[main]/Common/Package[strace]/ensure: created Notice: /Stage[main]/Common/Package[unzip]/ensure: created Notice: /Stage[main]/Common/Package[whois]/ensure: created Notice: /Stage[main]/Common/Package[zip]/ensure: created Notice: Applied catalog in 39.43 seconds Et voilà pour aujourd'hui ! À noter que : * Vous pouvez utiliser la commande puppet parser validate common.pp si vous voulez voir si vous avez fait des erreurs de syntaxe. * Vous pouvez utiliser puppet-lint[50] pour voir si vous avez fait des erreurs de style. Télécharger ce contenu au format Epub[51] Lire les commentaires[52] Liens: [1]: http://linuxfr.org/journaux.atom#installation (lien) [2]: http://linuxfr.org/journaux.atom#master--puppetserver (lien) [3]: https://github.com/puppetlabs/puppetserver (lien) [4]: http://linuxfr.org/journaux.atom#slave--puppet-agent-node (lien) [5]: http://linuxfr.org/journaux.atom#un-peu-de-configuration (lien) [6]: http://linuxfr.org/journaux.atom#puppetconf (lien) [7]: http://linuxfr.org/journaux.atom#ajouter-un-node-au-master (lien) [8]: http://linuxfr.org/journaux.atom#sur-le-slave (lien) [9]: http://linuxfr.org/journaux.atom#sur-le-master (lien) [10]: http://linuxfr.org/journaux.atom#troubleshooting-install (lien) [11]: http://linuxfr.org/journaux.atom#premier-manifest (lien) [12]: http://linuxfr.org/journaux.atom#sur-le-master-1 (lien) [13]: https://www.cyphercat.eu/deploiement-et-automatisation-avec-puppet-partie-1/ (lien) [14]: https://en.wikipedia.org/wiki/Chef_(software) (lien) [15]: https://en.wikipedia.org/wiki/Salt_(software) (lien) [16]: https://en.wikipedia.org/wiki/Ansible_(software) (lien) [17]: https://github.com/puppetlabs/control-repo (lien) [18]: https://github.com/puppetlabs/r10k (lien) [19]: https://docs.puppet.com/puppetdb/ (lien) [20]: https://docs.puppet.com/hiera/ (lien) [21]: https://puppet.com/blog/unit-testing-rspec-puppet-for-beginners (lien) [22]: https://forge.puppet.com/ (lien) [23]: http://librarian-puppet.com/ (lien) [24]: https://www.tripadvisor.com/Restaurant_Review-g187147-d1174565-Reviews-Maison_des_trois_thes-Paris_Ile_de_France.html (lien) [25]: https://docs.puppet.com/puppet/4.8/install_pre.html (lien) [26]: https://www.scaleway.com/ (lien) [27]: https://docs.puppet.com/puppet/4.9/puppet_collections.html (lien) [28]: https://puppet.com/blog/welcome-to-puppet-collections (lien) [29]: https://docs.puppet.com/puppetserver/2.7/install_from_packages.html (lien) [30]: https://docs.puppet.com/puppet/latest/puppet_collections.html (lien) [31]: https://docs.puppet.com/puppetserver/2.7/install_from_packages.html#memory-allocation (lien) [32]: https://docs.puppet.com/puppetserver/ (lien) [33]: https://docs.puppet.com/puppet/4.8/install_linux.html (lien) [34]: https://docs.puppet.com/puppet/4.8/install_linux.html#confirm-you-can-run-puppet-executables (lien) [35]: https://fr.wikipedia.org/wiki/Variable_d'environnement#.3CPATH.3E_pour_l.27emplacement_des_ex.C3.A9cutables (lien) [36]: https://docs.puppet.com/puppet/4.9/config_file_main.html (lien) [37]: https://docs.puppet.com/puppet/4.9/config_file_main.html#example-agent-config (lien) [38]: https://docs.puppet.com/puppet/4.9/config_file_main.html#example-master-config (lien) [39]: https://docs.puppet.com/puppet/4.8/config_important_settings.html#settings-for-agents-all-nodes (lien) [40]: https://docs.puppet.com/puppet/4.8/install_linux.html#start-the-puppet-service (lien) [41]: https://fr.wikipedia.org/wiki/Cron (lien) [42]: https://docs.puppet.com/puppet/4.8/install_linux.html#sign-certificates-on-the-ca-master (lien) [43]: https://docs.puppet.com/puppet/latest/config_important_settings.html#basics-1 (lien) [44]: https://docs.puppet.com/puppet/latest/configuration.html#dnsaltnames (lien) [45]: https://docs.puppet.com/puppet/4.9/config_important_settings.html (lien) [46]: https://www.cyphercat.eu/puppet-troubleshooting/ (lien) [47]: https://docs.google.com/presentation/d/1AT2j97HV_y2QNH_HFKwZ6ExQDKvfC_lt6qBZaai4ATo/edit#slide=id.p (lien) [48]: https://www.puppetcookbook.com/posts/install-multiple-packages.html (lien) [49]: https://docs.puppet.com/puppet/4.8/lang_node_definitions.html (lien) [50]: http://puppet-lint.com/ (lien) [51]: http://linuxfr.org/users/skhaen/journaux/deploiement-et-automatisation-avec-puppet-4-9-partie-1.epub (lien) [52]: http://linuxfr.org/users/skhaen/journaux/deploiement-et-automatisation-avec-puppet-4-9-partie-1#comments (lien)