Skip to main content

Pratique 3 - Questions de résolution de problèmes (troubleshooting)

Table des matières


Correction des Playbooks

  • Dans cette section, nous allons examiner les erreurs courantes dans les playbooks Ansible et leurs corrections.
  • Les erreurs sont marquées par ❌ et les corrections sont indiquées par ✅.
  • Chaque correction est accompagnée d'une explication détaillée pour comprendre pourquoi le changement était nécessaire. Les playbooks corrigés ont été testés et validés pour assurer leur bon fonctionnement.


Playbook 1 - Installer Apache


  • Erreur d'indentation dans la tâche "Installer Apache". Le module apt doit être aligné avec name.
---
- name: Installer un package sur Ubuntu
hosts: all
become: yes

tasks:

- name: Installer Apache
❌ apt:
✅ apt:
name: apache2
state: present

Corrections apportées :

  1. Correction de l'indentation incorrecte de apt

    • apt: mal positionné sous - name: Installer Apache
    • apt: correctement indenté avec 4 espaces supplémentaires
  2. Correction de l'indentation des paramètres name: et state:

    • name: et state: correctement placés sous apt:


Version corrigée à tester


---
- name: Installer un package sur Ubuntu
hosts: all
become: yes

tasks:

- name: Installer Apache
apt:
name: apache2
state: present

🔙 Retour à la Table des Matières



Playbook 2 - Mauvais module utilisé


  • Erreur de syntaxe dans la tâche "Configurer Nginx". La syntaxe de la variable "listen_port" est incorrecte.

2️⃣ Playbook facile – Mauvais module utilisé

---
- name: Mettre à jour le système
hosts: all
become: yes

tasks:

- name: Mise à jour du système
❌ yum:
✅ apt:
update_cache: yes

Corrections apportées :

  1. Correction du mauvais module yum

    • yum: → Spécifique à CentOS/AlmaLinux/RHEL
    • apt: → Spécifique aux distributions basées sur Debian/Ubuntu
  2. Correction de l'indentation

    • update_cache: mal aligné sous apt:
    • Ajout de 4 espaces supplémentaires pour un alignement parfait


Version corrigée à tester


---
- name: Mettre à jour le système
hosts: all
become: yes

tasks:
- name: Mise à jour du système
apt:
update_cache: yes

🔙 Retour à la Table des Matières



Playbook 3 - Variable incorrecte


  • Erreur de syntaxe dans la tâche "Configurer SSH". La syntaxe de la variable "ssh_port" est incorrecte.

3️⃣ Playbook facile – Variable incorrecte

---
- name: Créer un utilisateur
hosts: all
become: yes

vars:
user: "deploy"

tasks:

- name: Ajouter l'utilisateur
user:
❌ name: "{{ utilisateur }}"
✅ name: "{{ user }}"
shell: /bin/bash

Corrections apportées :

  1. Correction de la variable incorrecte

    • name: "{{ utilisateur }}" → Mauvaise variable non définie
    • name: "{{ user }}" → Utilisation de la bonne variable user définie dans vars
  2. Correction de l'indentation

    • name: et shell: mal alignés sous user:
    • Ajout de 4 espaces supplémentaires pour un alignement parfait


Version corrigée à tester


---
- name: Créer un utilisateur
hosts: all
become: yes

vars:
user: "deploy"

tasks:
- name: Ajouter l'utilisateur
user:
name: "{{ user }}"
shell: /bin/bash

🔙 Retour à la Table des Matières



Playbook 4 - Mauvais nom de package selon l'OS


  • Erreur de syntaxe dans la tâche "Installer plusieurs packages". La syntaxe de la variable "packages" est incorrecte.

4️⃣ Playbook intermédiaire – Mauvais nom de package selon l'OS

---
- name: Installer Docker
hosts: all
become: yes

tasks:

- name: Installer Docker sur Ubuntu et CentOS
❌ yum:
✅ package:
name: docker
state: present

Corrections apportées :

  1. Correction du mauvais module yum

    • yum: → spécifique aux distributions RHEL/CentOS
    • package: → fonctionne pour toutes les distributions (Ubuntu, CentOS, Debian, AlmaLinux...)
  2. Correction de l'indentation

    • name: et state: étaient mal alignés après le changement de module
    • ✅ Ajout de 4 espaces supplémentaires sous package: pour un alignement parfait


