Ceci est une ancienne révision du document !
Configurer les automatisations de Puppet
Création — Nicolas THOREZ 2022/11/20 17:37
Architecture et composants
L'ensemble des règles de Puppet est contenu dans le dossier /etc/puppetlabs/code/environments. A ce premier niveau on trouvera les différents environnements. production est créé par défaut mais il est possible d'en ajouter d'autres, preprod, test, etc…
Au sein des dossiers d'environnement, on trouvera notamment :
- le fichier
environment.conf: contient les paramétrages depuppetpour cet environnement. - le dossier
manifest: contient les règles d'automatisation a appliquer. - le dossier
modules: contient les modules disponibles pour cet environnement.
Lorsqu'un agent se connecte, le serveur puppet compile l'ensemble des fichiers *.pp de l'environnement sélectionné et informe l'agent des règles qui le concerne et par conséquent, des actions à réaliser. Parmis ces fichiers, le plus important est le fichier site.pp qui correspond au fichier général pour l'ensemble des clients.
- Référence : Puppet
Le langage Puppet
- Référence : The Puppet language
Le langage utilisé par puppet permet de décrire l'état dans lequel au souhaite mettre le système. On parlera alors de :
ressources: l'état d'un élément du système. Il peut s'agir d'un paquet, un fichier, un service, accompagné pour chacun d'entre eux de l'état du-dit objet.classes: un ensemble de ressources regroupées au sein d'un même objet afin de pouvoir être géré en une seule fois.manifest: un fichier avec l'extensionppcontenant des déclarations de ressources et/ou de classes.catalogs: l'ensemble des données (ressources,classesetmanifests) disponibles pour un agent.
La syntaxe utilisée est généralement du type :
ressource { 'Titre':
paramètre1 => 'valeur',
paramètre2 => 'valeur',
}
Au delà de ces déclarations de ressources, puppet inclue des éléments de codage afin de dynamiser les manifestes. Parmi ces éléments, on a droit à :
Déclaration de variables
$variable = 'valeur'
La variable est nommée et utilisé par le biais du symbole $.
Condition à test unitaire (if)
if $trusted['hostname'] == 'serv1' {
include class1
} elsif $trusted['hostname'] == 'serv2' {
include class2
} else {
include class3
}
Le test est introduit par if. Si le résultat du test est correct alors la ressource suivante est envoyée. Sinon, une nouvelle condition peut être introduite par elsif. Si aucune condition n'est valide, le terme else permet d'envoyer une ressource spécifique.
Condition à test multiple (case)
case $trusted['hostname'] {
'serv1': {
include class1
}
'serv2': {
include class2
}
default: {
include class3
}
}
case introduit la condition à vérifier. Cette dernière est alors comparée à chacune des propositions disponibles et, à chaque correspondance, exécute la ressource qui y est attachée. Le terme default permet de définir une réponse par défaut.
Condition négative (unless)
unless $trusted['hostname'] == 'serv1' {
include class4
}
unless permet d'appliquer un résultat à chaque fois que la condition est fausse. Ainsi, dans cet exemple, la classe n°4 sera inclue sur chaque serveur à l'exception de serv1.
Sélecteur (?)
$servfunction = $trusted['hostname'] ? {
'serv1' => 'dns',
'serv2' => 'apache2',
default => 'none',
}
Le sélecteur fonctionne de la même manière que case à la différence qu'au lieu de fournir des ressources à exécuter, il définie une valeur. il est introduit par le symbole ? suivant la condition à évaluer.
Hiérarchie
Il est possible de définir une hiérarchie aux niveaux des ressources afin de s'assurer la mise en place de dépendances. On aura donc le choix parmi :
before: applique la ressource principale avant la ressource déclarée après lebefore.require: applique la ressource introduite par lerequireavant la ressource principale.notify: commebeforeà la différence sauf que si la ressource principale est modifié, la ressource secondaire est réappliquée.subscribe: commerequireà la différence que si la ressource introduite est modifié, la ressource principale est réappliquée.
Type de ressources les plus fréquents
exec
Permet l'exécution d'une commande spécifique.
- Référence : Resource Type: exec
exec { 'HelloWorld': # Nom de la ressource
command => 'echo "Hello World!"', # Commande à exécuter
cwd => '/tmp', # Dossier à partir duquel exécuter la commande
path => ['/bin/', '/usr/bin', '/usr/sbin',], # Dossiers dans lesquels chercher la commande à exécuter
}
file
Pour la création, modification suppression d'un fichier.
- Référence : Ressource Type: file
file { '/home/nekan/test.txt': # Chemin du fichier
content => template('file/test.txt'), # Emplacement de la source
ensure => 'present', # 'present' pour la création et 'absent' pour la suppression
mode => '0755', # Droits du fichier (chmod)
owner => 'nekan', # Propriétaire du fichier (chown)
group => 'adm', # Groupe du fichier (chgrp)
}
file_line
Pour l'ajout, la modification ou la suppression d'une ligne dans un fichier.
- Référence : Ressource Type: file_line
file_line { 'puppet_test': # Nom de la ligne (arbitraire)
line => 'ligne = ligne de test', # contenu de la ligne tel qu'elle doit être dans le fichier
match => '^ligne', # 'match' permet de vérifier la ligne à modifier par le biais d'une regex
after => '^# Logs', # recherche la ligne à modifier après une ligne spécifié par la regex
path => '/etc/nagios/nrpe.d/check_debian.cfg', # Chemin du fichier à modifier
notify => Service['nagios-nrpe-server'], # Service à notifier (redémarrer, recharger) après modification
}
package
Pour gérer les paquets (installation, suppression, …)
- Référence : Resource Type: package
package { 'openssl': # Paquet à gérer
ensure => 'present', # A installer si absent
mark => 'hold', # Verrouiller la version (empêche les mises à jour)
}
service
Permet de gérer un service (démarrage, arrêt, redémarrage, rechargement, etc.)
- Référence : Resource Type: service
service { 'apache2': # Service à gérer
ensure => 'running', # Le service doit être en cours d'exécution
enable => 'true', # Le service doit être en démarrage automatique
}
ssh_authorized_key
Permet de gérer les fichiers authorized_keys (contenant les clés SSH publiques ainsi que leurs options)
- Référence : Resource Type: ssh_authorized_key
ssh_authorized_key { '/home/nekan/.ssh/authorized_keys': # Gestion du fichier ~/.ssh/authorized_keys
ensure => 'present', # present : création si absent | absent : suppression si présent
user => 'nekan', # Définition du l'utilisateur lié à la clé
type => 'ssh-rsa', # Type de la clé à ajouter
key => 'AAAAB3NzaC[...]Z6q17zF4sW1WvU=', # Clé à ajouter
}
user
Permet de gérer les utilisateurs (création, suppression, etc)
- Référence : Resource Type: user
user { 'nekan': # Création de l'utilisateur
ensure => present, # present : création si absent | absent : suppression si présent
shell => "/bin/bash", # Le shell qu'utilisera l'utilisateur
password => '$6$/odkSIo4.[...]YW/lpsg1', # Le mot de passe de l'utilisateur en version sécurisée
groups => ['sudo'], # La lise de groupes que doit intégrer l'utilisateur
managehome => yes, # Création du dossier home
}
Les classes
- Référence : Classes
Les classes sont des déclarations de ressources introduites par le terme class. Une fois déclarée, la classe peut être ajoutée à l'exécution par les termes :
include: il s'agit de la déclaration la plus fréquente, elle exécute simplement la classe.require: ce terme introduit la classe en tant que dépendance.contain: ce terme introduit la classe en tant que composant d'une autre classe.
A l'intérieur de la classe, on trouvera une succession de déclarations d'autres ressources, le but étant de gérer toutes ces ressources en une seule fois.
class apache {
package {'apache2':
ensure => present
before => File['/etc/apache2/apache2.conf'],
}
file {'/etc/apache2/apache2.conf':
ensure => file,
owner => 'www-data',
content => file('apache/apache2.conf'),
}
service {'apache2':
ensure => running,
enable => true,
subscribe => File['/etc/apache2/apache2.conf'],
}
}
Les nœuds
Les nœuds ne sont rien d'autres que les clients du serveur puppet. Ils sont définis par le mot-clé node, suivi du nom du client et de l'ensemble des modules et classes qui doivent s'appliquer à ce dernier. Exemple :
node 'test1' { include class1, class2, class3 }
node 'test2' {
include class1
include class4
include class5
}
Les templates
- Référence : Creating templates using Embedded Puppet
Les templates sont des fichiers particuliers dont l'extension est *.epp (pour les versions puppet pures) ou *.erb (pour les versions ruby). La différence principale avec les fichiers de ressources est que les templates embarquent du code dans leurs contenus permettant une personnalisation du résultat final, là où les fichiers sont statiques. Les templates sont enregistrés dans le sous-dossier du même nom dans les dossiers des modules auxquels ils appartiennent. En résumé :
file:- emplacement :
/etc/puppetlabs/code/environment/<ENVIRONEMENT>/modules/<MODULE>/files/<FICHIER> - contenu : fixe
template:- emplacement :
/etc/puppetlabs/code/environment/<ENVIRONEMENT>/modules/<MODULE>/templates/<FICHIER> - contenu : dynamique

Discussion