Installer un serveur Puppet scalable – partie 1



  • 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
    

    Il est possible d’automatiser cette signature en créant sur le Puppet Master le fichier /etc/puppet/autosign.conf dans lequel vous indiquez le ou les domaines signés automatiquement. C’est potentiellement une faille de sécurité, un agent peut facilement se faire passer pour un autre en usurpant son fqdn et il serait signé automatiquement. Plus d’infos ici : Why shouldn’t I use autosign for all my clients ?

    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.<br /> 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é.

    0_1522746132303_puppetagent.gif

    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…