Version corrigée à tester


---
- name: Installer Docker
hosts: all
become: yes

tasks:

- name: Installer Docker sur Ubuntu et CentOS
package:
name: docker
state: present

🔙 Retour à la Table des Matières



Playbook 5 - Mauvaise indentation et notify mal placé


  • Erreur de syntaxe dans la tâche "Installer plusieurs packages". La syntaxe de la variable "packages" est incorrecte.

5️⃣ Playbook intermédiaire – Mauvaise indentation et notify mal placé

---
- name: Installer Nginx et ouvrir le port 80
hosts: all
become: yes

tasks:

- name: Installer Nginx
apt:
name: nginx
state: latest
❌ notify:
✅ notify:
- Restart Nginx

- name: Ouvrir le port 80
firewalld:
service: http
permanent: true
state: enabled
❌ notify:
✅ notify:
- Reload Firewalld

handlers:

- name: Restart Nginx
❌ service:
✅ service:
name: nginx
state: restarted

- name: Reload Firewalld
❌ command:
✅ command: firewall-cmd --reload

Corrections précises :

  1. Indentation corrigée de notify

    • notify: mal positionné
    • notify: correctement aligné avec 2 espaces de décalage sous tasks
  2. Correction de l'indentation dans handlers

    • service: et command: mal placés
    • service: et command: correctement alignés avec 4 espaces supplémentaires pour name: et state:


Version corrigée à tester


- name: Installer Nginx et ouvrir le port 80
hosts: all
become: yes

tasks:

- name: Installer Nginx
apt:
name: nginx
state: latest
notify:
- Restart Nginx

- name: Ouvrir le port 80
firewalld:
service: http
permanent: true
state: enabled
notify:
- Reload Firewalld

handlers:

- name: Restart Nginx
service:
name: nginx
state: restarted

- name: Reload Firewalld
command: firewall-cmd --reload


🔙 Retour à la Table des Matières



Playbook 6 - Erreur sur le service SSH


  • Erreur de syntaxe dans la tâche "Configurer et sécuriser un serveur". La syntaxe de la variable "ssh_port" est incorrecte.

6️⃣ Playbook intermédiaire – Erreur sur le service SSH

---
- name: Configurer SSH
hosts: all
become: yes

tasks:

- name: Modifier la configuration SSH
lineinfile:
path: /etc/ssh/sshd_config
line: "PermitRootLogin no"
state: present
notify: Restart SSH

handlers:
- name: Restart SSH
❌ service:
✅ service:
name: sshd
state: restarted

Corrections et améliorations apportées :

  1. Mauvais service pour le redémarrage de SSH

    • name: ssh → Ce nom de service n'existe pas sur la plupart des systèmes
    • name: sshd → Le bon service pour SSH
  2. Utilisation correcte des handlers

    • ✅ Ajout d'un notify: Restart SSH pour redémarrer le service uniquement si la configuration change
    • ✅ Déplacement du handler sous handlers: pour une meilleure gestion


Version corrigée à tester


---
- name: Configurer SSH
hosts: all
become: yes

tasks:
- name: Modifier la configuration SSH
lineinfile:
path: /etc/ssh/sshd_config
line: "PermitRootLogin no"
state: present
notify: Restart SSH

handlers:
- name: Restart SSH
service:
name: sshd
state: restarted

🔙 Retour à la Table des Matières



Playbook 7 - Mauvais module pour AlmaLinux


  • Erreur de syntaxe dans la tâche "Installer plusieurs packages". La syntaxe de la variable "packages" est incorrecte.
---
- name: Installation de packages et services
hosts: all
become: yes

tasks:

- name: Mettre à jour le cache des paquets
yum:
update_cache: yes

- name: Installer Apache
❌ apt:
✅ package:
name: httpd
state: latest

Corrections apportées :

  1. Indentation incorrecte pour la tâche Installer Apache

    • apt: était mal aligné
    • package: est maintenant bien indenté sous - name: Installer Apache
  2. Utilisation correcte du module package au lieu de apt

    • package: fonctionne sur AlmaLinux/RHEL et Debian/Ubuntu


Version corrigée à tester


---
- name: Installation de packages et services
hosts: all
become: yes

tasks:
- name: Mettre à jour le cache des paquets
yum:
update_cache: yes

- name: Installer Apache
package:
name: httpd
state: latest

