Publié le: 2011-11-25

Puppet

Puppet est un système de gestion centralisée des configurations. Il permet de déployer très rapidement des configurations sur un parc de serveurs, au moyen d’un système client-serveur cryptés via SSL, un système de droits et de fichiers à déployer. Nous allons voir comment l’installer, mais également quelques astuces de configuration.

Serveur

Installation

Sous Debian

apt-get install puppetmaster

Sous FreeBSD

cd /usr/ports/sysutils/factor
make install clean
cd /usr/ports/sysutils/puppet
make install clean

Configuration

Allez dans le répertoire /usr/local/etc/puppet. Tous les fichiers de configuration se trouveront ici. Créons déjà l’arborescence des dossiers.

mkdir modules manifests files files/bsd files/debian

  • Le répertoire modules définit l’ensemble des modules à utiliser pour un hôte. Ce module est défini par un nom et va servir à définir les permissions, le chemin et le contenu d’un fichier de configuration distribué.
  • Le répertoire files contient l’arborescence des fichiers de configuration. Par convention, ce sera distribution/arborescence locale. Par exemple pour le syslog sous Debian : files/debian/etc/syslog-ng.conf
  • Le répertoire manifests contient uniquement le fichier principal (site.pp) qui définit les clients

Configuration d’un module

Pour créer un module placez vous dans le dossier modules puis créez le répertoire correspondant au nom que vous souhaitez donner à votre module puis le répertoire manifests et enfin créez le fichier init.pp

cd modules
mkdir syslogng-bsd syslogng-bsd/manifests
cd syslogng-bsd/manifests
vi init.pp

Voici la base d’un fichier de configuration.

class syslogng-bsd {
    file { "/usr/local/etc/syslog-ng.conf":
            path => '/usr/local/etc/syslog-ng.conf',
            owner => 'root',
            group => 'wheel',
            mode => '0644',
            source => "puppet://puppetmaster.domain.tld/files/bsd/usr/local/etc/syslog-ng.conf",
    }
    exec { "service nrpe restart":
           command     => "/usr/sbin/service syslog-ng restart",
           logoutput   => false,
           subscribe => File["/etc/nrpe.cfg"],
           refreshonly => true,
    }
}

Détaillons les directives:

  • class : correspond au nom du module

  • file : les définitions du fichier de configuration

    • le premier champ est le nom du fichier

    • path : le chemin local vers le fichier

    • owner : le propriétaire du fichier

    • group : le groupe propriétaire du fichier

    • mode : les permissions sur le fichier

    • source : le chemin distant vers le fichier

    • ensure : type de fichier

  • exec : la commande à exécuter une fois la modification effectuée

    • command : chemin absolu de la commande à faire

    • logoutput : si on affiche la sortie ou non

    • subscribe : liste des fichiers qu’on vérifie afin de valider le lancement de la commande

    • refreshonly : exécute la commande uniquement si les fichiers subscribe ont été modifiés

Le paragraphe contenant la directive ensure permet de créer un répertoire, voire une arborescence.

Création de répertoire

Afin de créer un répertoire, il suffit d’ajouter un fichier de type directory, et de positionner les droits.

file { "/usr/local/etc/nrpe.d/":
      ensure => 'directory',
      owner => 'root',
      group => 'wheel',
      mode => '0644',
}

Si les droits, utilisateurs ou groupes sont modifiés, puppet modifiera ceux-ci sans altérer le contenu du répertoire.

Configuration d’un client

Pour configurer un client ouvrez le fichier manifests/site.pp. Voici un exemple:

node "ftp.domain.tld" {
      include syslogng-bsd
      include proftpd-bsd
}

On inscrit le serveur ftp.domain.tld et on déclare 2 modules actifs, celui du syslog et celui de proftpd. Lorsque celui-ci viendra se connecter il va checker les deux modules et faire les actions programmées.

Configuration du répertoire racine des fichiers

Créez/ouvrez le fichier fileserver.conf et inscrivez les lignes suivantes:

[files]
  path /usr/local/etc/puppet/files/
  allow *.domain.tld
  allow *.domain2.tld

On déclare que le répertoire réseau puppet/files est dans /usr/local/etc/puppet/files/. On n’autorise que les machines qui sont avec un suffixe DNS connu.

Lancement du service

Le service est opérationnel. Vous pouvez le lancer.

service puppetmaster start

Note: il est inutile de redémarrer si vous ne modifiez pas la configuration du serveur mais uniquement les fichiers à distribuer.

Clients

Installation

Sous FreeBSD:

cd /usr/ports/sysutils/facter
make install clean
cd /usr/ports/sysutils/puppet
make install clean

Sous Debian:

apt-get install puppet

Configuration

Bases

On va configurer le client pour discuter avec le serveur puppetmaster. Ouvrez le fichier /etc/puppet/puppet.conf (ou /usr/local/etc/puppet/puppet.conf sous FreeBSD) et indiquez les lignes suivantes:

[agent]
  server=puppetmaster.server.tld

Vous pouvez maintenant démarrer le service:

service puppet start

Connexion au serveur

Pour permettre le client de se connecter au serveur, il faut lui faire contacter déjà une première fois celui-ci:

puppet agent --test

Allez ensuite sur le serveur pour vérifier qu’il est reconnu via la commande

puppet cert list

et ensuite acceptez le certificat

puppet cert sign myserver.domain.tld

Relancez ensuite la première commande pour vérifier que tout va bien.

Gestion des erreurs et changements

Changer de serveur puppet

Il peut parfois être utile de changer de serveur puppet, suite à une migration de serveur ou de version (avec le changement récent de 2.X vers 3.X par exemple).

Lors du changement de serveur vous vous apercevrez tout d’abord qu’il y a des problèmes de certificats. Pour les résoudre, il suffit de vous rendre dans le répertoire de certificats et de supprimer tous les fichiers .pem et .crl dans l’arborescence de certificats puppet

Sous FreeBSD ce répertoire racine est:

/var/puppet/ssl/*

Une fois ces certificats supprimés, il faudra ensuite changer le nom du serveur dans le fichier puppet.conf et enfin relancer la commande puppet agent –test (et valider le certificat sur le serveur)

Erreur de certificat (header too long)

root@puppetc1> puppet agent --test
Error: Could not request certificate: Neither PUB key nor PRIV key:: header too long
Exiting; failed to retrieve certificate and waitforcert is disabled

Cette erreur survient généralement lorsque puppet essaye d’écrire un fichier alors que le système de fichiers est plein.

Section articles