Gérer les échecs avec les blocs et rescue

AnsibleBeginner
Pratiquer maintenant

Introduction

Les blocs Ansible permettent de regrouper des tâches connexes. Une section rescue s'exécute lorsqu'une tâche au sein du bloc échoue, tandis qu'une section always s'exécute dans tous les cas.

Dans ce laboratoire, vous allez créer une erreur contrôlée, apprendre à la gérer, puis relancer le même playbook en désactivant l'erreur pour observer le cheminement nominal (succès).

Créer un projet de gestion des échecs

Dans cette étape, vous allez créer un petit projet avec un hôte géré localement et un répertoire de rapports pour les marqueurs des sections block, rescue et always.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF

Le répertoire reports sert à stocker les marqueurs générés par le playbook pour chaque chemin d'exécution. Cela permet de visualiser le comportement des blocs sans dépendre uniquement de la sortie du terminal.

Écrire un bloc avec rescue et always

Dans cette étape, vous allez rédiger un playbook incluant une erreur contrôlée. Le bloc échoue lorsque simulate_failure est défini sur true, la section rescue écrit un marqueur de récupération, et la section always écrit un marqueur d'audit. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible. Cela garantit la stabilité des commandes, même si LabEx exécute chaque étape séparément.

cd /home/labex/project/rhce-ansible
cat > playbooks/block-rescue.yml <<'EOF'
---
- name: Practice block rescue and always
  hosts: managed
  gather_facts: false
  vars:
    simulate_failure: true
  tasks:
    - name: Remove old markers
      ansible.builtin.file:
        path: "/home/labex/project/rhce-ansible/reports/{{ item }}.txt"
        state: absent
      loop:
        - block-success
        - rescued
        - always

    - name: Protect a risky operation with rescue
      block:
        - name: Run a command that may fail
          ansible.builtin.command: /usr/bin/false
          when: simulate_failure | bool

        - name: Mark block success
          ansible.builtin.copy:
            dest: /home/labex/project/rhce-ansible/reports/block-success.txt
            content: |
              block completed
            mode: '0644'
      rescue:
        - name: Mark rescue path
          ansible.builtin.copy:
            dest: /home/labex/project/rhce-ansible/reports/rescued.txt
            content: |
              rescued controlled failure
            mode: '0644'
      always:
        - name: Mark always path
          ansible.builtin.copy:
            dest: /home/labex/project/rhce-ansible/reports/always.txt
            content: |
              always ran
            mode: '0644'
EOF

La commande risquée est /usr/bin/false, qui renvoie systématiquement une erreur. Lorsque simulate_failure est activé, le bloc s'arrête à cette tâche, la section rescue écrit rescued.txt, et la section always écrit always.txt quoi qu'il arrive.

ansible-playbook playbooks/block-rescue.yml --syntax-check

Les mots-clés block, rescue et always doivent être alignés avec le même niveau d'indentation. Une vérification de syntaxe est un moyen rapide de détecter une section mal placée avant de déclencher l'erreur contrôlée.

Exécuter le chemin d'échec contrôlé

Dans cette étape, vous allez exécuter le playbook avec l'échec activé par défaut. Le récapitulatif du play devrait indiquer une tâche secourue (rescued) plutôt qu'un échec global. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/block-rescue.yml | tee reports/failure-path.txt

Cette exécution devrait afficher rescued=1 et failed=0 dans le récapitulatif. Cela signifie qu'Ansible a détecté l'échec d'une tâche dans le bloc, a exécuté les tâches de secours, et n'a pas considéré le play comme étant en échec.

cat reports/rescued.txt reports/always.txt

Les deux fichiers marqueurs devraient contenir rescued controlled failure et always ran. Vous ne devriez pas voir block-success.txt dans ce chemin, car le bloc n'a pas atteint la tâche de succès.

Exécuter le chemin de succès avec une variable supplémentaire

Dans cette étape, vous allez surcharger simulate_failure via la ligne de commande. Le bloc devrait se terminer normalement, la section rescue ne devrait pas s'exécuter, et la section always devrait toujours s'exécuter. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/block-rescue.yml -e simulate_failure=false | tee reports/success-path.txt

L'option -e simulate_failure=false surcharge la variable du playbook uniquement pour cette exécution. La commande false est alors ignorée, le bloc atteint normalement block-success.txt, et la section rescue n'est pas déclenchée.

cat reports/block-success.txt reports/always.txt

Le chemin de succès devrait afficher block completed et always ran. Le playbook supprime les anciens marqueurs au début, donc rescued.txt ne devrait plus exister après cette exécution.

Comparer les preuves d'échec et de succès

Dans cette étape, vous allez comparer les deux exécutions du playbook. Garder des preuves concises vous aide à identifier quel chemin a été emprunté sans avoir à lire l'intégralité de la sortie. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible
grep -E 'rescued=|failed=' reports/failure-path.txt reports/success-path.txt

Le rapport du chemin d'échec devrait contenir rescued=1, tandis que celui du chemin de succès devrait contenir rescued=0. Les deux devraient afficher failed=0, mais pour des raisons différentes.

ls -1 reports

La liste des rapports devrait inclure les deux sorties de playbook enregistrées ainsi que les marqueurs du chemin le plus récent. Conserver les deux sorties facilite la comparaison de l'impact de la section rescue sur le récapitulatif.

Résumé

Vous avez utilisé les sections block, rescue et always pour gérer une erreur contrôlée, puis vous avez exécuté le même playbook dans un scénario de succès normal et comparé les preuves enregistrées.