Puppet install

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script d'installation (historique)
Cible RHEL/CentOS 6, Puppet 3.x
Composants Puppet Master + Puppet Dashboard + Librarian
Voir aussi Puppet · Puppet opensource · Puppet-dashboard · Puppet forge

Puppet install documente un script d'installation « tout-en-un » historique qui met en place, sur un serveur RHEL/CentOS 6, un Puppet Master en édition open source servi par Apache/Passenger, accompagné de Puppet Dashboard (interface web de reporting) et de Librarian-puppet (gestionnaire de dépendances de modules, ancêtre de r10k).

Cette page complète Puppet opensource : là où « Puppet opensource » détaille pas à pas la configuration manuelle du master et de ses fichiers (puppet.conf, site.pp, auth.conf...), cette page présente un script shell condensé qui automatise l'ensemble de la chaîne — master, dashboard et gestion de modules — pour un déploiement de référence.

(à vérifier) Ce script date de l'époque Puppet 3.x / Ruby 1.9.3 via RVM et Passenger 5.0.14 : il est conservé à titre de référence historique et pour sa structure pédagogique, mais une installation moderne s'appuierait plutôt sur les paquets officiels du système, Puppet enterprise, ou un provisionnement par conteneur. Ne pas exécuter tel quel en une seule fois : il est prévu pour être suivi commande par commande, avec vérification à chaque étape.

Prérequis système

Dépôt Puppet Labs et paquets de compilation nécessaires à Ruby et aux gems natives :

rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
yum -y install gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel \
  libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel git

Installation de Ruby via RVM

Le script installe une version de Ruby dédiée via RVM plutôt que de dépendre du Ruby système :

curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm install 1.9.3

Installation des paquets Puppet, Dashboard et MySQL

yum -y install puppet-server httpd httpd-devel mod_ssl ruby-devel rubygems gcc-c++ \
  curl-devel zlib-devel make automake openssl-devel puppet-dashboard \
  mysql-server mysql augeas iotop

/etc/init.d/mysqld start
mysql_secure_installation

Démarrage ponctuel du master au premier plan, le temps que Puppet génère son autorité de certification (CA) et ses certificats SSL locaux :

puppet master --verbose --no-daemonize

Librarian-puppet et gestion des modules

Librarian-puppet télécharge automatiquement les modules déclarés dans un Puppetfile, à l'image d'un gestionnaire de dépendances applicatif.

gem install librarian-puppet
touch /etc/puppet/Modulefile
librarian-puppet init

Exemple de Puppetfile pointant vers le Puppet Forge public et une sélection de modules communautaires :

cat >/etc/puppet/Puppetfile <<EOF
#!/usr/bin/env ruby
#^syntax detection
forge "http://forge.puppetlabs.com"
# use dependencies defined in Modulefile
modulefile
mod 'puppetlabs/stdlib'
mod 'puppetlabs/concat'
mod 'puppetlabs/firewall'
mod 'puppetlabs/ntp'
mod 'puppetlabs/haproxy'
mod 'puppetlabs/nginx'
mod 'puppetlabs/git'
mod 'example42/logrotate'
mod 'dwerder/graphite'
mod 'pdxcat/collectd'
EOF

librarian-puppet install --verbose

Puppet Master en Apache/Passenger

Installation de Passenger et du module Apache associé :

gem install rack passenger
passenger-install-apache2-module

VirtualHost Apache du master, écoutant sur le port standard 8140 avec authentification client par certificat SSL :

cat >/etc/httpd/conf.d/puppetmaster.conf <<EOF
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-5.0.14/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-5.0.14
  PassengerDefaultRuby /usr/bin/ruby
</IfModule>
PassengerHighPerformance On
PassengerMaxPoolSize 2
PassengerMaxRequests 1000
PassengerPoolIdleTime 600
Listen 8140
<VirtualHost *:8140>
    SSLEngine On
    SSLProtocol             All -SSLv2
    SSLCipherSuite          HIGH:!ADH:RC4+RSA:-MEDIUM:-LOW:-EXP
    SSLCertificateFile      /var/lib/puppet/ssl/certs/puppet.example.tld.pem
    SSLCertificateKeyFile   /var/lib/puppet/ssl/private_keys/puppet.example.tld.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
    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>
EOF

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/config.ru /usr/share/puppet/rack/puppetmasterd/
chown puppet /usr/share/puppet/rack/puppetmasterd/config.ru

