핸들러란?
필요에 따라 한 작업에서 시스템을 변경하는 경우, 추가 작업이 필요한 경우가 있다. 예를 들어, 특정 데몬 서비스의 구성파일을 변경했으면, 변경한 구성이 적용되도록 서비스 데몬을 reload 해야 한다. 핸들러는 다른 작업에서 trigger한 알림에 응답하는 작업이다.
즉 정확한 핸들러의 목적은, task가 ansible client에 변경 (changed)를 할 때 추가적인 조치를 수행하기 위한 목적을 가지고 있다. 정상적인 일반 task를 대체하기 위해 사용되어서는 안된다. 일반적인 사용 예시로서 핸들러는 호스트를 재부팅하고 서비스를 다시 시작하는데 자주 사용된다. ansible-playbook에서는 notify 라는 구문과 handlers 라는 구문을 사용해서 구현한다.
핸들러 사용 예시
* 예시1
이 구문은 ansible host에 있는 test.conf.source 파일을 ansible client인 web.example.com 의 /tmp/test.conf 로 복사하고, 복사가 잘 되어 changed가 떴다면, 그 아래 "restart httpd" 라는 핸들러를 실행시키는 구문이다.
---
- name: after cp file then trigger handler
hosts: web.example.com
tasks:
- name: copy file
template:
src: /tmp/test.conf.source
dest: /tmp/test.conf
notify:
- restart httpd
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
* 예시2
여러개의 핸들러가 있을 때 순서가 어떻게 되는지 확인할 수 있다.
---
- hosts: was.example.com
tasks:
- command: echo 'first messages'
notify:
- test handler
- new handler
- debug:
msg: second message
handlers:
- name: new handler
debug:
msg: new handler messages.
- name: test handler
debug:
msg: message in handler
handler의 속성
- 핸들러는 notify 구문을 사용해 명시적으로 호출된 경우에만 trigger되는 비활성 작업이다.
- task는 ansible client에서 작업이 changed라고 떴을 때만 핸들러에 통지를 한다. (ok, failed로 뜨면 trigger되지 않음)
- notify문을 포함한 작업이 changed 결과를 보고하지 않으면 핸들러가 trigger되지 않는다. (예를들어, 패키지가 이미 설치되어있는데 패키지 설치를 동일하게 하면 changed가 없을 것임) 즉 change가 없으면 핸들러는 skip 된다.
- 각 핸들러에는 전역적으로 고유한 이름을 가지며, 플레이북의 작업 블록 끝에서 trigger된다.
- task에서 핸들러에게 이름으로 알리지 않으면 핸들러가 실행되지 않는다.
- 하나 이상의 task를 핸들러에게 알리면 play의 다른 모든 작업이 완료된 후에 핸들러가 정확하게 한 번 실행된다.
- 핸들러는 task이므로 관리자가 다른 작업에 사용하려는 핸들러에 같은 모듈을 사용할 수 있다.
- notify 구문이 하나가 아니라 여러개라면, 핸들러는 배열로 취급해서 여러개 명시된걸 모두 다 수행한다.
- 핸들러의 작동 순서는, task의 notify 문을 나열한 순서대로 하지 않으며 handlers: 에 명시된 순서대로 실행된다.
- 핸들러는 일반적으로 play에 있는 다른 모든 작업이 완료된 후 실행한다. 즉 tasks 부분의 작업에서 호출한 핸들러는 tasks 아래에 있는 모든 작업들이 다 처리된 후에 실행을 한다. (예외는 있음)
- 둘 이상의 task에서 하나의 핸들러를 trigger하는 경우, 해당 핸들러는 한 번만 실행된다.
- task가 핸들러를 trigger하지 않는 경우, 핸들러가 실행되지 않는다.
참고 : 플레이북의 handler 설명서
https://docs.ansible.com/ansible/2.7/user_guide/playbooks_intro.html
'Ansible' 카테고리의 다른 글
14장. ansible에서 jinja2 사용하기 (0) | 2021.02.26 |
---|---|
13장. 작업 제어 구현 - 오류처리 (0) | 2021.02.25 |
11장. 작업 제어 구현 - 반복문과 조건문 (0) | 2021.02.23 |
10장. ansible vault (0) | 2021.02.23 |
9장. fact 변수 관리 (0) | 2021.02.20 |