Voici une méthode pour installer un serveur Puppet (le Puppet Master) et le rendre par la suite scalable. Par défaut, l’installation “classique” ne permet pas d’atteindre de grosses performances : le Puppet Master utilise, par exemple, le serveur web WEBrick qui atteindra rapidement ses limites. L’idée ici est de remplacer WEBrick par un Apache/Phusion Passenger et dans un deuxième temps, d’ajouter l’utilisation d’un serveur SQL. Même si l’installation d’origine fonctionne sans ces modifications, certaines fonctionnalités ne sont pas disponibles (comme par exemple l’utilisation des ressources exportées, le dashboard… qui nécessitent un serveur SQL). Dans cet article, l’installation est basée sur une Debian Squeeze fraichement installée. Je fais le choix de partir sur des versions non packagées pour certaines briques : je veux par exemple profiter de la souplesse de mise à jour de Puppet via les gems et de Ruby Enterprise. La première partie couvre l’installation simple du serveur et du client.

Installation de Ruby Enterprise

Sachant que le but est d’utiliser Apache + Link Text (mod_rails ou mod_rack), le choix d’une version de Ruby s’est porté sur Ruby Enterprise annoncé comme moins gourmand en RAM (et parfaitement stable) dans le cadre de l’utilisation avec Passenger.

Pour installer Ruby Enterprise :

  • Téléchargez la dernière version de Ruby Enterprise. C’est ici
  • Installez les prérequis à l’installation de Ruby Enterprise :
apt-get install zlib1g-dev libssl-dev libreadline5-dev
  • Lancez l’installation de Ruby Enterprise. Je n’installe pas les gems proposés par Ruby Enterprise : Puppet a besoin de versions précises de certains gems… Je garde ces installations pour plus tard. L’installation aura pour préfixe /usr pour éviter tout problème de PATH pour les binaires et les librairies Ruby :
cd /usr/local/src
tar xvzf ruby-enterprise-1.8.7-2011.03.tar.gz
cd ruby-enterprise-1.8.7-2011.03
./installer --dont-install-useful-gems -a /usr
  • Il n’y a donc pas de gems installés :
# gem list

*** LOCAL GEMS ***
  • J’en profite pour mettre à jour RubyGems (version 1.5.2 avec cette version de Ruby Enterprise) :
# gem update --system
Updating rubygems-update
Fetching: rubygems-update-1.8.12.gem (100%)
Successfully installed rubygems-update-1.8.12
Installing RubyGems 1.8.12
RubyGems 1.8.12 installed
  • Il faut installer la librairie mysql-ruby qui sera nécessaire plus tard pour le gem mysql. Vous pouvez la télécharger sur cette page. Pour l’installer :
apt-get install libmysqlclient-dev
cd /usr/local/src
tar xvzf mysql-ruby-2.8.2.tar.gz
cd mysql-ruby-2.8.2
ruby extconf.rb
make && make install

Installation de Puppet

Nous allons installer Puppet via la commande gem. Il est également possible de prendre la version de votre distribution. C’est à vous de voir. Un inconvénient est de ne pas forcément avoir la dernière version immédiatement à sa sortie (ce qui n’est pas un problème si on veut un minimum de sécurité sur les mises à jour et se prémunir d’éventuels bugs / problèmes). Si vous prenez la version packagée, attention, il y a une dépendance sur Ruby (1.8 sur la Debian Squeeze).

  • Pour éviter tout problème (du fait de l’installation de Ruby Enterprise), rajoutez une alternative pour le binaire Ruby :
mv /usr/bin/ruby /usr/bin/ruby-enterprise
update-alternatives --quiet --install /usr/bin/ruby ruby /usr/bin/ruby-enterprise 180
  • On installe donc Puppet (et Facter sa dépendance) via RubyGems :
# gem install puppet
Fetching: puppet-2.7.9.gem (100%)
Successfully installed puppet-2.7.9
1 gem installed
Installing ri documentation for puppet-2.7.9...
Installing RDoc documentation for puppet-2.7.9...
  • Puppet et Facter sont installés. On a maintenant au moins ces gems :
# gem list

*** LOCAL GEMS ***

facter (1.6.4)
puppet (2.7.9)
rubygems-update (1.8.12)
  • Il manque quelques libs pour éventuellement gérer du ldap, des règles selinux et des mots de passe shadow. Il n’y a pas de ruby-selinux en version gem à ce jour, on l’installera via le paquet Debian qui sera décompressé pour prendre la librairie. Le répertoire des librairies Ruby sera à adapter si vous êtes en 64 bits :
