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'
참고 문서