본문 바로가기

클라우드/앤서블(Ansible)

앤서블 Ansible 작업 제어 3 / 핸들러

# 핸들러

핸들러는 (Handler)는 작업을 실행하고 시스템의 변경(changed)이 있을 때만 별도의 작업을 호출하고 실행하는 작업이다.

 

플레이북을 실행 시키면 매번 서비스가 재시작 된다( reload,restart ) restart는 멱등성을 제공하지 못하기 때문에, restart 말고 reload를 해야하는데 reload를 할 수 없는 서비스들은 어떻게 해야 할 것인가? 핸들러를 사용 해 해결한다. 핸들러는 앤서블에서 멱등성을 제공하는 핵심이다.

 

설정파일(ex. httpd.conf)이 바뀌었을때만 이 작업이 실행이 되고, 작업이 실행이 돼서 변경이 되었을때만 다른 작업(서비스를 재시작하는)을 호출한다. 작업이 changed상태가 아니면 호출하지 않고 재시작하는 작업을 실행하지 않는다. 작업의 변경사항이 있을때만 알림을 보내주고 그알림을 실행 할 작업을 핸들러라고 한다.

httpd 설치를 하는 작업(tasks)을 한다, template으로  apache 설정파일을 변경하는 작업을 한다.  작업이 실행되어 changed 되었다면 task의 keyword, notify(알림)을  Restart apache라는 핸들러task에게 보낸다. 핸들러는 실행된다. 변경사항이 없으면 핸들러에게 알림이 가지 않아 핸들러가 실행되지 않는다.

핸들러에는 이름을 선언해야한다. 작업 알림과 핸들러의 이름이 일치해야 한다.

 

# 다중알림

목록으로 여러 핸들러 작업에게 알림을 보낼 수 있다.

 

# 다중알림-(수신 listen)

알려야하는 핸들러의 작업이 많으면 공통 알림을 받을 수 있는 listen 키워드를 설정한다

 

# 작업과 핸들러의 실행 순서

작업이 실행이 되고, 변경사항이 있다고 가정할때 알림을 받은 핸들러가 실행이되고 나머지 작업이 실행되는가? 아니다  작업은 순서대로 실행이되어 tasks가 실행되고 난 후 handlers가 실행된다

- 핸들러는 플레이의 모든 작업이 완료되고 난 후 핸들러 작업을 실행한다.(알림을 받은 즉시 실행되지 않음)

- 핸들러 작업의 순서는 알림을 받은 순서가 아닌 선언된 위에서 아래로 실행된다.

- 알림을 받은 핸들러면 실행된다 (알림을 받지 않은 핸들러는 실행되지 않는다)

- 알림을 두번 이상 받더라도 한번만 실행된다.

- 둘 이상의 핸들러 작업의 이름을 동일하게 구성되면 알림은 가장 마지막 핸들러 작업에만 실행된다 (이런 경우 listen을 사용하여 해결)

- 정적 포함 내부에 정의된 핸들러에 알림을 보낼 수 있다

- 동적 포함 내부에 정의된 핸들러에 알림을 보낼 수 없다