apt-get install libldap2-dev libsasl2-dev
gem install ruby-shadow ruby-ldap
apt-get install -d libselinux-ruby1.8
cd /usr/local/src
dpkg -x /var/cache/apt/archives/libselinux-ruby1.8_2.0.96-1_i386.deb libselinux-ruby
cp libselinux-ruby/usr/lib/ruby/1.8/i486-linux/selinux.so /usr/lib/ruby/site_ruby/1.8/i686-linux/
  • Il faut créer un utilisateur/groupe pour Puppet :
adduser --system --no-create-home --group puppet

Configuration du Puppet Master

Après votre installation de Puppet, il n’y a pas de configuration par défaut. Il faut la générer avec la commande puppetmasterd –genconfig. Pour faire plus simple, voilà une configuration qui fonctionne :

  • Commencez par créer le répertoire de configuration de Puppet /etc/puppet et /etc/puppet/files.
  • Copiez et adaptez le fichier puppet.conf disponible sur github. L’idée ici, dans un premier temps, est de seulement mettre le nom de votre Puppet Master (en fqdn) au niveau du certname dans le [main] et du server dans la partie [agent].
  • Toujours sur github, installez le fichier de configuration auth.conf. J’ai pris ici les droits par défaut présentés dans la documentation Puppet.
  • Et pour finir la configuration des accès aux modules/fichiers et plugins avec fileserver.conf.

Pour résumer : installez ces 3 fichiers de configuration dans /etc/puppet, modifiez le puppet.conf pour l’adapter à votre serveur. Vous devez avoir une arborescence qui ressemble à :

