Aller au contenu principal

Erreurs et Handlers

Gestion des erreurs et des handlers dans Ansible

Notions théoriques

Dans le monde de l'automatisation avec Ansible, comme dans tout développement de script ou de logiciel, les erreurs sont inévitables. Mais ne vous inquiétez pas, Ansible offre des outils pour gérer ces erreurs et déboguer vos Playbooks.

Gérer les erreurs

Lorsqu'une tâche échoue dans Ansible, par défaut, elle arrête l'exécution du Playbook sur cet hôte et passe au suivant.

Arrêter l'exécution d'un Playbook en cas d'erreur, peut être bien dans certains cas, mais parfois vous voudrez que votre Playbook continue à s'exécuter malgré les erreurs.

Pour gérer les erreurs dans Ansible, vous pouvez utiliser:

  • ignore_errors: pour ignorer les erreurs sur une tâche donnée.
  • failed_when: pour définir des conditions personnalisées pour échouer une tâche.
  • rescue dans un bloc block/rescue/always: pour exécuter des tâches de secours en cas d'échec.

Utiliser un handler

Dans Ansible, un "handler" est une tâche spéciale qui s'exécute lorsque qu'elle est notifiée par une autre tâche.

Exemple

Quand vous avez une tâche qui installe un paquet logiciel, vous pouvez avoir un handler qui redémarre le service concerné.

Le handler ne sera exécuté que si la tâche qui installe ou met à jour le paquet indique qu'un changement a été effectué.

Les handlers sont définis dans une section handlers à la fin du playbook et sont appelés à l'aide de la directive notify dans une tâche. Voici un exemple de base :

---
- name: Exemple de playbook avec handler
hosts: serveurs
become: yes
tasks:
- name: Installation de nginx
apt:
name: nginx
state: latest
notify:
- redémarrer nginx

handlers:
- name: redémarrer nginx
service:
name: nginx
state: restarted

Dans cet exemple :

  • Le handler "redémarrer nginx" est défini dans la section handlers.
  • Quand la tâche "Installation de nginx" est terminée, elle va notifier le handler "redémarrer nginx", qui exécutera alors la tâche de redémarrage du service nginx.

Exemple pratique

Créons un Playbook qui tente d'installer un paquet qui n'existe pas, et voyons comment gérer l'erreur:

---
- name: Exemple de gestion des erreurs
hosts: conteneurs
become: yes
tasks:
- name: Tentative d'installation d'un paquet inexistant
apt:
name: paquet-inexistant
state: present
ignore_errors: yes

Dans cet exemple, même si l'installation du paquet échoue, Ansible ne marquera pas la tâche comme échouée grâce à ignore_errors: yes.

Test de mémorisation/compréhension


Que fait `ignore_errors` dans une tâche Ansible ?


Quel mécanisme Ansible permet d'exécuter des tâches de secours en cas d'échec d'une tâche ?


Comment Ansible réagit-il par défaut lorsqu'une tâche échoue ?


Que spécifie `failed_when` dans une tâche Ansible ?


Test de mémorisation/compréhension


À quoi servent les handlers dans Ansible ?


Quand un handler est-il généralement déclenché dans Ansible ?


Que fait le handler `redémarrer apache` dans l'exemple ci-dessus ?


TP - Gérer les erreurs et utiliser un handler

Votre mission consiste à modifier la configuration d'Apache et à gérer correctement les erreurs potentielles lors de cette modification.

Si la modification est effectuée avec succès, Apache doit être redémarré.

astuce

N'oubliez pas, la pratique est la clé pour maîtriser une nouvelle compétence.

  1. Créez un Playbook nommé gestion_erreurs_handlers.yml dans le répertoire /root/ansible.

  2. Écrivez un Playbook qui copie un fichier de configuration Apache qui n'existe pas (pour générer une erreur) /path/to/new/apache.conf :

---
- name: Gestion des erreurs et utilisation d'un handler pour redemarrer Apache
hosts: conteneurs
become: yes
tasks:
- name: Copie de la nouvelle configuration Apache
copy:
src: /path/to/new/apache.conf
dest: /etc/apache2/apache2.conf
  1. Ajoutez une gestion d'erreurs pour ignorer les erreurs sur la tâche de copie :
---
- name: Gestion des erreurs et utilisation d'un handler pour redemarrer Apache
hosts: conteneurs
become: yes
tasks:
- name: Copie de la nouvelle configuration Apache
copy:
src: /path/to/new/apache.conf
dest: /etc/apache2/apache2.conf
ignore_errors: yes
  1. Ajoutez un handler pour redémarrer Apache si la configuration est changée :
---
- name: Gestion des erreurs et utilisation d'un handler pour redemarrer Apache
hosts: conteneurs
become: yes
tasks:
- name: Copie de la nouvelle configuration Apache
copy:
src: /path/to/new/apache.conf
dest: /etc/apache2/apache2.conf
ignore_errors: yes
notify:
- redemarrer apache
handlers:
- name: redemarrer apache
service:
name: apache2
state: restarted
  1. Exécutez le Playbook et vérifiez que le handler fonctionne correctement.

  2. Exécutez le Playbook avec la commande suivante :

ansible-Playbook -i /root/ansible/mon_inventaire.ini /root/ansible/gestion_erreurs_handlers.yml
  1. Vérifiez que le Playbook affiche bien les erreurs et ne s'arrête pas en cas d'erreur lors de la copie.
Une solution