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.


