Skip to main content

Pratique 2 - Questions de développement - Correction

Table des matières

  1. L'Inventaire Ansible
  2. Les Playbooks
  3. Les Variables dans Ansible
  4. Les Conditions when
  5. Les Modules Ansible
  6. Les Roles Ansible
  7. Les Handlers Ansible
  8. Les Tags Ansible
  9. Les Fichiers de Configuration Ansible
  10. Les Fichiers de Variables Ansible
  11. Les Fichiers de Roles Ansible
  12. Ansible Vault
  13. Sécurisation des Secrets avec Ansible Vault
  14. Utilisation de Jinja2 dans les Templates Ansible
  15. 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 variable my_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 handler restart nginx.
  • handlers: → Définit le handler restart nginx.
  • service:Module permettant de redémarrer le service nginx.

🔙 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 variable my_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âches
  • handlers/ : Définit les gestionnaires (handlers) qui peuvent être notifiés par les tâches
  • defaults/ : Stocke les variables par défaut du rôle qui peuvent être surchargées
  • vars/ : Contient les variables spécifiques au rôle
  • files/ : Fichiers statiques qui seront copiés sur les hôtes cibles
  • templates/ : Templates Jinja2 qui seront rendus avant d'être copiés
  • meta/ : Métadonnées du rôle comme les dépendances et informations
  • tests/ : 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 :

  1. Utiliser no_log: true dans les tâches sensibles :

    - name: Déploiement sécurisé
    debug:
    msg: "Déploiement en cours..."
    no_log: true
  2. 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 ! 🚀