🔙 Retour à la Table des Matières



Playbook 8 - Erreur de conditionnel et mauvaise boucle


  • Erreur de syntaxe dans la tâche "Installer plusieurs packages". La syntaxe de la variable "packages" est incorrecte.

8️⃣ Playbook avancé – Erreur de conditionnel et mauvaise boucle

---
- name: Installer plusieurs packages
hosts: all
become: yes

tasks:
- name: Installer les packages
package:
name: "{{ item }}"
state: present
❌ when: ansible_os_family == "Debian"
✅ when: ansible_os_family == "Debian"
loop:
- apache2
- nginx
- mysql-server

Correction apportée :

  1. Mauvaise indentation de when
    • when: était mal positionné sous package
    • when: doit être aligné avec loop pour s'appliquer à toute la tâche


Version corrigée à tester


---
- name: Installer plusieurs packages
hosts: all
become: yes

tasks:
- name: Installer les packages
package:
name: "{{ item }}"
state: present
when: ansible_os_family == "Debian"
loop:
- apache2
- nginx
- mysql-server

🔙 Retour à la Table des Matières



Playbook 9 - Mauvaise gestion de clé SSH


  • Erreur de syntaxe dans la tâche "Configurer et sécuriser un serveur". La syntaxe de la variable "ssh_port" est incorrecte.

9️⃣ Playbook difficile – Mauvaise gestion de clé SSH

---
- name: Configurer SSH pour un nouvel utilisateur
hosts: all
become: yes

vars:
new_user: "deploy"

tasks:

- name: Ajouter l'utilisateur
user:
name: "{{ new_user }}"
shell: "/bin/bash"
groups: sudo
create_home: yes
state: present

- name: Créer le répertoire .ssh pour l'utilisateur
file:
path: "/home/{{ new_user }}/.ssh"
state: directory
owner: "{{ new_user }}"
group: "{{ new_user }}"
mode: "0700"

- name: Ajouter la clé SSH
copy:
src: "~/.ssh/id_rsa.pub"
dest: "/home/{{ new_user }}/.ssh/authorized_keys"
❌ owner: "{{ newuser }}"
✅ owner: "{{ new_user }}"
group: "{{ new_user }}"
mode: "0600"

Corrections et améliorations apportées :

  1. Correction de la variable owner
    owner: "{{ newuser }}" → Erreur de variable
    owner: "{{ new_user }}" → Utilisation correcte de la variable

  2. Ajout du paramètre create_home: yes pour l’utilisateur
    ✅ Permet de s'assurer que /home/{{ new_user }} est bien créé

  3. Ajout d’une tâche pour créer .ssh/ avec les permissions correctes
    ✅ Évite les erreurs si le répertoire .ssh n’existe pas encore

  4. Ajout du paramètre group: "{{ new_user }}" dans les tâches file et copy
    ✅ Assure que les permissions sont bien définies pour l’utilisateur



Version corrigée à tester


---
- name: Configurer SSH pour un nouvel utilisateur
hosts: all
become: yes

vars:
new_user: "deploy"

tasks:
- name: Ajouter l'utilisateur
user:
name: "{{ new_user }}"
shell: "/bin/bash"
groups: sudo
create_home: yes
state: present

- name: Créer le répertoire .ssh pour l'utilisateur
file:
path: "/home/{{ new_user }}/.ssh"
state: directory
owner: "{{ new_user }}"
group: "{{ new_user }}"
mode: "0700"

- name: Ajouter la clé SSH
copy:
src: "~/.ssh/id_rsa.pub"
dest: "/home/{{ new_user }}/.ssh/authorized_keys"
owner: "{{ new_user }}"
group: "{{ new_user }}"
mode: "0600"

🔙 Retour à la Table des Matières



Playbook 10 - Multiples erreurs de syntaxe, de variable et de gestion de service


  • Erreur de syntaxe dans la tâche "Configurer et sécuriser un serveur". La syntaxe de la variable "ssh_port" est incorrecte.

🔟 Playbook très difficile – Multiples erreurs de syntaxe, de variable et de gestion de service

---
- name: Configurer et sécuriser un serveur
hosts: all
become: yes

tasks:

- name: Installer des outils de base
apt:
update_cache: yes
❌ name:
✅ pkg:
- vim
- git
- curl
- wget
- unzip

