Programing

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

crosscheck 2020. 11. 17. 07:49
반응형

여러 작업이있는 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


핸들러 파일에서 notify를 사용하여 여러 단계를 함께 연결하십시오.

- 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

Then refer to it from a task with notify: Restart conditionally.

Note that you can only notify to handlers below the current one. So for example, Restart conditionally step 2 can't notify Restart conditionally.

Source: #ansible at irc.freenode.net. I'm unsure whether this will continue to work in the future as it's not mentioned as a feature in the official documentation.


As of Ansible 2.0, you can use an include action in your handler to run multiple tasks.

For example, put your tasks in a separate file restart_tasks.yml (if you use roles, that would go into the tasks subdirectory, not in the handlers subdirectory):

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

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

Your handler would then simply be:

- name: Restart conditionally
  include: restart_tasks.yml

Source: issue thread on github: https://github.com/ansible/ansible/issues/14270

참고URL : https://stackoverflow.com/questions/31618967/how-do-i-write-an-ansible-handler-with-multiple-tasks

반응형