핸들러란?

필요에 따라 한 작업에서 시스템을 변경하는 경우, 추가 작업이 필요한 경우가 있다. 예를 들어, 특정 데몬 서비스의 구성파일을 변경했으면, 변경한 구성이 적용되도록 서비스 데몬을 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

 

Intro to Playbooks — Ansible Documentation

Docs » User Guide » Working With Playbooks » Intro to Playbooks You are reading an unmaintained version of the Ansible documentation. Unmaintained Ansible versions can contain unfixed security vulnerabilities (CVE). Please upgrade to a maintained versio

docs.ansible.com

 

Intro to Playbooks — Ansible Documentation

Docs » User Guide » Working With Playbooks » Intro to Playbooks You are reading an unmaintained version of the Ansible documentation. Unmaintained Ansible versions can contain unfixed security vulnerabilities (CVE). Please upgrade to a maintained versio

docs.ansible.com

 

 

 

 

'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

+ Recent posts