Puppet opensource

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Guide d'installation manuelle
Cible RHEL/CentOS 5/6, Puppet 2.7/3.x open source
Composants Puppet Master seul (Apache/Passenger)
Voir aussi Puppet · Puppet install · Puppet client

Puppet opensource détaille l'installation et la configuration manuelle, étape par étape, d'un serveur Puppet Master en édition open source (par opposition à Puppet enterprise) sur une base RHEL/CentOS, ainsi que la structure des principaux fichiers de configuration (puppet.conf, site.pp, auth.conf, autosign.conf).

Cette page se concentre sur la compréhension des fichiers de configuration du master : elle est complémentaire de Puppet install, qui propose un script shell condensé automatisant l'ensemble master + dashboard + gestion de modules. Pour la configuration des agents qui se connectent à ce master, voir Puppet client.

(à vérifier) Les paquets et procédures ci-dessous datent de l'ère Puppet 2.7/3.x (dépôts el5/el6, Passenger 3.x) : à adapter aux versions actuelles de Puppet et aux dépôts correspondants.

Liens utiles

Installation des paquets

Prérequis

Ruby doit être installé (dépendance du client et du serveur Puppet).

Dépôt Puppet Labs

# el5
rpm -ivh http://yum.puppetlabs.com/el/5/products/x86_64/puppetlabs-release-5-7.noarch.rpm
# el6
rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm

Installation du master

Le domaine doit disposer d'un enregistrement DNS valide ; à défaut, utiliser le fichier /etc/hosts local.

yum install puppet-server vim-puppet
/etc/init.d/puppetmaster start

# Démarrage au boot
puppet resource service puppetmaster ensure=running enable=true

Puppet Master en Apache/Passenger

Par défaut, le master tourne en Webrick (mono-thread, adapté aux petits environnements). Pour une charge plus importante, on le sert via Apache et Passenger.

Dépendances

yum install -y httpd httpd-devel mod_ssl ruby-devel rubygems gcc-c++ curl-devel zlib-devel make automake

Installation de Rack/Passenger

gem install rack passenger
passenger-install-apache2-module

Arborescence Rack du master

mkdir -p /usr/share/puppet/rack/puppetmasterd
mkdir /usr/share/puppet/rack/puppetmasterd/public /usr/share/puppet/rack/puppetmasterd/tmp
cp /usr/share/puppet/ext/rack/files/config.ru /usr/share/puppet/rack/puppetmasterd/
chown puppet /usr/share/puppet/rack/puppetmasterd/config.ru

VirtualHost Apache

Adapter les chemins LoadModule passenger_module et PassengerRoot à la version de Passenger réellement installée (visible dans la sortie de passenger-install-apache2-module).

# RHEL/CentOS
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.19
PassengerRuby /usr/bin/ruby

# Tuning des performances Passenger
PassengerHighPerformance On
# PassengerUseGlobalQueue On
# Environ 1.5x le nombre de coeurs CPU du master :
PassengerMaxPoolSize 6
# Recycle les process maîtres après 1000 requêtes
PassengerMaxRequests 1000
# Arrête les process inactifs après 10 minutes
PassengerPoolIdleTime 600
PassengerStatThrottleRate 120

Listen 8140
<VirtualHost *:8140>
    SSLEngine On

    # Autoriser uniquement une cryptographie forte (à adapter si besoin de compatibilité)
    SSLProtocol             -ALL +SSLv3 +TLSv1
    SSLCipherSuite          ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP
    SSLCertificateFile      /var/lib/puppet/ssl/certs/puppet.pem
    SSLCertificateKeyFile   /var/lib/puppet/ssl/private_keys/puppet.pem
    SSLCertificateChainFile /var/lib/puppet/ssl/ca/ca_crt.pem
    SSLCACertificateFile    /var/lib/puppet/ssl/ca/ca_crt.pem
    SSLCARevocationFile     /var/lib/puppet/ssl/ca/ca_crl.pem
    SSLVerifyClient         optional
    SSLVerifyDepth          1
    SSLOptions              +StdEnvVars +ExportCertData

    # En-têtes transmettant l'authentification par certificat client au master
    RequestHeader set X-SSL-Subject %{SSL_CLIENT_S_DN}e
    RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
    RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e

    DocumentRoot /usr/share/puppet/rack/puppetmasterd/public/
    <Directory /usr/share/puppet/rack/puppetmasterd/>
        Options None
        AllowOverride None
        Order Allow,Deny
        Allow from All
    </Directory>
