Apprendre à utiliser Puppet


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.

Pré-requis

J'utiliserai ici deux machines dont leur hostname :

  • pm = puppet master
  • pn = puppet node

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.

Installation

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

Déployer un manifest

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

  • Si l'on souhaite le déployer sur le manageur :
puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp
  • Ou depuis un node (commande à exécuter sur un node directement) :
/opt/puppetlabs/bin/puppet agent --test

Sinon, il faut attendre le prochain pull qui s’effectue tous les 30 minutes.

Autres commandes

  • Lister la configuration en cours :
puppet config print all
  • Gérer les certificats :
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/