Lidar com Falhas com Block e Rescue

AnsibleBeginner
Pratique Agora

Introdução

Os blocos (blocks) do Ansible agrupam tarefas relacionadas. Uma seção de resgate (rescue) é executada quando uma tarefa dentro do bloco falha, e uma seção sempre (always) é executada em qualquer um dos casos.

Neste laboratório, você criará uma falha controlada, recuperará dela e, em seguida, executará novamente o mesmo playbook com a falha desativada para observar o caminho de sucesso.

Criar um Projeto de Tratamento de Falhas

Nesta etapa, você criará um pequeno projeto com um host gerenciado local e um diretório de relatórios para os marcadores de block, rescue e 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

O diretório reports é onde o playbook grava marcadores para cada caminho. Isso torna o comportamento do bloco visível sem depender apenas da saída do terminal.

Escrever um Bloco com Rescue e Always

Nesta etapa, você escreverá um playbook com uma falha controlada. O bloco falha quando simulate_failure é verdadeiro, a seção de resgate grava um marcador de recuperação e a seção sempre grava um marcador de auditoria. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo que o LabEx execute cada etapa separadamente.

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

O comando arriscado é /usr/bin/false, que sempre termina com falha. Quando simulate_failure é verdadeiro, o bloco para nessa tarefa com falha, a seção rescue grava rescued.txt e a seção always grava always.txt de qualquer maneira.

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

As palavras-chave block, rescue e always devem estar alinhadas no mesmo nível de indentação. Uma verificação de sintaxe é uma maneira rápida de detectar uma seção mal posicionada antes de executar a falha controlada.

Executar o Caminho de Falha Controlada

Nesta etapa, você executará o playbook com sua falha padrão ativada. O resumo da execução (play recap) deve mostrar uma tarefa resgatada em vez de um play com falha. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible.

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

Espera-se que esta execução mostre rescued=1 e failed=0 no resumo. Isso significa que o Ansible detectou uma falha de tarefa dentro do bloco, executou as tarefas de resgate e não tratou o play geral como falho.

cat reports/rescued.txt reports/always.txt

Os dois arquivos de marcador devem conter rescued controlled failure e always ran. Você não deve ver block-success.txt neste caminho, pois o bloco não alcançou a tarefa de marcador de sucesso.

Executar o Caminho de Sucesso com uma Variável Extra

Nesta etapa, você substituirá simulate_failure na linha de comando. O bloco deve ser concluído normalmente, o resgate não deve ser executado e a seção sempre deve ser executada. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible.

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

A opção -e simulate_failure=false substitui a variável do playbook apenas para esta execução. Agora, o comando falso é ignorado, o bloco normal alcança block-success.txt e a seção de resgate não deve ser executada.

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

O caminho de sucesso deve mostrar block completed e always ran. O playbook remove marcadores antigos no início, portanto, rescued.txt não deve mais existir após esta execução.

Comparar Evidências de Falha e Sucesso

Nesta etapa, você comparará as duas execuções salvas do playbook. Manter as evidências curtas ajuda a solucionar qual caminho foi executado sem precisar ler toda a saída. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible.

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

O relatório do caminho de falha deve conter rescued=1, enquanto o relatório do caminho de sucesso deve conter rescued=0. Ambos devem ter failed=0, mas por motivos diferentes.

ls -1 reports

A lista de relatórios deve incluir ambas as saídas salvas do playbook, além dos marcadores do caminho mais recente. Manter ambas as saídas facilita a comparação de como o resgate altera o resumo.

Resumo

Você usou as seções block, rescue e always para lidar com uma falha controlada, executou o mesmo playbook através de um caminho de sucesso normal e comparou as evidências salvas.