[handler] 여러 작업이있는 Ansible 핸들러를 작성하려면 어떻게해야합니까?

변경에 대한 응답으로 실행해야하는 여러 관련 작업이 있습니다. 여러 작업이있는 Ansible 핸들러를 작성하려면 어떻게해야합니까?

예를 들어 이미 시작된 경우에만 서비스를 다시 시작하는 처리기를 원합니다.

- name: Restart conditionally
  shell: check_is_started.sh
  register: result

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result



답변

Ansible 2.2부터이 문제에 대한 적절한 해결책이 있습니다.

핸들러는 또한 일반 주제를 “수신”할 수 있으며 태스크는 다음과 같이 해당 주제를 알릴 수 있습니다.

handlers:
    - name: restart memcached
      service: name=memcached state=restarted
      listen: "restart web services"
    - name: restart apache
      service: name=apache state=restarted
      listen: "restart web services"

tasks:
    - name: restart everything
      command: echo "this task will restart the web services"
      notify: "restart web services"

이렇게 사용하면 여러 핸들러를 훨씬 쉽게 트리거 할 수 있습니다. 또한 핸들러를 이름에서 분리하여 플레이 북과 역할간에 핸들러를 더 쉽게 공유 할 수 있습니다.

특히 질문에 대해서는 다음과 같이 작동합니다.

- name: Check if restarted
  shell: check_is_started.sh
  register: result
  listen: Restart processes

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result
  listen: Restart processes

작업에서 ‘프로세스 다시 시작’을 통해 핸들러에게 알립니다.

http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change


답변

핸들러 파일에서 알림을 사용하여 여러 단계를 함께 연결합니다.

- name: Restart conditionally
  debug: msg=Step1
  changed_when: True
  notify: Restart conditionally step 2

- name: Restart conditionally step 2
  debug: msg=Step2
  changed_when: True
  notify: Restart conditionally step 3

- name: Restart conditionally step 3
  debug: msg=Step3

그런 다음을 사용하여 작업에서 참조하십시오 notify: Restart conditionally.

현재 하나 아래의 핸들러에만 알릴 수 있습니다. 예를 들어Restart conditionally step 2 통지 수 없습니다 Restart conditionally.

출처 : #ansible at irc.freenode.net. 공식 문서에 기능으로 언급되지 않았기 때문에 이것이 앞으로도 계속 작동 할 것인지 확실하지 않습니다.


답변

편집 : Ansible 2.2 이상이 있으면 mkadan의 답변을 사용하십시오. 아래 답변은 최신 버전의 Ansible에서는 작동하지 않습니다. 또한 아래 Enis Afgan의 의견에 따라 버그로 인해이 답변은 2.0.2와 2.1.2 사이의 Ansible 버전에서는 작동하지 않습니다.


Ansible 2.0부터는 핸들러에서 포함 작업을 사용하여 여러 작업을 실행할 수 있습니다.

예를 들어 작업을 별도의 파일에 넣습니다 restart_tasks.yml(역할을 사용하는 경우 해당 파일 은 handlers 하위 디렉터리가 아닌 작업 하위 디렉터리로 이동합니다 ).

- name: Restart conditionally step 1
  shell: check_is_started.sh
  register: result

- name: Restart conditionally step 2
  service: name=service state=restarted
  when: result

핸들러는 다음과 같습니다.

- name: Restart conditionally
  include: restart_tasks.yml

출처 : github의 이슈 스레드 : https://github.com/ansible/ansible/issues/14270


답변