새소식

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

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