Vous êtes sur la page 1sur 21

Puppet

Explications
Description des machines et modules
Le dépôt Git de Puppet est découpé en quatre parties :
Le dossier modules contient les différentes classes utilisées pour déployer des
éléments sur les machines ;
Le fichier Puppetfile contient la liste des modules proposés à la communauté
dont nous avons besoin ;
Le dossier data contient la description de chaque machine et chaque groupe en
fonction d’une arborescence définie dans le fichier hiera.yaml ;
Le dossier manifests contient un fichier site.pp afin de faire le mapping entre
le dossier data et modules.
Dossier modules
Contient les modules “maison”, sur le serveur Puppet, les modules présents dans
Puppetfile sont téléchargés et ajoutés dans ce dossier ;

Les modules sont principalement composés de fichiers (files), fichiers


dynamiques (templates) et classes (manifests) ;

Les classes sont des ensembles d’actions à effectuer lorsqu’elles sont incluses ;

Les classes peuvent avoir des paramètres et des valeurs par défaut ;

N’hésitez pas à lire le fichier README.md, il vous expliquera comment fonctionne


le module.
Classe exemple
class apache_config ( La classe apache_config se trouve dans le fichier
$default_charset = undef,
$other_vhost_access_log = true, modules/apache_config/manifests/init.pp
$server_tokens = 'OS',
$server_signature = 'On', Elle contient 4 paramètres :
) {
● default_charset
package { 'apache2' :
ensure => present , ● other_vhost_access_log
} -> ● server_tokens
package { 'apache2-bin' :
ensure => present , ● server_signature
} ->
package { 'apache2-data' : Dans cet exemple, les paquets apache2, apache2-bin,
ensure => present ,
} -> apache2-data et apache2-utils seront installés depuis
package { 'apache2-utils' : les dépôts (apt sur Debian, yum sur CentOS)
ensure => present ,
}
[...]
}
Arborescence de data
4 mots-clés peuvent être substitués lors de la recherche d’information dans
l’arborescence de data :
● location_title correspond à la localisation de la machine dans The Foreman
● hostgroup correspond au groupe d’hôtes dans The Foreman
● trusted.certname correspond au nom de la machine de l’agent Puppet
● facts.os.family correspond au nom de l’OS de la machine de l’agent Puppet
2 types de fichiers sont présents dans l’arborescence :
● .yaml est le fichier standard
● .eyaml est un fichier contenant des données à déchiffrer par le serveur, le
fichier .eyaml sera toujours prioritaire sur sa version .yaml
Arborescence de data - Recherche d’une machine
Recherche de la machine dans sa localisation puis son groupe
locations/%{location_title}/groups/%{hostgroup}/nodes/%{trusted.certname}.eyaml
locations/%{location_title}/groups/%{hostgroup}/nodes/%{trusted.certname}.yaml
Recherche de la machine dans son groupe
groups/%{hostgroup}/nodes/%{trusted.certname}.eyaml
groups/%{hostgroup}/nodes/%{trusted.certname}.yaml
Recherche de la machine dans sa localisation
locations/%{location_title}/nodes/%{trusted.certname}.eyaml
locations/%{location_title}/nodes/%{trusted.certname}.yaml
Recherche de la machine dans le dossier par défaut
nodes/%{trusted.certname}.eyaml
nodes/%{trusted.certname}.yaml
Arborescence de data - Recherche par groupe
Ajout d’information en fonction du groupe et de la localisation de la machine
locations/%{location_title}/groups/%{hostgroup}/group.eyaml
locations/%{location_title}/groups/%{hostgroup}/group.yaml
locations/%{location_title}/groups/%{hostgroup}/group/*.yaml

Ajout d’information en fonction du groupe de la machine


groups/%{hostgroup}/group.eyaml
groups/%{hostgroup}/group.yaml
groups/%{hostgroup}/group/*.yaml

Ajout d’information en fonction de la localisation de la machine


locations/%{location_title}/location.yaml
Arborescence de data - Recherche par OS
Ajout d’information en fonction de l’OS, la localisation et le groupe
locations/%{location_title}/groups/%{hostgroup}/os/%{facts.os.family}.eyaml
locations/%{location_title}/groups/%{hostgroup}/os/%{facts.os.family}.yaml
Ajout d’information en fonction de l’OS et du groupe
groups/%{hostgroup}/os/%{facts.os.family}.eyaml
groups/%{hostgroup}/os/%{facts.os.family}.yaml
Ajout d’information en fonction de l’OS et de la localisation
locations/%{location_title}/os/%{facts.os.family}.eyaml
locations/%{location_title}/os/%{facts.os.family}.yaml
Ajout d’information en fonction de l’OS (dans le dossier par défaut)
os/%{facts.os.family}.eyaml
os/%{facts.os.family}.yaml
Arborescence de data - Informations génériques
Informations génériques liées à une localisation
locations/%{location_title}/common/*.eyaml
locations/%{location_title}/common/*.yaml

Informations communes à toutes les machines


common/*.eyaml
common/*.yaml
Arborescence de data - Selection des données
Par défaut, la première donnée retournée arrête la recherche.

Il est possible de fusionner les configurations, dans ce cas, la donnée trouvée la


plus tôt sera prioritaire sur les autres données.

Ce qu’il faut retenir, c’est cet ordre de priorité :


Noeud > Localisation + Groupe > Groupe > Localisation > OS > Commun

Exemple :
Une donnée écrite au niveau noeud sera prioritaire sur celle du groupe et de l’OS.
Arborescence de data - Exemple de fichier 1
--- # data/groups/rproxy-prod/group.yaml Configuration de la fusion sur la clé
lookup_options:
apache_config: apache_config
merge: deep

classes:
Import de 2 classes du module
- apache_config::rproxy apache_config
- apache_config::vhost::autoconf

apache_config::rproxy::cas_server: 'https://cas.farmeo.fr/cas' Configuration des classes de


apache_config::rproxy::balancers: apache_config
- 'docker-prod-backend'

apache_config::server_tokens: Prod [...]


apache_config::server_signature: 'Off'

apache_config::mods::mpm_event::start_servers
: 8
apache_config::mods::mpm_event::max_request_workers
: 800
apache_config::mods::mpm_event::min_spare_threads
: 75
apache_config::mods::mpm_event::max_spare_threads
: 250
apache_config::mods::mpm_event::thread_per_childs
: 50

[...]
Arborescence de data - Exemple de fichier 2
--- # data/groups/rproxy-prod/group.yaml [...]
[...]

apache_config::mods::cas::timeout: 57600 Configuration des classes de


apache_config::mods::cas::idleTimeout: 43200
apache_config
apache_config:
vhosts: Création des vhosts dans Apache (le
"default":
enable: true module apache_config cherche une clé
priority: 10 du même nom pour auto-configurer
parts:
- template: frontends/default simplement les VHosts).
"default-ssl":
enable: true
priority: 10
parts:
- file: frontends/default-ssl
Correspondance entre modules et data
Le nom de la classe et le paramètre doivent être séparés par :: dans yaml :

mon_module::mon_parametre: valeur
mon_module::ma_sous_classe::mon_parametre: valeur

class apache_config (
$default_charset = undef, apache_config:: default_charset: null
$other_vhost_access_log = true, apache_config:: other_vhost_access_log: true
$server_tokens = 'OS', apache_config:: server_tokens: Prod
$server_signature = 'On', apache_config:: server_signature: Off
$trace_enable = 'Off', apache_config:: trace_enable: Off
)

class apache_config::rproxy ( apache_config::rproxy:: cas_server: https://cas/


String $cas_server, apache_config::rproxy:: balancers:
Array[String] $balancers = [], - 'docker-prod-backend'
)
eyaml - Chiffrement de donnée pour les fichiers .eyaml
Sur le serveur Puppet, lancer la commande

Pour chiffrer un mot de passe (le mot de passe sera demandé pendant l’exécution) :
/opt/puppetlabs/puppet/bin/eyaml encrypt -o string -p

Pour chiffrer un fichier (présent sur le serveur) :


/opt/puppetlabs/puppet/bin/eyaml encrypt -o block -f <fichier>

Pour chiffrer une chaîne (restera dans l’historique des commandes) :


/opt/puppetlabs/puppet/bin/eyaml encrypt -o string -s “<texte>”

Pour déchiffrer (temporairement) un fichier .eyaml :


/opt/puppetlabs/puppet/bin/eyaml decrypt \
-e /etc/puppetlabs/code/environments/production/data/fichier.eyaml
Puppet
Par l’exemple
Ajouter une clé SSH sur les machines
# Dans le fichier : modules/profiles/manifests/debian.pp

# Ajouter ce morceau
ssh_authorized_key { 'Prénom Nom' :
user => 'root',
key => 'CLÉ SSH' ,
type => 'TYPE CLÉ' ,
}

# Exemple :
# ssh-ed25519 AAAA[...]00 david.cachau@capsi-informatique.fr
# ^- TYPE CLÉ ^- CLÉ SSH

ssh_authorized_key { 'David Cachau' :


user => 'root',
key => 'AAAA[...]00' ,
type => 'ssh-ed25519' ,
}
Ajouter un utilisateur et une base de donnée MySQL
# Dans data/groups/mysql-ENV/nodes/NOEUD.yaml, créer la base et l’utilisateur
profiles::mysql::databases :
ma_bdd:
charset: utf8mb4
collate: utf8mb4_unicode_ci

profiles::mysql::users :
"mon_user@%" :
grants:
"ma_bdd.*":
privileges :
- ALL

# Dans data/groups/mysql-ENV/nodes/NOEUD.eyaml, assigné le mot de passe chiffré via eyaml à


# l’utilisateur
profiles::mysql::users :
"mon_user@%" :
password : ENC[PKCS7,MIIB[...]yw==]
Ajouter un site Apache
# Dans data/groups/rproxy-ENV/group/MON_PROJET.yaml, créer le vhost :
# Les templates utilisés par le module se trouve dans : modules/apache_config/templates/vhosts
# Example : parts/ssl/redir -> modules/apache_config/templates/vhosts/parts/ssl/redir.conf.epp
# Les arguments sont décrits dans chaque templates
apache_config :
vhosts :
"mon-projet.farmeo.fr" :
priority : 20
enable : true
parts:
- template : parts/ssl/redir
- virtualhost : start
port: 443
- template : parts/ssl/proxy
args:
certname : farmeo.fr
headers : true
- template : parts/proxy/config
- template : parts/proxy/pass
args:
uri: http://10.220.92:222:8080/
- template : parts/authorize-cas
args:
path: "/"
- virtualhost : end
Ajouter/Supprimer un compte FTP
# Dans data/nodes/NOEUD.yaml, créer l’utilisateur en lui assignant un uid et gid inutilisé
# Pour plus de lisibilité, assigner le même uid et gid autant que possible
profiles::ftp::users :
mon_user :
uid: 4008
gid: 4008

# Dans data/nodes/NOEUD.eyaml, assigné le mot de passe chiffré via eyaml à l’utilisateur


profiles::ftp::users :
mon_user :
password : ENC[PKCS7,MIIB[...]YLsn]

# Dans data/nodes/NOEUD.yaml, supprimer l’utilisateur via ensure: absent


profiles::ftp::users :
mon_user :
ensure: absent
# Dans data/nodes/NOEUD.eyaml, vous pouvez supprimer le mot de passe assigné à l’utilisateur
Installer un paquet via APT
# Dans un .yaml (en fonction des machines à impacter), ajouter la classe package et indiquer
# la liste des paquets à installer
classes:
- packages

packages :
- name: ca-certificates
- name: ca-certificates-java
- name: openjdk-11-jdk-headless

# Dans cet exemple, nous installons 3 paquets via le gestionnaire de dépôt du système
# (APT sur Debian)
Je ne comprends pas ?
david.cachau@capsi-informatique.fr
06.45.97.91.31
Je répondrais à vos questions et vous aiderais à faire vos modifications.

Vous aimerez peut-être aussi