Pratique 2 - Questions de développement - Correction
Table des matières
- L'Inventaire Ansible
- Les Playbooks
- Les Variables dans Ansible
- Les Conditions when
- Les Modules Ansible
- Les Roles Ansible
- Les Handlers Ansible
- Les Tags Ansible
- Les Fichiers de Configuration Ansible
- Les Fichiers de Variables Ansible
- Les Fichiers de Roles Ansible
- Ansible Vault
- Sécurisation des Secrets avec Ansible Vault
- Utilisation de Jinja2 dans les Templates Ansible
- Jinja2 et le Chiffrement des Variables
Question 1 - L'Inventaire Ansible
✅ Réponse :
Un inventaire Ansible est un fichier qui liste et organise les hôtes que vous souhaitez gérer avec Ansible. Il permet de :
- Regrouper les hôtes par fonction ou environnement
- Définir des variables spécifiques pour chaque hôte ou groupe
- Spécifier les paramètres de connexion
Exemple d'inventaire :
[node_containers]
node1 ansible_host=172.20.0.2 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node2 ansible_host=172.20.0.3 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node3 ansible_host=172.20.0.4 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node4 ansible_host=172.20.0.5 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node5 ansible_host=172.20.0.6 ansible_user=root ansible_python_interpreter=/usr/bin/python3
node6 ansible_host=172.20.0.7 ansible_user=root ansible_python_interpreter=/usr/bin/python3
[web]
node1
node5
[database]
node2
node3
[mail]
node4
node6
✅ Explication :
[webservers]
,[databases]
sont des groupes d'hôtes.- Chaque machine a des paramètres spécifiques (utilisateur, interpréteur Python).
🔙 Retour à la Table des Matières
Question 2 - Les Playbooks
✅ Réponse :
Un playbook Ansible est un fichier YAML qui définit une série de tâches à exécuter sur des hôtes spécifiques. C'est l'outil principal pour l'automatisation des déploiements et configurations.
Voici un exemple de playbook pour installer et configurer Apache :
---
- name: Installer et configurer Apache
hosts: webservers
become: yes
tasks:
- name: Installer Apache
yum:
name: httpd
state: present
✅ Explication :
hosts: webservers
→ Appliquer le playbook aux serveurs web.become: yes
→ Exécuter les tâches avec les droits root.tasks:
→ Liste des tâches exécutées.apt:
→ Module permettant d'installer Apache.
🔙 Retour à la Table des Matières
Question 3 - Les Variables dans Ansible
✅ Réponse :
Les variables dans Ansible sont des valeurs qui peuvent être utilisées dans les playbooks pour rendre les tâches plus flexibles et réutilisables.
Exemple de variable :
---
- name: Exemple de variable
hosts: all
vars:
my_variable: "Hello, World!"
tasks:
- name: Afficher la variable
debug:
msg: "{{ my_variable }}"
✅ Explication :
vars:
→ Définit la variablemy_variable
.tasks:
→ Liste des tâches exécutées.debug:
→ Module permettant d'afficher la variable.
🔙 Retour à la Table des Matières
Question 4 - Les Conditions when
✅ Réponse :
La directive when
dans Ansible permet d'exécuter des tâches de manière conditionnelle en fonction de certains critères. Elle est particulièrement utile pour adapter l'exécution des tâches selon l'environnement ou les caractéristiques des hôtes.
Voici un exemple concret utilisant when
pour installer des paquets selon le système d'exploitation :
---
- name: Installer des paquets selon le système d'exploitation
hosts: all
tasks:
- name: Installer un paquet
yum:
name: httpd
state: present
✅ Explication :
when:
→ Condition pour installer le paquet.yum:
→ Module permettant d'installer le paquet.
🔙 Retour à la Table des Matières
Question 5 - Les Modules Ansible
✅ Réponse : Les modules Ansible sont des unités de code qui peuvent être exécutées sur les hôtes cibles pour effectuer des tâches spécifiques. Ils constituent les blocs de construction fondamentaux des playbooks Ansible.
Voici un exemple concret utilisant le module apt
pour installer un paquet sur un système Debian/Ubuntu :
---
- name: Installer un paquet
hosts: all
tasks:
- name: Installer un paquet
apt:
name: httpd
state: present
✅ Explication :
apt:
→ Module permettant d'installer le paquet.
🔙 Retour à la Table des Matières
Question 6 - Les Roles Ansible
✅ Réponse : Un rôle Ansible est une façon d'organiser les playbooks et tous les fichiers nécessaires (variables, handlers, etc.) dans une structure standardisée. Les rôles permettent de rendre le code réutilisable et modulaire.
Voici un exemple de structure de rôle pour configurer nginx :
roles/
├── main.yml
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
✅ Explication :
main.yml
→ Fichier principal du rôle.tasks/main.yml
→ Contient les tâches du rôle.handlers/main.yml
→ Contient les gestionnaires du rôle.
🔙 Retour à la Table des Matières
Question 7 - Les Handlers Ansible
✅ Réponse : Les handlers sont des tâches spéciales dans Ansible qui ne s'exécutent que lorsqu'elles sont notifiées par d'autres tâches. Ils sont généralement utilisés pour redémarrer des services après des modifications de configuration.
Voici un exemple de playbook utilisant un handler pour redémarrer nginx après une modification de configuration :
---
- name: Redémarrer nginx après une modification de configuration
hosts: all
tasks:
- name: Modifier la configuration de nginx
file:
path: /etc/nginx/nginx.conf
content: "..."
notify: restart nginx
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
✅ Explication :
notify:
→ Notifie le handlerrestart nginx
.handlers:
→ Définit le handlerrestart nginx
.service:
→ Module permettant de redémarrer le servicenginx
.
🔙 Retour à la Table des Matières
Question 8 - Les Tags Ansible
✅ Réponse : Les tags dans Ansible permettent d'exécuter ou d'ignorer sélectivement certaines tâches d'un playbook. Ils sont particulièrement utiles pour :
- Exécuter uniquement certaines parties d'un playbook
- Ignorer certaines tâches lors de l'exécution
- Organiser et catégoriser les tâches
Voici un exemple de playbook utilisant des tags :
---
- name: Exemple de tag
hosts: all
tasks:
- name: Tâche 1
debug:
msg: "Tâche 1"
tags:
- debug
- test
- name: Tâche 2
debug:
msg: "Tâche 2"
tags:
- debug
- prod
- name: Tâche 3
debug:
msg: "Tâche 3"
tags:
- test
✅ Explication :
tags:
→ Définit les tags pour les tâches.
🔙 Retour à la Table des Matières
Question 9 - Les Fichiers de Configuration Ansible
✅ Réponse :
Les fichiers de configuration Ansible permettent de personnaliser le comportement d'Ansible. Le fichier principal est ansible.cfg
, qui peut être placé dans différents emplacements avec un ordre de priorité.
Voici un exemple de fichier ansible.cfg
:
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = False
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
[inventory]
enable_plugins = host_list, script
[paramiko_connection]
pipelining = True
✅ Explication :
[defaults]
→ Section pour les paramètres par défaut.inventory = /etc/ansible/hosts
→ Chemin de l'inventaire.host_key_checking = False
→ Désactiver la vérification des clés hôtes.[ssh_connection]
→ Section pour les paramètres de connexion SSH.pipelining = True
→ Activer le pipelining.
🔙 Retour à la Table des Matières
Question 10 - Les Fichiers de Variables Ansible
✅ Réponse :
Les fichiers de variables Ansible permettent de centraliser et réutiliser des valeurs dans les playbooks. Ils peuvent être définis à différents niveaux (groupe, hôte, playbook).
Exemple de fichier de variables group_vars/webservers.yml
:
---
- name: Exemple de fichier de variables
hosts: webservers
vars:
my_variable: "Hello, World!"
tasks:
- name: Afficher la variable
debug:
msg: "{{ my_variable }}"
✅ Explication :
vars:
→ Définit la variablemy_variable
.tasks:
→ Liste des tâches exécutées.debug:
→ Module permettant d'afficher la variable.
🔙 Retour à la Table des Matières
Question 11 - Les Fichiers de Roles Ansible
✅ Réponse :
Les fichiers de rôles Ansible permettent d'organiser les playbooks de manière modulaire et réutilisable. Un rôle est une unité complète qui encapsule toutes les ressources nécessaires pour déployer une fonctionnalité spécifique. Voici les principaux éléments d'un rôle :
tasks/
: Contient les tâches principales du rôle dans main.yml et d'autres fichiers de tâcheshandlers/
: Définit les gestionnaires (handlers) qui peuvent être notifiés par les tâchesdefaults/
: Stocke les variables par défaut du rôle qui peuvent être surchargéesvars/
: Contient les variables spécifiques au rôlefiles/
: Fichiers statiques qui seront copiés sur les hôtes ciblestemplates/
: Templates Jinja2 qui seront rendus avant d'être copiésmeta/
: Métadonnées du rôle comme les dépendances et informationstests/
: Tests pour valider le bon fonctionnement du rôle
Cette organisation permet de :
- Réutiliser facilement des configurations entre projets
- Maintenir le code de manière plus efficace
- Partager les rôles via Ansible Galaxy
- Avoir une structure standardisée et compréhensible
Voici un exemple de structure de rôle :
roles/
├── main.yml
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
✅ Explication :
main.yml
→ Fichier principal du rôle.tasks/main.yml
→ Contient les tâches du rôle.handlers/main.yml
→ Contient les gestionnaires du rôle.
🔙 Retour à la Table des Matières
Question 12 - Ansible Vault
✅ Réponse :
Ansible Vault est un outil intégré à Ansible qui permet de chiffrer et protéger des données sensibles comme :
- Les mots de passe
- Les clés API
- Les certificats
- Les informations d'identification
Il permet de :
- Chiffrer des fichiers entiers
- Chiffrer des variables individuelles
- Gérer les secrets de manière sécurisée
- Intégrer les données chiffrées dans les playbooks
Exemple d'utilisation :
ansible-vault create secret.yml
Pour éditer un fichier chiffré :
ansible-vault edit secret.yml
Pour afficher un fichier chiffré :
ansible-vault view secret.yml
Pour déchiffrer un fichier :
ansible-vault decrypt secret.yml
- Exemple de fichier de variables chiffrées :
---
ansible_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
3434343434343434343434343434343434343434343434343434343434343434
3434343434343434343434343434343434343434343434343434343434343434
🔙 Retour à la Table des Matières
Question 13 - Sécurisation des Secrets avec Ansible Vault
✅ Réponse :
Pourquoi est-il essentiel de sécuriser les secrets dans Ansible ?
Dans Ansible, il est crucial de protéger les informations sensibles comme :
- Les mots de passe des bases de données
- Les clés API pour les services cloud
- Les certificats SSL/TLS
- Les identifiants d’accès aux serveurs
Si ces informations ne sont pas protégées, elles peuvent être :
- Exposées dans les fichiers de configuration
- Lues dans les logs d’exécution
- Compromises en cas de fuite du dépôt Git
Ansible Vault offre une solution de chiffrement permettant de stocker ces secrets de manière sécurisée.
Exemple : Stocker un mot de passe de base de données avec Ansible Vault
Créons un fichier chiffré avec Ansible Vault :
ansible-vault create secrets.yml
Dans ce fichier, nous pouvons stocker des informations sensibles sous forme de variables :
db_password: "SuperSecretPassword123!"
api_key: "ABC123XYZ789!"
Pour utiliser ces variables dans un playbook, nous faisons appel au fichier chiffré :
---
- name: Déployer une application sécurisée
hosts: app_servers
vars_files:
- secrets.yml
tasks:
- name: Configurer la base de données
mysql_user:
name: "admin"
password: "{{ db_password }}"
host: "%"
priv: "*.*:ALL"
Intégration avec un gestionnaire de secrets externe
Bien qu'Ansible Vault soit une solution pratique, il peut être combiné avec un gestionnaire de secrets externe comme :
- HashiCorp Vault : permet de stocker et récupérer les secrets à la volée.
- AWS Secrets Manager : idéal pour stocker des mots de passe et des clés API dans AWS.
- CyberArk ou Azure Key Vault pour des besoins d’entreprise.
Voici un exemple d’utilisation d’Ansible avec HashiCorp Vault :
---
- name: Récupérer un secret depuis HashiCorp Vault
hosts: localhost
tasks:
- name: Lire le secret
uri:
url: "https://vault.example.com/v1/secret/data/db"
method: GET
headers:
X-Vault-Token: "{{ vault_token }}"
register: vault_response
- name: Utiliser le mot de passe récupéré
debug:
msg: "Mot de passe récupéré : {{ vault_response.json.data.password }}"
🔙 Retour à la Table des Matières
Question 14 - Utilisation de Jinja2 dans les Templates Ansible
✅ Réponse :
Qu'est-ce que Jinja2 et quel est son rôle dans Ansible ?
Jinja2 est un moteur de templating utilisé dans Ansible pour générer dynamiquement des fichiers de configuration. Il permet d’intégrer :
- Des variables Ansible
- Des filtres pour modifier la sortie des variables
- Des structures conditionnelles (
if
,else
,for
) - Des boucles pour générer du contenu répété
Exemple : Génération dynamique d’un fichier de configuration Nginx
Créons un fichier template Jinja2 (nginx.conf.j2
) :
server {
listen 80;
server_name {{ domain_name }};
location / {
proxy_pass http://{{ backend_server }};
}
}
Dans notre playbook, nous utilisons ce template :
---
- name: Déployer Nginx avec un template Jinja2
hosts: web_servers
vars:
domain_name: "example.com"
backend_server: "192.168.1.10"
tasks:
- name: Générer le fichier de configuration Nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
Utilisation de filtres et conditions dans Jinja2
Jinja2 permet d’appliquer des filtres comme lower()
, upper()
, default()
, et d’utiliser des conditions :
{% if enable_https %}
server {
listen 443 ssl;
server_name {{ domain_name }};
ssl_certificate /etc/nginx/ssl/{{ domain_name }}.crt;
ssl_certificate_key /etc/nginx/ssl/{{ domain_name }}.key;
}
{% else %}
server {
listen 80;
server_name {{ domain_name }};
}
{% endif %}
🔙 Retour à la Table des Matières
Question 15 - Jinja2 et le Chiffrement des Variables
✅ Réponse :
Comment utiliser Jinja2 pour manipuler des variables chiffrées avec Ansible Vault ?
Lorsque nous avons des fichiers chiffrés avec Ansible Vault, nous pouvons utiliser Jinja2 pour insérer ces secrets dans des fichiers générés.
Exemple : Injecter une variable chiffrée dans un fichier
Si nous avons un fichier chiffré secrets.yml
:
db_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
3839396634343130656537366432346666636163313633636438
Nous pouvons l’utiliser dans un template :
[database]
user = admin
password = {{ db_password }}
host = localhost
Et l’intégrer dans un playbook :
---
- name: Configurer la base de données
hosts: db_servers
vars_files:
- secrets.yml
tasks:
- name: Générer le fichier de configuration
template:
src: templates/db_config.ini.j2
dest: /etc/app/db_config.ini
notify: restart app
Comment éviter l’affichage accidentel des secrets dans les logs
Lorsqu’Ansible exécute un playbook, il affiche souvent les variables utilisées. Pour éviter cela :
-
Utiliser
no_log: true
dans les tâches sensibles :- name: Déploiement sécurisé
debug:
msg: "Déploiement en cours..."
no_log: true -
Désactiver l'affichage des variables dans Ansible.cfg :
[defaults]
no_log = True
Ces techniques permettent d'éviter que les logs contiennent des informations sensibles.
Résumé
- Jinja2 permet de générer dynamiquement des fichiers dans Ansible.
- Il supporte les variables, conditions, boucles, et filtres.
- Il peut être utilisé avec Ansible Vault pour sécuriser les données sensibles.
- Il faut éviter d’afficher les secrets dans les logs avec
no_log: true
.
🔙 Retour à la Table des Matières
Conclusion
Cette correction couvre toutes les questions sur Ansible, en fournissant des explications détaillées et des exemples pratiques. Les points clés abordés incluent :
✅ L'automatisation avec Ansible
✅ La gestion des secrets avec Ansible Vault
✅ L’utilisation avancée de Jinja2 pour générer des fichiers
✅ Les meilleures pratiques pour sécuriser les secrets
Avec ces connaissances, vous êtes prêt à déployer et gérer des infrastructures efficacement avec Ansible ! 🚀