Zawsze uruchamiaj wykonanie procedury obsługi w Ansible

33

Korzystam z Ansible, aby udostępnić mój serwer programistyczny.

Chcę, żeby zawsze uruchamiało dla mnie niektóre usługi. Mam w tym celu moduły obsługi, ale jaki jest najlepszy sposób na wywołanie procedury obsługi bez warunków, np. Aby zawsze działała?

Coś takiego:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart
Slava Fomin II
źródło
6
Jeśli chcesz, aby zadanie zawsze się uruchamiało, ustaw je jako zadanie, a nie moduł obsługi.
Jordania,
@Jordan - czasami możesz chcieć mieć moduł obsługi, który jest warunkowo uruchamiany w większości scenariuszy oprócz tego konkretnego.
silverdr

Odpowiedzi:

61

Jeśli musisz za każdym razem uruchamiać moduł obsługi, oto dwie opcje:

1) uruchom polecenie powłoki noop, które zawsze będzie zgłaszać zmiany

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

2) użyj debugowania wraz ze zmiennym_when: aby uruchomić moduł obsługi

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

Należy również zwrócić uwagę na opcję 1 i tryb sprawdzania: Możesz użyć tej opcji, check_mode: nojeśli używasz Ansible w wersji 2.2 lub wyższej lub always_run: yesjeśli korzystasz z wcześniejszych wersji, aby zadanie nie zostało pominięte w trybie sprawdzania. Z mojego ręcznego testowania wygląda na to, że programy obsługi pozostają w trybie sprawdzania, ale należy zachować ostrożność, ponieważ sprawa może się różnić.

jarv
źródło
7
Obecnie możesz `--force-handlers uruchamiać programy obsługi, nawet jeśli zadanie się nie powiedzie '
conny
5
Tak, ale to zmusi wszystkich
handlerów
Uważam, że ten post był użyteczny w odniesieniu do zmienionego statusu, który doprowadził mnie tutaj. serverfault.com/a/799282/173002 . ty.
sonjz
Dzięki, skorzystałem z opcji 2 i changed_whenbardziej logicznej, aby zaimplementować nie idempotentne zadanie [które w niektórych przypadkach może być wywołane więcej niż raz] jako program obsługi, a nie zadanie.
Sammitch,
17

Ansible udostępnia kilka opcji wymuszania procedur obsługi:

1) Aby zawsze wymusić wszystkie programy obsługi, uruchom ansible-playbook playbook.yml --force-handlerszgodnie z dokumentacją tutaj: https://github.com/ansible/ansible/issues/4777

2) Aby wymusić procedury obsługi, które zostały powiadomione w określonym punkcie w podręczniku, możesz użyć meta zadania https://docs.ansible.com/playbooks_intro.html :

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

3) Jednak wydaje się, że chcesz tylko upewnić się, że usługa jest uruchomiona lub uruchomiona ponownie, niezależnie od wyniku innego zadania. W takim przypadku nie używaj servicemodułu obsługi, użyj nowego zadania, które wywołuje moduł Ansible : 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
Jeff Widman
źródło
1
Problem z (3) polega na tym, że może istnieć kilka zadań, które powiadamiają moduł obsługi, a ja nie chcę, aby moduł obsługiwał kilka razy (ponownie uruchamiając usługę).
Jonathan Hartley,
Wiele zadań może powiadomić ten sam moduł obsługi, a moduł obsługi wykona się tylko raz. To jest cały punkt obsługi.
Jeff Widman,
Hej Jeff. Ta odpowiedź dotyczy nieużywania programów obsługi, określając wszystkie akcje tylko za pomocą zadań.
Jonathan Hartley,
Niestety, obawiam się, że nadal nie rozumiem przypadku użycia, dla którego próbujesz rozwiązać ... Może otwórz nowe pytanie z przykładem tego, co próbujesz osiągnąć? Jeśli dodasz komentarz z linkiem do niego, postaram się na nie odpowiedzieć.
Jeff Widman,
Nie potrzebuję nowego pytania. OQ zapytał „Jak mogę się upewnić, że moduł obsługi ZAWSZE działa”, a ta odpowiedź, część 3, zasugerowała „Zamiast tego użyj zadań”, a mój komentarz wskazuje: „W niektórych okolicznościach Twoje zadanie może zostać uruchomione kilka razy”.
Jonathan Hartley,
6

Ponowne uruchomienie usługi to jedno; upewnienie się, że działa, to kolejne. Jeśli chcesz ansiblemieć pewność, że nginxdziała, wykonaj następujące czynności:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Antonis Christofides
źródło