본문 바로가기

리눅스

[draft] Ansible Playbook에서 block, rescue, loop, always를 사용하는 방법

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