# tree /etc/puppet/
/etc/puppet/
|-- auth.conf
|-- files
|-- fileserver.conf
`-- puppet.conf

1 directory, 3 files

Démarrage du Puppet Master

On va démarrer le Puppet Master en mode debug pour s’assurer qu’il démarre correctement, sans erreurs :

puppet master --no-daemonize --debug

Premier démarrage du Puppet Master

Il ne doit pas y avoir d’erreurs à ce niveau là… Vous devez avoir quelque chose comme :

notice: Starting Puppet master version 2.7.9
info: mount[files]: allowing *.example.com access
info: mount[modules]: allowing *.example.com access
info: mount[plugins]: allowing *.example.com access

C’est prêt pour un test avec un agent !

Installation d’un agent

Comme pour le serveur, vous avez la possibilité d’installer l’agent directement depuis le paquet Debian ou via RubyGems. C’est au choix et j’opte de nouveau pour la procédure via RubyGems (encore une fois, c’est selon vos habitudes, il n’y a pas de mauvaise méthode).

Je commence à installer la dernière version de RubyGems via les sources (j’ai rencontré quelques problèmes avec la version Debian et je veux m’en prémunir pour la suite) :

apt-get install ruby
tar xvzf rubygems-1.8.12.tgz
cd rubygems-1.8.12
ruby setup.rb --prefix=/usr --destdir=/tmp/rubygems-1.8.12
mkdir -p /tmp/rubygems-1.8.12/usr/lib/ruby/1.8
mv /tmp/rubygems-1.8.12/usr/lib/{rbconfig,*.rb,rubygems} /tmp/rubygems-1.8.12/usr/lib/ruby/1.8
rsync -avS /tmp/rubygems-1.8.12/ /

RubyGems est installé. On rajoute une alternative pour gem qui va pointer sur gem1.8 :

update-alternatives --quiet --install /usr/bin/gem gem /usr/bin/gem1.8 180

On peut maintenant installer Puppet et Facter via gem install puppet :

# gem install puppet
Fetching: facter-1.6.4.gem (100%)
Fetching: puppet-2.7.9.gem (100%)
Successfully installed facter-1.6.4
Successfully installed puppet-2.7.9
2 gems installed

Il reste un peu de configuration à faire pour que l’agent contacte votre Puppet Master. Je vous propose deux méthodes : une à la main et une automatique pour tous vos agents grâce à Puppet.

Configuration manuelle de l’agent

Comme pour le serveur, il y a 3 fichiers de configuration à créer dans /etc/puppet. Le fichier puppet.conf est une version “allégée” du Puppet Master. On y indiquera, entre autres, l’adresse du Puppet Master… Les fichiers auth.conf et namespaceauth.conf permettent de forcer le déclenchement de l’agent Puppet à distance via une commande sur le Puppet Master ou via le dashboard.

Les fichiers de configuration sont disponibles sur github.

Pour démarrer via un script d’init votre client Puppet, toujours sur github, récupérez le fichier default pour /etc/default/puppet et initd pour le /etc/init.d/puppet. Pour lancer automatiquement Puppet au démarrage de votre serveur :

# chmod 755 /etc/init.d/puppet
# insserv -v puppet
insserv: enable service ../init.d/puppet -> /etc/init.d/../rc0.d/K01puppet
insserv: enable service ../init.d/puppet -> /etc/init.d/../rc1.d/K01puppet
insserv: enable service ../init.d/puppet -> /etc/init.d/../rc2.d/S16puppet
insserv: enable service ../init.d/puppet -> /etc/init.d/../rc3.d/S16puppet
insserv: enable service ../init.d/puppet -> /etc/init.d/../rc4.d/S16puppet
insserv: enable service ../init.d/puppet -> /etc/init.d/../rc5.d/S16puppet
insserv: enable service ../init.d/puppet -> /etc/init.d/../rc6.d/K01puppet
insserv: creating .depend.boot
insserv: creating .depend.start
insserv: creating .depend.stop

Vous pouvez également démarrer l’agent à la main avec la commande suivante (en mode test pour voir le détail de ce qui est fait) :

puppet agent -t

Configuration de l’agent via Puppet

Il est possible de faire l’équivalent de la méthode manuelle via Puppet : tous vos agents seront automatiquement configurés grâce à Puppet. Il suffit juste d’indiquer au premier démarrage de votre agent l’adresse de votre Puppet Master. Ce fonctionnement est possible grâce à un module Puppet disponible également sur github. Pour l’installer :

  • Récupérer le module sur github :
git clone https://github.com/binbashfr/puppet-modules
  • Déplacez le répertoire puppetclient dans le répertoire /etc/puppet/modules de votre Puppet Master.
  • Activez le : une façon de faire est de créer le fichier /etc/puppet/manifests/site.pp avec le contenu suivant :
# Votre serveur Puppet Master (ou sa VIP)
$puppetmaster = 'VOTRE PUPPET MASTER'
node default {
 if ( $fqdn != $puppetmaster )
  {
    include puppetclient
     class { 'puppetclient::conf':
     	   puppetmaster => $puppetmaster,
	   }
  }
}
  • On indique ici les classes à appliquer pour chaque agent qui se présentera (sauf pour le Puppet Master : il peut être également client de lui même). Une de ces classes est paramétrée et prendra la valeur du fqdn de votre Puppet Master.
  • Il suffit ensuite de déclencher l’agent Puppet sur votre client :
puppet agent -t --server=puppetmaster --ssldir=/var/lib/puppet/ssl
  • Au premier lancement, un certificat SSL sera généré. Certificat qu’il faudra signer sur le Puppet Master pour autoriser cet agent à communiquer avec le serveur.
info: Creating a new SSL key for my_agent
info: Caching certificate for ca
warning: peer certificate won't be verified in this SSL session
info: Creating a new SSL certificate request for my_agent
info: Certificate Request fingerprint (md5): xx:xx...
Exiting; no certificate found and waitforcert is disabled

Signature SSL

Après avoir lancé votre agent Puppet pour la première fois, vous devez signer son certificat SSL sur votre Puppet Master.

  • Sur votre Puppet Master, listez les agents en attente de signature :
# puppetca list
my_agent (xx:xx...)
  • Vous pouvez signer ce certificat :
# puppetca sign my_agent
notice: Signed certificate request for my_agent
notice: Removing file Puppet::SSL::CertificateRequest my_agent at '/var/lib/puppet/ssl/ca/requests/my_agent.pem'

Pour signer tous les certificats en attente :

puppetca sign --all

Lancement de l’agent

Votre agent a été exécuté une fois, son certificat SSL est signé : vous pouvez maintenant lancer le service puppet via /etc/init.d/puppet start si vous avez choisi la méthode d’installation manuelle. Dans le cas de l’utilisation du module Puppet pour la configuration automatique, lancez de nouveau votre agent via puppet agent -t. L’agent Puppet va être automatiquement configuré et le service sera démarré.

puppet agent

C’est terminé pour cette première partie ! A ce stade, nous avons un Puppet Master pas du tout scalable mais les bases sont là. Dans les parties suivantes, nous verrons comment adapter cette configuration pour utiliser Apache/Passenger, MySQL, le dashboard…