Deploy/Puppet
Introduction
Ce document décrit le déroulement de l'installation pas à pas de puppet.
Puppet permet d'automatiser un grand nombre de tache d'administration, comme l'installation de logiciels, de services ou encore de modifier des fichiers.Puppet permet de faire cela de manière centralisée ce qui permet d'administrer et de mieux contrôler un grand nombre de serveur hétérogènes ou homogènes.Puppet fonctionne en mode Client / Serveur. Sur chaque machine un client va être installé et c'est lui qui va contacter le PuppetMaster, le serveur, par le biais de communication HTTPS, et donc SSL, un système pki est fourni.
Puppet a été développé en Ruby le rendant multiplateforme : bsd (free, MACos ...) ,linux (redhat, debian, suse ...), sun (opensolaris ...)
Reductive Labs, la société éditant Puppet, a développé un produit complémentaire, nommé Facter.Cette application permet de lister des éléments propres aux systèmes administrés, comme le nom de machine, l'adresse ip, la distribution, des variables d'environnement utilisables dans les templates de puppet. Puppet gère les templates.
Installation
Installation du serveur ( puppetmaster )
yum install puppet puppet-server
Installation des clients
yum install puppet
Configuration
Configuration du Serveur
Il est à noter que puppetca.conf et puppetmasterd.conf sont des liens symboliques sur le fichier puppetd.conf
Fichier <path>puppetd.conf</path>
[puppet]
# Where Puppet stores dynamic and growing data.
# The default value is '/var/puppet'.
vardir = /var/lib/puppet
# The Puppet log directory.
# The default value is '$vardir/log'.
logdir = /var/log/puppet
# Where Puppet PID files are kept.
# The default value is '$vardir/run'.
rundir = /var/run/puppet
# Where SSL certificates are kept.
# The default value is '$confdir/ssl'.
ssldir = $vardir/ssl
# factpath = $vardir/lib/facter
# pluginsync = true
[puppetd]
# The file in which puppetd stores a list of the classes
# associated with the retrieved configuratiion. Can be loaded in
# the separate ``puppet`` executable using the ``--loadclasses``
# option.
# The default value is '$confdir/classes.txt'.
classfile = $vardir/classes.txt
# Where puppetd caches the local configuration. An
# extension indicating the cache format is added automatically.
# The default value is '$confdir/localconfig'.
localconfig = $vardir/localconfig
templatedir = $vardir/templates
Puppet utilise des certificats et est donc sensible à la résolution de nom. Il faut éditer le fichier /etc/hosts afin de renseigner tous les hosts qui vont se servir de puppet.
On va maintenant autoriser les hôtes distants à se connecter au puppetmaster en ajoutant une ligne par host géré celui-ci au fichier <path>fileserver.conf</path>
allow 192.168.0.1
On créer l'arborescence nécessaire au puppetmaster
mkdir /etc/puppet/manifests/classes mkdir /var/lib/puppet/facter mkdir /var/lib/puppet/files mkdir /var/lib/puppet/templates chown puppet:puppet /var/lib/puppet/*
Il faut maintenant créer la configuration initiale de puppet, sans cela, le daemon ne se lance pas.
Fichier <path>/etc/puppet/manifests/site.pp</path>
import "classes/*"
node default {
include sudo
}
Fichier <path>/etc/puppet/manifests/classes/sudo.pp</path>
# /etc/puppet/manifests/classes/sudo.pp
class sudo {
file { "/etc/sudoers":
owner => "root",
group => "root",
mode => 440,
content => template("sudoers.erb")
}
}
et on place une copie du fichier /etc/sudoers dans le répertoire de templates
cp /etc/sudoers /var/lib/puppet/templates/sudoers.erb
On peut maintenant lancer le serveur.
/etc/init.d/puppetmaster start
le fichier <path>/etc/sysconfig/puppetmaster</path> n'a pas besoin d'être modifié
Configuration des clients
Fichier <path>/etc/sysconfig/puppet</path>
# The puppetmaster server PUPPET_SERVER=ld1.b2pweb.com # If you wish to specify the port to connect to do so here #PUPPET_PORT=8140 # Where to log to. Specify syslog to send log messages to the system log. PUPPET_LOG=/var/log/puppet/puppet.log # You may specify other parameters to the puppet client here #PUPPET_EXTRA_OPTS=--waitforcert=500
Mais avant de lancer le daemon, on va l'essayer :
puppetd --test --waitforcert 60 --verbose --debug --server=ld1.bdfweb.com
Le programme bloque sur un problème de certificat non-signé. En effet celui-ci généré au premier lancement de puppetd, et n'a pas encore été signer par le serveur. On arrête le programme avec un petit [Ctrl-C].
Firewall
Les ports 8139 et 8140 doivent être ouverts sur le serveur et les clients.
Démarrage du service
Acceptation des clients par le serveur
Sur le serveur, on lance
puppetca --list
pour visualiser tous les hosts qui n'ont pas encore de certificat signé par le serveur.
On les signe un par un avec
puppetca --sign CERTIFICAT-NAME
ou tous en même temps
puppetca --sign --all
Maintenant on peut lancer le daemon puppetd sur tous les clients.
Problèmes éventuels
Lors de la réinstallation d'un hôte, les certificats ne correspondent plus.
err: Could not request certificate: Retrieved certificate does not match private key; please remove certificate from server and regenerate it with the current key
Il faut donc purger cet hôte sur le serveur
puppetca --clean HOST
Sur le client, il faut effacer récursivement tous les fichiers du répertoire /var/lib/puppet/ssl, puis lancer le daemon en mode standalone.
puppetd --test --waitforcert 60 --verbose --debug --server=ld1.bdfweb.com