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
.
Test de mémorisation/compréhension
Test de mémorisation/compréhension
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é.
N'oubliez pas, la pratique est la clé pour maîtriser une nouvelle compétence.
-
Créez un Playbook nommé
gestion_erreurs_handlers.yml
dans le répertoire/root/ansible
. -
É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
- 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
- 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
-
Exécutez le Playbook et vérifiez que le handler fonctionne correctement.
-
Exécutez le Playbook avec la commande suivante :
ansible-Playbook -i /root/ansible/mon_inventaire.ini /root/ansible/gestion_erreurs_handlers.yml
- 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
Vous devez être connecté pour voir le contenu.