PuppetDB : Augmentez les fonctionnalités de votre Puppet

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
Puppet

Software version 1.5.2
Operating System Debian 7
Website Puppet Website
Last Update 28/10/2013
Others

1 Introduction

PuppetDB[1] permet de récupérer les données collectées par Puppet comme les facts et d’utiliser entre autres les ressources exportées. Ces données pourront ensuite être utilisées par d’autres programmes, comme le dashboard, ou vos propres outils grâce à une API. Vous pouvez installer le serveur PuppetDB sur votre PuppetMaster ou sur un serveur à part.[2]

Il est aujourd'hui possible d'utiliser 2 backends pour y stocker ces données :

  • HSQLDB : base de donnée en mémoire, avec pas mal de limitations en plus de celle des 100 noeuds maximum, mais extrêmement rapide (car chargée en RAM)
  • PostgreSQL : base de donnée classique, avec moins de performances (sur disque), mais avec plus de souplesse et une possibilité d'extension plus grande dans le temps (+100 noeuds Puppet).

Nous partirons donc sur la solution basée sur PostgreSQL.

Si vous souhaitez plus d'informations, regardez les différents goulots d’étranglement. En gros et pour résumer : si vous avez plus de 100 clients, il vous faudra une base de données PostgreSQL, gonfler votre JVM, augmenter le nombre de cpu/coeurs.

2 Installation

2.1 PuppetDB

Commençons par mettre en place le nécessaire pour pouvoir ensuite installer PuppetDB :

Command
wget http://apt.puppetlabs.com/puppetlabs-release-stable.deb
dpkg -i puppetlabs-release-stable.deb

Et ensuite, nous mettez à jour :

Command aptitude
aptitude update

Puis il va falloir que vous ayez puppet d'installé sur la même machine où sera installé PuppetDB.

Warning WARNING
PuppetDB ne peut fonctionner sans le client puppet !

Peut importe s'il s'agisse ou non de la même machine que le master. Par soucis de simplicité, nous allons l'installer sur le Puppet Master.

Command aptitude
aptitude install puppetdb puppet

2.2 PostgreSQL

Comme nous prévoyons d'avoir plus de 100 clients (ou même si c'est moins, pas forcément envie de changer la configuration d'ici quelques temps), nous allons installer PostgreSQL :

Command aptitude
aptitude install postgresql

2.3 Terminus

Sur le serveur Puppet Master, installez ce package :

Command aptitude
aptitude install puppetdb-terminus

3 Configuration

3.1 PostgreSQL

Nous allons créer un utilisateur, ainsi qu'une base :

Command
su - postgres
createuser -DRSP puppetdb
createdb -O puppetdb puppetdb
exit

3.2 PuppetDB

Configurez les informations de la base de donnée pour commencer :

Configuration File /etc/puppetdb/conf.d/database.ini
[database]
# For the embedded DB: org.hsqldb.jdbcDriver
# For PostgreSQL: org.postgresql.Driver
# Defaults to embedded DB
classname = org.postgresql.Driver 
# For the embedded DB: hsqldb
# For PostgreSQL: postgresql
# Defaults to embedded DB
subprotocol = postgresql 
# For the embedded DB: file:/path/to/database;hsqldb.tx=mvcc;sql.syntax_pgs=true
# For PostgreSQL: //host:port/databaseName
# Defaults to embedded DB located in <vardir>/db
subname = //localhost:5432/puppetdb 
# Connect as a specific user
username = puppetdb 
# Use a specific password
password = puppetdb 
# How often (in minutes) to compact the database
# gc-interval = 60
 
# Number of seconds before any SQL query is considered 'slow'; offending
# queries will not be interrupted, but will be logged at the WARN log level.
log-slow-statements = 10

Nous définissons donc ici, les propriétés de connexion à la base de donnée, ainsi que les identifiants que nous venons de créer juste avant.

Nous allons maintenant configurer le nombre de thread :

Configuration File /etc/puppetdb/conf.d/config.ini
# See README.md for more thorough explanations of each section and
# option.
 
