Ansible playbook에서 block, rescue, loop, always를 사용하는 방법(ansible-playbook)
Ansible Playbook에서는 여러 작업을 하나의 논리적 그룹으로 묶고 오류 발생 시 처리하기 위해 block 기반 예외 처리 구조를 사용할 수 있다.
| 구성 요소 | 역할 |
| block | 여러 작업을 하나의 논리적 그룹으로 묶음 |
| rescue | block 내부 작업이 실패할 경우 실행 |
| always | 성공/실패 여부와 관계없이 항상 실행 |
| loop | 동일 작업을 여러 항목에 대해 반복 실행 |
1. 기본 Playbook 예제
Playbook 작성
vim example.yml
---
- name: 플레이북 예시
hosts: all
gather_facts: false
become: true
tasks:
- name: Outer Block
block:
- name: Loop Block - Task 1
debug:
msg: "Loop Item: {{ item }}"
loop:
- 1
- 2
- 3
- name: Loop Block - Task 2
debug:
msg: "Another Task inside Loop"
rescue:
- name: Rescue Block
debug:
msg: "This runs on rescue"
always:
- name: Always Block
debug:
msg: "This always runs"
2. Playbook 구성 설명
Playbook 기본 설정
- hosts : 모든 대상 서버에 적용
- gather_facts : 시스템 정보 수집 여부
- become : root 권한으로 실행
block (작업 그룹)
block:
- block은 여러 개의 작업을 하나의 그룹으로 묶는다.
- 이 블록 내부의 작업 중 하나라도 실패하면 rescue 블록이 실행된다.
블록 내부 작업
- Loop Block - Task 1
- Loop Block - Task 2
loop (반복 작업)
loop:
- 1
- 2
- 3
- 리스트의 각 값을 item 변수로 전달
- 반복 실행
실행 결과 예시
Loop Item: 1
Loop Item: 2
Loop Item: 3
rescue (예외 처리)
rescue:
- block 내부 작업 중 하나라도 실패하면 실행된다.
예시
rescue:
- name: Rescue Block
debug:
msg: "This runs on rescue"
동작 흐름
block 작업 실패
→ rescue 실행
→ always 실행
always (항상 실행)
always:
- block 작업의 성공 여부와 관계없이 항상 실행된다.
예시
always:
- name: Always Block
debug:
msg: "This always runs"
일반적으로 다음 작업에 사용된다.
- 로그 수집 정리
- 작업(cleanup)
- 상태 출력
- 서비스 재시작
3. Playbook 실행
실행 명령어
ansible-playbook -i inventory/hosts.ini ansible_learn/example.yml --limit localhost
- -i : 인벤토리 파일 지정
- --limit : 실행 대상 호스트 제한
$ ansible-playbook -i inventory/hosts.ini ansible_learn/example.yml --limit localhost
PLAY [플레이북 예시] **************************************************************************************************
TASK [Loop Block - Task 1] ********************************************************************************************
ok: [localhost] => (item=1) => {
"msg": "Loop Item: 1"
}
ok: [localhost] => (item=2) => {
"msg": "Loop Item: 2"
}
ok: [localhost] => (item=3) => {
"msg": "Loop Item: 3"
}
TASK [Loop Block - Task 2] ********************************************************************************************
ok: [localhost] => {
"msg": "Another Task inside Loop"
}
TASK [Always Block] ***************************************************************************************************
ok: [localhost] => {
"msg": "This always runs"
}
PLAY RECAP ************************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
실행 흐름 정리
모든 작업이 성공한 경우
block 실행
→ rescue 건너뜀
→ always 실행
block 내부 작업이 실패한 경우
block 실행
→ 오류 발생
→ rescue 실행
→ always 실행
실제 서버 적용 예시(Nginx 설치)
실제 서버에서 웹 서버 설치 자동화에 사용할 수 있는 Playbook이다.
Playbook 작성
vim install_nginx.yml
---
- name: Nginx 설치 및 구성
hosts: all
become: true
tasks:
- name: Nginx 설치
block:
- name: Update apt cache (Ubuntu)
apt:
update_cache: yes
when: ansible_os_family == "Debian"
- name: Install Nginx
package:
name: nginx
state: present
rescue:
- name: Nginx 설치 실패 처리
debug:
msg: "Nginx 설치 중 오류가 발생했습니다. 로그를 확인하세요."
- name: Nginx 구성 배포
block:
- name: Nginx 설정 파일 배포
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify:
- Restart Nginx
rescue:
- name: 구성 배포 실패 처리
debug:
msg: "Nginx 구성 배포에 실패했습니다."
- name: Nginx 서비스 시작
block:
- name: Start Nginx service
service:
name: nginx
state: started
enabled: true
rescue:
- name: 서비스 시작 실패 처리
debug:
msg: "Nginx 서비스를 시작하지 못했습니다. 수동 확인이 필요합니다."
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
이 예시에서 사용한 주요 구성 요소는 다음과 같습니다.
- block : 패키지 설치, 설정 파일 배포, 서비스 시작과 같이 여러 작업을 묶어주는 역할을 합니다.
- rescue : block 내에서 어떤 작업이라도 실패하면 실행되어야 하는 작업을 정의합니다. 실패 시 어떤 부분이 문제인지 확인할 수 있도록 디버깅 메시지를 출력하도록 했습니다.
- loop : 여러 서버에 동일한 작업을 반복 적용할 때 사용됩니다. 이 예시에서는 사용되지 않았지만, 여러 서버를 대상으로 하는 작업에서 유용하게 사용될 수 있습니다.
- always : block 내의 작업이 성공하든 실패하든 관계없이 항상 실행되어야 하는 작업을 정의합니다. 여기서는 Nginx 서비스를 재시작하는 핸들러를 사용했습니다.
이러한 방식으로 플레이북을 작성하면 복잡한 배포 시나리오에서도 성공과 실패에 따라 적절한 조치를 취할 수 있습니다.
참고URL
- Ansible Documentation : playbook block
'리눅스' 카테고리의 다른 글
| [draft] Docker 컨테이너 터미널 프롬프트(PS1) 색상을 변경하는 방법 (0) | 2026.03.08 |
|---|---|
| [draft] Ansible Playbook에서 register와 debug 모듈 사용하는 방법 (1) | 2026.03.08 |
| [draft] Ansible Playbook에서 loop와 when 조건문을 사용하는 방법 (0) | 2026.03.08 |
| [draft] MySQL 5.7 초기 비밀번호 변경 오류 해결 방법 (0) | 2026.03.07 |
| [draft] smem 명령어 (0) | 2026.03.07 |