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


81

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

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

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

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

답변:


95

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


1
이 솔루션을 사용하면 block : 및 rescue : 명령을 실행하여 오류를 처리 할 수 ​​있습니까?
user1767316

3
여러 작업이 나열된 순서대로 실행됩니까? 하나의 작업이 다른 작업에 의존하는 경우 핸들러 내에서 알림 수신을 사용해야합니까?
user26767

링크 된 문서에서 @ user26767 :Notify handlers are always run in the same order they are defined, not in the order listed in the notify-statement. This is also the case for handlers using listen.
swenzel

55

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

- 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. 공식 문서에 기능으로 언급되지 않았기 때문에 이것이 앞으로도 계속 작동 할 것인지 확실하지 않습니다.


이 방법은 문헌이 거의없는 것처럼 보이는 사실에 도움이됩니다. 알림을 받으면 핸들러 중 하나가 실패하더라도 핸들러가 실행됩니다. notify이전 핸들러가 실패하면 실행하지 않으려는 레이블에 대해 다른 레이블을 사용하는 것은 원하지 않는 경우이를 "수정"하는 좋은 방법입니다.
fbicknel

27

편집 : 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


5
: 2.0.2과 2.1.2 사이 Ansible 버전이 작동하지 않는 버그가 있는지 그냥 참고 github.com/ansible/ansible/issues/15915
Enis 아프간 바

1
미래 독자를 위해-이것은 Ansible 2.9.2에서 작동하지 않았습니다. 수정 프로그램은 대체되었다 include함께 include_tasks.
Martin Melka

@MartinMelka 감사합니다. Ansible 버전> = 2.2를 의미하지 않는다는 경고를 내 답변 상단에 추가했습니다.
Alexander Klauer

감사합니다 :) 새로운 핸들러를 디자인 할 때 다른 답변이 더 좋습니다. 하지만 Ansible 인벤토리 코드가 오래되었고 내가 한 것처럼 약간만 변경하면되는 경우에도이 약간의 추가만으로도 여전히 유용 할 수 있습니다.
Martin Melka 20.01.24
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.