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 blocblock/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.
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 sectionhandlers
. - 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
.