apachectl configtest
service httpd restart

Note : les chemins passenger-5.0.14 et ruby/gems/1.8 sont spécifiques à la version installée par RVM/gem au moment de l'exécution — ils doivent être adaptés à l'environnement réel (voir la sortie de passenger-install-apache2-module).

Coloration syntaxique Vim

Récupération du fichier de coloration syntaxique des manifests Puppet (voir Puppet.vim pour le détail du fichier) :

mkdir -p ~/.vim/syntax
cd ~/.vim/syntax/
curl -sO http://downloads.puppetlabs.com/puppet/puppet.vim

Base de données et déploiement de Puppet Dashboard

Création de la base MySQL dédiée au dashboard :

CREATE DATABASE dashboard CHARACTER SET utf8;
CREATE USER 'dashboard'@'localhost' IDENTIFIED BY 'ChangeMe_StrongPassword!';
GRANT ALL PRIVILEGES ON dashboard.* TO 'dashboard'@'localhost';

Fichier de configuration de la connexion base de données du dashboard :

cat >/usr/share/puppet-dashboard/config/database.yml <<EOF
production:
  database: dashboard
  username: dashboard
  password: ChangeMe_StrongPassword!
  encoding: utf8
  adapter: mysql
development:
  database: dashboard_development
  username: dashboard
  password:
  encoding: utf8
  adapter: mysql
test:
  database: dashboard_test
  username: dashboard
  password:
  encoding: utf8
  adapter: mysql
EOF

cd /usr/share/puppet-dashboard/
rake RAILS_ENV=production db:migrate

VirtualHost Apache du dashboard (port 3000), avec restriction d'accès par IP sur les endpoints de reporting et authentification basique sur le reste de l'interface :

cat >/etc/httpd/conf.d/dashboard.conf <<EOF
<IfModule mod_passenger.c>
  PassengerRoot  /usr/lib/ruby/gems/1.8/gems/passenger-5.0.14
  PassengerDefaultRuby /usr/bin/ruby
</IfModule>
PassengerHighPerformance On
PassengerMaxPoolSize 2
PassengerMaxRequests 1000
PassengerPoolIdleTime 600
PassengerStatThrottleRate 120
<VirtualHost *:3000>
    ServerName puppet.example.tld
    DocumentRoot /usr/share/puppet-dashboard/public/
    <Directory /usr/share/puppet-dashboard/public/>
        Options None
        AllowOverride None
        Order Allow,Deny
        Allow from All
    </Directory>
    ErrorLog /var/log/httpd/puppet.example.tld_error.log
    LogLevel warn
    CustomLog /var/log/httpd/puppet.example.tld_access.log combined
    <Location /reports/upload>
       <Limit POST>
           Order allow,deny
           Allow from localhost
           Allow from 127.0.0.1
           Allow from 203.0.113.10
           Satisfy any
       </Limit>
   </Location>
   <Location /nodes>
       <Limit GET>
           Order allow,deny
           Allow from localhost
           Allow from 127.0.0.1
           Allow from 203.0.113.10
           Satisfy any
       </Limit>
   </Location>
   <Location "/">
       AuthType basic
       AuthName "Puppet Dashboard"
       Require valid-user
       AuthBasicProvider file
       AuthUserFile /etc/httpd/users
   </Location>
</VirtualHost>
EOF

htpasswd -c /etc/httpd/htpasswd adminuser

touch /usr/share/puppet-dashboard/log/production.log
chmod 0666 /usr/share/puppet-dashboard/log/production.log

Activation des services

Le master et le dashboard sont désormais servis par Apache/Passenger : les services standalone puppetmaster et puppet-dashboard sont donc désactivés au profit d'httpd et des workers du dashboard.

chkconfig puppetmaster off
chkconfig puppet-dashboard off

rvm use system

chkconfig httpd on
chkconfig mysqld on
chkconfig puppet-dashboard-workers on

# Nettoyage des paquets de compilation devenus inutiles
yum remove gcc-c++ make automake

Voir aussi

  • Puppet — page hub de la sous-branche Puppet
  • Puppet opensource — installation manuelle pas à pas, orientée configuration
  • Puppet-dashboard — interface web de reporting
  • Puppet forge — dépôt public de modules consommé par Librarian-puppet
  • Puppet client — configuration des agents qui se connectent à ce master
  • Puppet.vim — coloration syntaxique des manifests