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

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ć.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.