소개
Ansible 의 블록 (block) 은 관련 작업들을 그룹화합니다. 블록 내의 작업이 실패하면 rescue 섹션이 실행되며, 성공 여부와 관계없이 항상 실행되어야 하는 작업은 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
reports 디렉토리는 플레이북이 각 경로에 대한 마커 (표식) 를 기록하는 곳입니다. 이를 통해 터미널 출력에만 의존하지 않고도 블록의 동작을 시각적으로 확인할 수 있습니다.
블록, 복구 및 항상 실행 섹션 작성
이 단계에서는 의도적인 오류가 포함된 플레이북을 작성합니다. simulate_failure 변수가 true 일 때 블록이 실패하고, rescue 섹션이 복구 마커를 기록하며, always 섹션이 감사 (audit) 마커를 기록하도록 구성합니다.
이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉토리로 이동하십시오. 이렇게 하면 LabEx 가 각 단계를 개별적으로 실행하더라도 명령어가 안정적으로 유지됩니다.
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
위험한 작업인 /usr/bin/false는 항상 실패 상태로 종료됩니다. simulate_failure가 true 이면 블록은 해당 실패 작업에서 멈추고, rescue 섹션이 rescued.txt를 기록하며, always 섹션은 결과와 상관없이 always.txt를 기록합니다.
ansible-playbook playbooks/block-rescue.yml --syntax-check
block, rescue, always 키워드는 동일한 들여쓰기 수준으로 정렬되어야 합니다. 구문 검사는 제어된 오류를 실행하기 전에 섹션 위치가 잘못되었는지 확인하는 빠른 방법입니다.
제어된 오류 경로 실행
이 단계에서는 기본적으로 오류가 활성화된 상태로 플레이북을 실행합니다. 플레이 요약 (recap) 에는 실패한 플레이 대신 복구된 작업이 표시되어야 합니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉토리로 이동하십시오.
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/block-rescue.yml | tee reports/failure-path.txt
이 실행 결과의 요약 부분에는 rescued=1과 failed=0이 표시되어야 합니다. 이는 Ansible 이 블록 내의 작업 실패를 감지하고 복구 작업을 수행했으며, 전체 플레이를 실패로 처리하지 않았음을 의미합니다.
cat reports/rescued.txt reports/always.txt
두 마커 파일에는 각각 rescued controlled failure와 always ran이라는 내용이 담겨 있어야 합니다. 블록이 성공 마커 작업에 도달하지 못했으므로 이 경로에서는 block-success.txt를 볼 수 없습니다.
추가 변수를 사용한 성공 경로 실행
이 단계에서는 명령줄에서 simulate_failure를 재정의합니다. 블록이 정상적으로 완료되어야 하며, 복구 섹션은 실행되지 않고 항상 실행 섹션만 동작해야 합니다.
이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉토리로 이동하십시오.
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/block-rescue.yml -e simulate_failure=false | tee reports/success-path.txt
-e simulate_failure=false 옵션은 이번 실행에 한해 플레이북 변수를 재정의합니다. 이제 false 명령은 건너뛰어지고, 정상적인 블록이 block-success.txt에 도달하며, rescue 섹션은 실행되지 않습니다.
cat reports/block-success.txt reports/always.txt
성공 경로에서는 block completed와 always ran이 표시되어야 합니다. 플레이북 시작 시 이전 마커들을 삭제하므로, 이 실행 후에는 rescued.txt가 더 이상 존재하지 않아야 합니다.
오류 및 성공 결과 비교
이 단계에서는 저장된 두 번의 플레이북 실행 결과를 비교합니다. 결과를 간소하게 유지하면 전체 출력을 읽지 않고도 어떤 경로가 실행되었는지 쉽게 파악할 수 있습니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉토리로 이동하십시오.
cd /home/labex/project/rhce-ansible
grep -E 'rescued=|failed=' reports/failure-path.txt reports/success-path.txt
실패 경로 보고서에는 rescued=1이 포함되어야 하고, 성공 경로 보고서에는 rescued=0이 포함되어야 합니다. 두 경우 모두 failed=0이어야 하지만, 그 이유는 서로 다릅니다.
ls -1 reports
보고서 목록에는 저장된 두 개의 플레이북 출력과 가장 최근 경로에서 생성된 마커들이 포함되어 있어야 합니다. 두 결과를 모두 보관하면 복구 기능이 요약 결과에 어떤 변화를 주는지 쉽게 비교할 수 있습니다.
요약
block, rescue, always 섹션을 사용하여 제어된 오류를 처리하는 방법을 배웠으며, 동일한 플레이북을 정상적인 성공 경로로 실행하여 저장된 결과를 비교해 보았습니다.


