Od Ansible 2.2 istnieje prawidłowe rozwiązanie tego problemu.
programy obsługi mogą również „słuchać” tematów ogólnych, a zadania mogą powiadamiać te tematy w następujący sposób:
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"
To użycie znacznie ułatwia wyzwalanie wielu programów obsługi. Oddziela również opiekunów od ich imion, ułatwiając dzielenie się opiekunami między scenariuszami i rolami
W szczególności w przypadku pytania powinno to działać:
- 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
aw zadaniu powiadom obsługę za pomocą opcji „Uruchom ponownie procesy”
http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change
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.
W pliku obsługi połącz ze sobą różne kroki za pomocą powiadomienia.
Następnie odwołaj się do tego zadania z
notify: Restart conditionally
.Pamiętaj, że możesz powiadomić tylko osoby obsługujące poniżej obecnego. Na przykład
Restart conditionally step 2
nie mogę powiadomićRestart conditionally
.Źródło: #ansible na irc.freenode.net. Nie jestem pewien, czy to będzie nadal działać w przyszłości, ponieważ nie jest to wymienione jako funkcja w oficjalnej dokumentacji.
źródło
notify
etykiet dla tych, których możesz nie chcieć uruchamiać, jeśli poprzedni program obsługi zawiedzie, jest dobrym sposobem na „naprawienie” tego, jeśli nie chcesz, aby tak było.Edycja: jeśli masz Ansible 2.2 lub nowszy, użyj odpowiedzi mkadana. Poniższa odpowiedź nie działa w nowszych wersjach Ansible. Zauważ również, że zgodnie z komentarzem Enisa Afgana poniżej, z powodu błędu, ta odpowiedź nie działa z wersjami Ansible między 2.0.2 a 2.1.2.
Począwszy od Ansible 2.0, możesz użyć akcji włączania w programie obsługi, aby uruchomić wiele zadań.
Na przykład umieść swoje zadania w osobnym pliku
restart_tasks.yml
(jeśli używasz ról, które trafią do podkatalogu zadań, a nie do podkatalogu obsługi):Twój przewodnik byłby wtedy po prostu:
Źródło: wątek problemowy na github: https://github.com/ansible/ansible/issues/14270
źródło
include
zinclude_tasks
.