새소식

IaC/Ansible

[A101 Study 2주차] Ansible 핸들러 및 작업 실패 처리

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 A101 Study 2주차 스터디 내용 정리

 

해당 스터디는 '앤서블로 시작하는 인프라 자동화' 책을 기반으로 진행하였습니다.
실습 환경은 저번주와 마찬가지로 'Control Node 1 대 + Target Node 3대' 로 구성하였습니다.

 

 

1. 핸들러 (Handler)

 

핸들러는 다른 작업(TASK) 에서 트리거한 알림에 대해 응답하는 작업, 해당 호스트에서 작업이 변경될 때만 핸들러 실행



1.1. 앤서블 핸들러

 

앤서블 핸들러는 'notify 문' 을 사용하여 명시적으로 호출된 경우에만 사용할 수 있습니다.

 

핸들러 예시

 

  • service 모듈을 사용하여 'rsyslog' 를 재시작하는 Task 가 존재하며, 이 작업에 변화가 있을 경우 핸들러를 호출합니다.
---
- hosts: tnode2
  tasks:
    - name: restart rsyslog
      ansible.builtin.service:
        name: "rsyslog"
        state: restarted
      notify:
        - print msg

  handlers:
    - name: print msg
      ansible.builtin.debug:
        msg: "rsyslog is restarted"

 

 

task 에 변화가 없을 경우에는 핸들러가 호출되지 않음

 



1.2. 작업 실패 무시

 

앤서블은 플레이 시 각 작업의 반환 코드를 평가하여 작업의 성공 여부를 판단합니다.
일반적으로 작업이 실패하면 이후 모든 작업을 건너뜁니다.

 

하지만, 'ignore_errors' 키워드를 통해 작업이 실패해도 플레이를 계속 실행할 수 있습니다.

 

일반적인 플레이북 실행 화면

 

---
- hosts : tnode1

  tasks:
    - name: Install apache3
      ansible.builtin.apt:
        name: apache3
        state: latest

    - name: Print msg
      ansible.builtin.debug:
        msg: "Before task is ignored"

 

 

ignore_errors 를 활용한 작업 실패 무시

 



1.3. 작업 실패 후 핸들러 실행

 

앤서블은 일반적으로 작업이 실패할 경우, 이전 작업에서 알림을 받은 핸들러는 모두 실행되지 않습니다.
하지만, 'force_handlers: yes' 키워드 설정을 통해 작업이 실패하여도 핸들러를 호출할 수 있습니다.

 

force_handler 예제

 

---
- hosts: tnode2
  force_handlers: yes

  tasks:
    - name: restart rsyslog
      ansible.builtin.service:
        name: "rsyslog"
        state: restarted
      notify:
        - print msg

    - name: install apache3
      ansible.builtin.apt:
        name: "apache3"
        state: latest

  handlers:
    - name: print msg
      ansible.builtin.debug:
        msg: "rsyslog is restarted"

 



1.4. 앤서블 블록 및 오류처리

 

앤서블은 블록 (block) 이라는 오류를 제어하는 문법을 제공합니다.
블록에는 다음과 같은 구문이 함께 사용됩니다.

 

블록 및 오류 처리 구문

 

block 실행할 기본 작업을 정의함
rescure block 절에 정의된 작업이 실패할 경우 실행할 작업을 정의함
always block 및 rescue 절에 정의된 작업의 성공 또는 실패 여부와 관계 없이 항상 실행되는 작업을 정의함

 

 

블록을 사용한 플레이북 예시

 

Block 구문이 실패할 경우, Rescue 구문을 실행합니다.
Block 구문이 실패하지 않을 경우, Rescue 구문은 실행되지 않습니다.

Always 구문은 항상 실행됩니다.

---
- hosts: tnode2
  vars:
    logdir: /var/log/daily_log
    logfile: todays.log

  tasks:
    - name: Configure Log Env
      block:
        - name: Find Directory
          ansible.builtin.find:
            paths: "{{ logdir }}"
          register: result
          failed_when: "'Not all paths' in result.msg"

      rescue:
        - name: Make Directory when Not found Directory
          ansible.builtin.file:
            path: "{{ logdir }}"
            state: directory
            mode: '0755'

      always:
        - name: Create File
          ansible.builtin.file:
            path: "{{ logdir }}/{{ logfile }}"
            state: touch
            mode: '0644'

 

 


 

참고 문서

 

 

 

Contents

포스팅 주소를 복사했습니다