C'est un outil qui a été créé en 2005 pour faciliter les installations et les maintenances d'une ou plusieurs fermes de serveurs. Ainsi, lorsqu'il s'agit de corriger une faille présente sur plusieurs milliers de serveurs web. Puppet va permettre d'y apporter le correctif en seulement quelques commandes.
Dans ce tutoriel, on va imaginer que nous avons un serveur (manager) avec le hostname “pm” et un client (node) avec le hostname “pn”. Sur ces machines, on utilisera la version 4.9.2 de puppet.
J'utiliserai ici deux machines dont leur hostname :
Concernant le client que l'on installera sur les nodes, il n'y a pas de recommandation particulière vu que c'est un démon consommant peu de ressource et qui se connectera au master tous les 30 minutes.
Pour le serveur, il lui faut au moins 2Go de RAM et les requêtes entrantes seront écouté sur le port 8140 en IPv6.
Commençons par renseigner le bon dépôt sur chaque serveurs avec le paquet suivant :
https://apt.puppetlabs.com/puppetlabs-release-pc1-jessie.deb dpkg -i puppetlabs-release-pc1-jessie.deb apt-get update
Au lieu de renseigner à chaque fois l'emplacement du programme puppet, modifions notre variable d'environnement PATH :
PATH=$PATH":/opt/puppetlabs/bin"
On installe sur le manager le paquet puppetserver :
apt-get install puppetserver
Cette étape est facultative mais vu que j'utilise une petite machine virtuelle pour faire des tests avec 1Go de RAM et 1 seul core, je modifie volontairement la taille d’allocation de la mémoire :
nano /etc/default/puppetserver JAVA_ARGS="-Xms512m -Xmx512m -XX:MaxPermSize=256m"
Démarrons le service :
service puppetserver start
Sur les nodes c'est plus simple car il s'agira d'installer un paquet et de renseigner le hostname du serveur :
apt-get install puppet-agent nano /etc/puppetlabs/puppet/puppet.conf server=pm
On démarre enfin le service :
puppet resource service puppet ensure=running enable=true
Notice: /Service[puppet]/ensure: ensure changed 'stopped' to 'running' service { 'puppet': ensure => 'running', enable => 'true', }
puppet agent --test
Cette commande a pour rôle de discuter avec le manager. Vu que c'est la première fois qu'ils se “parlent”, le node lui a débord envoyé son certificat que nous allons par la suite approuver.
Avant de retourner sur le serveur, rendons le démarrage automatique du démon au boot de la machine :
echo "START=yes" >> /etc/default/puppet
Passons du côté manager et listons les certificats en attente d’accréditation.
puppet cert list
"pn" (SHA256) AB:6F:B0:8C:76:79:86:AB:D4:76:36:C5:6A:5E:1F:69:4D:11:A1:AE:3C:EE:BD:89:D7:21:58:8A:8A:FE:18:58
Approuvons la bienveillance de notre nouveau node “pn” :
puppet cert sign pn
Signing Certificate Request for: "pn" (SHA256) AB:6F:B0:8C:76:79:86:AB:D4:76:36:C5:6A:5E:1F:69:4D:11:A1:AE:3C:EE:BD:89:D7:21:58:8A:8A:FE:18:58 Notice: Signed certificate request for pn Notice: Removing file Puppet::SSL::CertificateRequest pn at '/etc/puppetlabs/puppet/ssl/ca/requests/pn.pem'
Listons les certificats approuvés :
puppet cert list -all
+ "pm" (SHA256) 91:AE:09:9E:D8:17:38:F8:09:85:00:93:AB:F7:80:20:70:63:8E:2E:DD:FF:13:75:35:DF:35:AD:30:A9:3E:8B (alt names: "DNS:puppet", "DNS:pm") + "pn" (SHA256) A8:3D:47:5E:A7:81:C6:DE:44:7D:16:CB:B6:57:01:63:0B:3F:E5:26:22:42:42:64:96:FA:36:CF:0C:A7:C7:30
La rédaction de ce type de document sert au provisionnement nodes. Ci-dessous nous allons par exemple installer un serveur web.
nano /etc/puppetlabs/code/environments/production/manifests/site.pp
# Concernant la machine pn node 'pn' { # Avant d'installer un paquet, il faut que la base d'APT soit à jour. exec { 'apt-update': command => '/usr/bin/apt-get update' } # Toujours utile pour executer un script PHP ;) package { 'php5': require => Exec['apt-update'], ensure => installed, } # Notre script PHP. file { '/var/www/html/index.php': ensure => file, content => '<?php phpinfo(); ?>', } # C'est le fichier par défaut qu'Apache lit mais que nous ne voulons pas. file { '/var/www/html/index.html': ensure => absent, } # On veut que notre site soit accessible avec le TLD : local.net. class { 'apache': } apache::vhost { 'local.net': port => '80', docroot => '/var/www/html', } } # Concernant les autres nodes node default { # On créer un fichier inutile pour prouver son fonctionnement. file { '/tmp/test': ensure => file, content => 'Fichier de test avec puppet', } }
D'autres paramètres sont disponible dans la documentation officielle.
puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp
/opt/puppetlabs/bin/puppet agent --test
Sinon, il faut attendre le prochain pull qui s’effectue tous les 30 minutes.
puppet config print all
puppet cert list puppet cert list --all # Ajouter un node puppet cert sign <node> # Supprimer un node puppet cert clean <node>
Source complémentaire : http://www.example42.com/tutorials/PuppetTutorial/