[global]
# Store mq/db data in a custom directory
vardir = /var/lib/puppetdb
# Use an external log4j config file
logging-config = /etc/puppetdb/conf.d/../log4j.properties
 
# Maximum number of results that a resource query may return
resource-query-limit = 20000
 
[command-processing]
# How many command-processing threads to use, defaults to (CPUs / 2)
threads = 4

Adaptez le nombre de thread à votre nombre de processeur divisé par 2.

Puis, nous attaquons la configuration de Jetty :

Configuration File /etc/puppetdb/conf.d/jetty.ini
[jetty]
# Hostname to list for clear-text HTTP.  Default is localhost
host = 0.0.0.0# Port to listen on for clear-text HTTP.
port = 8080
 
ssl-host = 0.0.0.0ssl-port = 8081
keystore = /etc/puppetdb/ssl/keystore.jks
truststore = /etc/puppetdb/ssl/truststore.jks
 
key-password = CoaRwY6IL8KQd8H6SfZ7O9hHC
trust-password = CoaRwY6IL8KQd8H6SfZ7O9hHC

Pour le host, ajoutez l'interface qui écoutera sur le port 8080 et 8081. Elle permet notamment de permettre au dashboard de se connecter dessus.

Warning WARNING
Si vous en avez la possibilité et par mesure de sécurité, laissez tout sur localhost. Il est évident que Puppet Master doit se trouver sur cette même machine si host et host_ssl valent localhost

Redémarrez ensuite PuppetDB :

Command
/etc/init.d/puppetdb restart

Après quelques secondes/minutes, vous devriez pouvoir vous connecter sur le port 8081 (ssl) ou 8080 (non ssl) (http://<hostname>:8080|https://<hostname>:8081), vous aurez alors la possibilité de voir une belle interface :

Puppetdb dashboard.png

3.3 Puppet Master

Sur le master, vous devez toucher à sa configuration :

Configuration File /etc/puppet/puppet.conf
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
pluginsync = true
 
[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY
storeconfigs = truestoreconfigs_backend = puppetdbreport = true
 
[agent]
server=puppet-prd.deimos.fr

Warning WARNING
Retirez les lignes thin_storeconfigs et async_storeconfigs si vous les utilisez, ou passez les à False

Puis nous allons mettre en place un fichier pour la configuration de Puppet, afin de lui indiquer comment se connecter au PuppetDB :

Configuration File /etc/puppet/puppetdb.conf
[main]
server = puppet-prd.deimos.frport = 8081

Et pour finir, un fichier permettant de définir l'emplacement des facts :

Configuration File /etc/puppet/routes.yaml
---
master:
  facts:
    terminus: puppetdb    cache: yaml

Et voilà, votre serveur Puppet a un backend PuppetDB qui est maintenant fonctionnel :-)

4 FAQ

4.1 J'ai des erreurs OutOfMemoryError dans mes logs et PuppetDB réponds difficilement

Pour valider que le problème provient bien d'une insuffisance mémoire, vérifiez que ce fichier exite (/var/log/puppetdb/puppetdb-oom.hprof), et assurez vous que le contenu vous parle d'OOM.

Il va falloir augmenter la Java Heap size (valeur du Xmx) de votre PuppetDB qui en fait requiert plus de RAM. Augmentez donc cette valeur :

Configuration File /etc/default/puppetdb
###########################################
# Init settings for puppetdb
###########################################
 
# Location of your Java binary (version 6 or higher)
JAVA_BIN="/usr/bin/java"
 
# Modify this if you'd like to change the memory allocation, enable JMX, etc
JAVA_ARGS="-Xmx192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/puppetdb/puppetdb-oom.hprof " 
# These normally shouldn't need to be edited if using OS packages
USER="puppetdb"
INSTALL_DIR="/usr/share/puppetdb"
CONFIG="/etc/puppetdb/conf.d"

Pour avoir une idée de la valeur à mettre (n représentant le nombre de nodes) :

128M + (1M * n)

5 References

  1. ^ http://docs.puppetlabs.com/puppetdb/1/index.html
  2. ^ http://binbash.fr/2012/11/14/puppet-3-et-puppetdb/