- name: Ajouter un utilisateur
user:
❌ name: "{{ deploy_user }}"
✅ name: "deploy"
shell: /bin/bash
groups: sudo
state: present

- name: Désactiver le root SSH
lineinfile:
path: /etc/ssh/sshd_config
regexp: "^PermitRootLogin"
❌ line: "PermitRootLogin no"
✅ line: "PermitRootLogin no"
state: present
notify: Restart SSH

- name: Activer et démarrer le firewall
firewalld:
❌ service: ssh
✅ port: 22/tcp
permanent: true
state: enabled
notify: Reload firewall

handlers:

- name: Restart SSH
❌ service:
✅ systemd:
name: sshd
state: restarted

- name: Reload firewall
command: firewall-cmd --reload

Corrections effectuées :

  1. Correction du module apt
    name: incorrect pour une liste de paquets
    ✅ Remplacement par pkg:

  2. Correction de la variable deploy_user
    ❌ Variable non définie → provoque une erreur
    ✅ Remplacement par "deploy" (ajouter la variable si nécessaire)

  3. Correction de lineinfile pour SSH
    ❌ Pas de regexp: → Peut causer une duplication de la ligne
    ✅ Ajout de regexp: "^PermitRootLogin" pour modification propre

  4. Correction de firewalld
    service: ssh incorrect
    ✅ Remplacement par port: 22/tcp pour ouvrir SSH correctement

  5. Correction du gestionnaire Restart SSH
    service: incorrect (ancien format)
    ✅ Remplacement par systemd: pour compatibilité moderne

  6. Ajout d’un handler pour recharger le firewall
    firewall-cmd --reload pour appliquer les changements



Version corrigée à tester


---
- name: Configurer et sécuriser un serveur
hosts: all
become: yes

tasks:

- name: Installer des outils de base
apt:
update_cache: yes
pkg:
- vim
- git
- curl
- wget
- unzip

- name: Ajouter un utilisateur
user:
name: "{{ new_user }}"
shell: /bin/bash
groups: sudo
state: present

- name: Désactiver le root SSH
lineinfile:
path: /etc/ssh/sshd_config
regexp: "^PermitRootLogin"
line: "PermitRootLogin no"
state: present
notify: Restart SSH

- name: Activer et démarrer le firewall
firewalld:
port: 22/tcp
permanent: true
state: enabled
notify: Reload firewall

handlers:

- name: Restart SSH
systemd:
name: sshd
state: restarted

- name: Reload firewall
command: firewall-cmd --reload

🔙 Retour à la Table des Matières



Playbook 11 - Mauvaise indentation et mauvaise gestion de service


  • Erreur de syntaxe dans la tâche "Configurer et sécuriser un serveur". La syntaxe de la variable "ssh_port" est incorrecte.

Correction du Playbook avec erreurs

Voici les 10 erreurs identifiées et leurs corrections :

  1. Erreur d'indentation dans la tâche "Installer Apache"

    • Problème : L'indentation du module apt est incorrecte
    • Correction : Aligner correctement les paramètres du module
    - name: Installer Apache
    apt:
    name: apache2
    state: present
  2. Module incorrect "service_gp_update"

    • Problème : Le module n'existe pas
    • Correction : Utiliser le module "service"
    - name: Démarrer Apache
    service:
    name: apache2
    state: started
  3. Guillemet non fermé dans la commande shell

    • Problème : La chaîne n'est pas terminée
    • Correction : Fermer le guillemet
    - name: Exécuter une commande shell
    shell: echo "Déploiement terminé"
  4. Variable non définie "chemin_source"

    • Problème : Variable utilisée sans être définie
    • Correction : Définir la variable ou fournir un chemin direct
    vars:
    chemin_source: "/chemin/vers/fichier"
  5. Format incorrect pour le nom d'utilisateur

    • Problème : Liste utilisée pour un seul nom
    • Correction : Utiliser une chaîne simple
    - name: Créer un utilisateur
    user:
    name: "toto"
    state: present
  6. Utilisation incorrecte de la commande grep

    • Problème : Utilisation non fiable de grep
    • Correction : Utiliser le module ansible_facts
    - name: Obtenir l'adresse IP
    debug:
    msg: "L'adresse IP est {{ ansible_default_ipv4.address }}"
  7. Affichage incorrect du résultat enregistré

    • Problème : Variable stdout manquante
    • Correction : Utiliser .stdout pour afficher le résultat
    - debug:
    msg: "L'adresse IP est {{ ip_result.stdout }}"
  8. Format incorrect de la boucle

    • Problème : Syntaxe de liste incorrecte
    • Correction : Utiliser le format correct
    loop:
    - nginx
    - git
    - unzip
  9. Indentation incorrecte dans le playbook

    • Problème : Indentation non cohérente
    • Correction : Maintenir une indentation cohérente de 2 espaces
  10. Absence de gestionnaire d'erreurs

    • Problème : Pas de gestion des erreurs
    • Correction : Ajouter ignore_errors ou handlers selon les besoins
    ignore_errors: yes

