Ansible에서 항상 핸들러 실행 트리거


33

Ansible을 사용하여 개발 서버를 프로비저닝하고 있습니다.

나는 항상 나를 위해 몇 가지 서비스를 시작하기를 원합니다. 이 목적을위한 핸들러가 있지만 조건없이 핸들러 실행을 트리거하는 가장 좋은 방법은 무엇입니까?

이 같은:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart

6
작업을 항상 실행하려면 처리기 대신 작업을 만들어야합니다.
Jordan

@Jordan-때로는이 특정 예외를 제외한 대부분의 시나리오에서 조건부로 트리거되는 핸들러를 원할 수 있습니다.
silverdr

답변:


61

매번 핸들러를 트리거해야하는 경우 다음 두 가지 옵션이 있습니다.

1) noop shell 명령을 실행하면 항상 변경된 것으로보고됩니다.

-  name: trigger nginx-restart
   command: /bin/true
   notify: nginx-restart

2) changed_when : 과 함께 디버그를 사용 하여 핸들러를 트리거하십시오.

-  debug: msg="trigger nginx-restart"
   notify: nginx-restart
   changed_when: true

또한의 모드 옵션 1과 확인 : 당신은 사용할 수 있습니다 check_mode: noAnsible 버전 2.2 이상 또는를 사용하는 경우 always_run: yes작업이 체크 모드에서 스킵되지 않습니다 그래서보다 이전 버전을 사용하는 경우. 내 수동 테스트에서 처리기가 검사 모드로 유지되는 것처럼 보이지만 사례가 다를 수 있으므로주의하십시오.


7
요즘에는 ---- 작업이 실패하더라도 --force-handlers가 핸들러를 실행합니다.
conny

5
네, 그래도 모든 핸들러를 강제로 실행합니다
jarv

이 게시물이 변경된 상태와 관련하여 유용하다는 것을 알았습니다. serverfault.com/a/799282/173002 . 타이.
sonjz

고맙게도, 옵션 2와 그 changed_when안에 더 많은 로직을 사용하여 비등 전성 작업 (일부 경우 두 번 이상 호출 될 수 있음)을 작업이 아닌 처리기로서 구현했습니다.
Sammitch

17

Ansible은 핸들러 처리를위한 몇 가지 옵션을 제공합니다.

1) 모든 처리기를 항상 강제 실행하려면 https://github.com/ansible/ansible/issues/4777에ansible-playbook playbook.yml --force-handlers 설명 된 대로을 실행 하십시오.

2) 플레이 북 내 특정 지점에 통보 된 핸들러를 강제로 실행하려면 메타 태스크 https://docs.ansible.com/playbooks_intro.html을 사용할 수 있습니다 .

tasks: 
  - shell: some tasks go here
  - meta: flush_handlers
  - shell: some other tasks

3) 그러나 다른 작업의 결과에 관계없이 서비스가 실행 중이거나 다시 시작되도록하려는 것 같습니다. 이 경우 처리기를 사용하지 말고 Ansible의 service모듈 을 호출하는 새 작업을 사용 하십시오 . http://docs.ansible.com/service_module.html

tasks: 
  - name: ensure ntp is running
    service: name=ntp state=started enabled=yes

  - name: always reload nginx
    service: name=nginx state=reloaded

  - name: always restart MySQL
    service: name=mysql state=restarted

1
(3)의 문제는 처리기에 알리는 몇 가지 작업이있을 수 있으며 처리기가 여러 번 실행 (서비스를 다시 시작)하고 싶지 않다는 것입니다.
Jonathan Hartley

여러 작업이 동일한 처리기를 알릴 수 있으며 처리기는 한 번만 실행됩니다. 이것이 핸들러의 요점입니다.
Jeff Widman

안녕 제프 이 답변은 처리기를 사용하지 않고 작업 만 사용하여 모든 작업을 지정하는 것입니다.
Jonathan Hartley

죄송합니다. 해결하려는 유스 케이스를 여전히 이해하지 못하는 것 같습니다 ... 달성하려는 사례의 예를 들어 새로운 질문을여시겠습니까? 링크가 포함 된 댓글을 추가하면 답변을 시도합니다.
Jeff Widman

나는 새로운 질문이 필요하지 않습니다. OQ는 "처리기가 ​​항상 실행되도록하려면 어떻게해야합니까?"라고 물었고이 답변 3 부는 "대신 작업 사용"을 제안했으며 내 의견은 "일부 상황에서 작업이 여러 번 실행될 수 있습니다"라고 지적합니다.
Jonathan Hartley

6

서비스를 다시 시작하는 것이 한 가지입니다. 실행 중인지 확인하는 것도 또 다른 방법입니다. 당신이 원하는 경우 ansible확인하기 위해 nginx실행되고, 당신은이 작업을 수행 :

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.