</VirtualHost>

(à vérifier) SSLProtocol -ALL +SSLv3 +TLSv1 est obsolète et vulnérable (SSLv3/POODLE) : sur un déploiement moderne, restreindre à TLSv1.2 minimum.

Liens symboliques des certificats

cd /var/lib/puppet/ssl/certs/
ln -sf `hostname --fqdn`.pem puppet.pem
cd /var/lib/puppet/ssl/private_keys/
ln -sf `hostname --fqdn`.pem puppet.pem

/etc/init.d/puppetmasterd stop
/etc/init.d/httpd start
chkconfig puppetmaster off
chkconfig httpd on

Sécurité : autorisation et autosignature

vi /etc/puppet/auth.conf
# en cas de souci d'authentification côté client
# allow *.domain.tld

vi /etc/puppet/autosign.conf
# *.domain.tld

(à vérifier) L'autosignature par wildcard de domaine (*.domain.tld) est pratique en test mais risquée en production : n'importe quel hôte capable de résoudre ce domaine peut alors obtenir un certificat signé automatiquement. Préférer une autosignature nominative ou un processus de signature manuelle en production.

Fichiers de manifests

touch /etc/puppet/manifests/{common.pp,modules.pp,site.pp}

Le fichier common.pp porte la configuration globale appliquée à tous les nœuds. Le fichier modules.pp déclare les modules de base hérités par toute machine gérée par Puppet — par exemple un module base :

# /etc/puppet/manifests/modules.pp
import "base"

Le fichier site.pp charge l'ensemble et définit les paramètres globaux (filebucket de sauvegarde, chemin d'exécution par défaut des ressources exec) :

# /etc/puppet/manifests/site.pp
import "common.pp"

# Sauvegarde des fichiers modifiés côté serveur
filebucket { main: server => 'puppet-server.example.tld' }

# Sauvegarde de tous les fichiers gérés, en ignorant les répertoires de VCS
File {
    backup => '.puppet-bak',
    ignore => ['.svn', '.git', 'CVS'],
}

# Chemin d'exécution par défaut des ressources exec
Exec { path => "/usr/bin:/usr/sbin/:/bin:/sbin" }

# Import du module de base
import "modules.pp"

Note : la directive import est dépréciée depuis Puppet 4 au profit de l'autoload par convention de nommage des classes/modules — cette syntaxe correspond à des versions antérieures.

Fichier de configuration principal (puppet.conf)

# /etc/puppet/puppet.conf
[main]
    logdir  = /var/log/puppet
    rundir  = /var/run/puppet
    ssldir  = $vardir/ssl
    factpath = $vardir/lib/facter
    templatedir = $confdir/templates
    pluginsync = true

[master]
    # Nécessaire quand le master tourne sous Passenger
    # (peut être retiré si Webrick est utilisé)
    ssl_client_header        = HTTP_X_SSL_SUBJECT
    ssl_client_verify_header = SSL_CLIENT_VERIFY
    report = true

[agent]
    # Fichier listant les classes associées à la configuration récupérée
    classfile   = $vardir/classes.txt
    # Cache local de la configuration compilée
    localconfig = $vardir/localconfig
    server = puppet.example.tld

Vérification de l'installation

netstat -ln | grep 8140
https://hostname.example.tld:8140/

Si le message suivant s'affiche, le serveur fonctionne (l'environnement demandé n'est simplement pas valide, ce qui est attendu pour un accès brut au navigateur) :

The environment must be purely alphanumeric, not 

Le serveur est installé : il reste à configurer les nœuds clients, voir Puppet client.

Exploitation courante

Démarrage en mode debug

puppet master --no-daemonize --verbose

Redémarrage des services

/etc/init.d/puppetmaster stop
/etc/init.d/puppetmaster start
/etc/init.d/puppet-dashboard stop
/etc/init.d/puppet-dashboard start
/etc/init.d/puppet-dashboard-workers stop
/etc/init.d/puppet-dashboard-workers start

Voir aussi