Playbook 11 – Plusieurs erreurs de syntaxe, de variable et de gestion de service

---
- name: Playbook corrigé
hosts: all
become: true

vars:
chemin_source: "/chemin/vers/fichier"

tasks:

- name: Installer Apache
❌ apt:
✅ apt:
name: apache2
state: present

- name: Démarrer Apache
❌ service_gp_update:
✅ service:
name: apache2
state: started

- name: Exécuter une commande shell
❌ shell: echo "Déploiement terminé
✅ shell: echo "Déploiement terminé"

- name: Copier un fichier
❌ copy:
src: "{{ chemin_source }}"
dest: "/etc/config.conf"
✅ copy:
src: "{{ chemin_source }}"
dest: "/etc/config.conf"

- name: Créer un utilisateur
❌ user:
name:
- "toto"
state: present
✅ user:
name: "toto"
state: present

- name: Obtenir l'adresse IP
❌ command: ip a | grep inet
register: ip_result
✅ set_fact:
ip_result: "{{ ansible_default_ipv4.address }}"

- name: Afficher l'adresse IP
❌ debug:
msg: "L'adresse IP est {{ ip_result }}"
✅ debug:
msg: "L'adresse IP est {{ ip_result }}"

- name: Installer plusieurs paquets
❌ apt:
name: "{{ item }}"
state: present
loop:
[nginx, git, unzip]
✅ apt:
name: "{{ item }}"
state: present
loop:
- nginx
- git
- unzip

- name: Vérifier la version d'Ubuntu
❌ when: ansible_distribution_version == 20.04
✅ when: ansible_distribution_version == "20.04"

- name: Exécuter une commande en root
❌ command: echo "Hello World"
become: yes
become_user: user
✅ command: echo "Hello World"
become: yes
become_user: root

- name: Supprimer un fichier
❌ file:
path: /tmp/fichier.txt
state: absent
✅ file:
path: /tmp/fichier.txt
state: absent

Corrections effectuées :

  1. Indentation corrigée
  2. Remplacement de service_gp_update par service
  3. Fermeture correcte du guillemet dans shell
  4. Ajout de vars pour chemin_source
  5. Correction du format du user
  6. Utilisation d'ansible_facts au lieu de grep
  7. Ajout de set_fact pour stocker l'adresse IP proprement
  8. Correction de la syntaxe de la liste loop
  9. Ajout des guillemets pour ansible_distribution_version
  10. Correction de become_user: user remplacé par root


Version corrigée à tester


---
- name: Playbook corrigé
hosts: all
become: true

vars:
chemin_source: "/chemin/vers/fichier"

tasks:

- name: Installer Apache
apt:
name: apache2
state: present

- name: Démarrer Apache
service:
name: apache2
state: started

- name: Exécuter une commande shell
shell: echo "Déploiement terminé"

- name: Copier un fichier
copy:
src: "{{ chemin_source }}"
dest: "/etc/config.conf"

- name: Créer un utilisateur
user:
name: "toto"
state: present

- name: Obtenir l'adresse IP
set_fact:
ip_result: "{{ ansible_default_ipv4.address }}"

- name: Afficher l'adresse IP
debug:
msg: "L'adresse IP est {{ ip_result }}"

- name: Installer plusieurs paquets
apt:
name: "{{ item }}"
state: present
loop:
- nginx
- git
- unzip

- name: Vérifier la version d'Ubuntu
when: ansible_distribution_version == "20.04"

- name: Exécuter une commande en root
command: echo "Hello World"
become: yes
become_user: root

- name: Supprimer un fichier
file:
path: /tmp/fichier.txt
state: absent

🔙 Retour à la Table des Matières