Handlery i notify – automatyczne akcje po zmianach
W Ansible nie wszystkie zadania powinny być wykonywane za każdym razem. Często wymagane jest uruchomienie określonej akcji tylko wtedy, gdy zaszła zmiana — np. restart usługi po modyfikacji konfiguracji. Do tego służą mechanizmy notify i handlers, które zapewniają automatyczne reakcje na zmiany w systemie.
1. Czym są handlery
Handler to specjalny typ zadania, który uruchamia się tylko wtedy, gdy zostanie powiadomiony przez inne zadanie (za pomocą notify). Najczęściej stosowany jest do restartowania, przeładowywania lub zatrzymywania usług po zmianie plików konfiguracyjnych.
2. Struktura handlera
Handlery definiowane są w sekcji handlers w playbooku lub roli. Każdy handler ma nazwę, do której można się odwołać z poziomu innych zadań.
Przykład:
handlers:
– name: Restart nginx
ansible.builtin.service:
name: nginx
state: restarted
3. Powiadamianie handlera – notify
Każde zadanie, które może wywołać zmianę w systemie, może powiadomić handler za pomocą dyrektywy notify. Jeśli zadanie nie wprowadzi żadnych zmian (jest idempotentne), handler nie zostanie uruchomiony.
Przykład: restart po wdrożeniu nowego pliku konfiguracyjnego
– name: Deploy nginx config
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify:
– Restart nginx
Jeśli plik konfiguracyjny różni się od istniejącego, Ansible zaktualizuje go, a następnie wywoła handler Restart nginx.
4. Kolejność wykonywania handlerów
Wszystkie handlery uruchamiane są dopiero po zakończeniu wszystkich zadań w playbooku lub roli. Dzięki temu unikane jest wielokrotne restartowanie tej samej usługi, jeśli kilka zadań ją modyfikuje. Jeśli w trakcie działania wystąpi błąd, handlery nie zostaną uruchomione.
5. Wymuszanie natychmiastowego uruchomienia handlera
Standardowo handler wykonuje się po zakończeniu wszystkich zadań. Jeśli jednak zachodzi potrzeba natychmiastowej reakcji, można użyć opcji meta: flush_handlers, aby wykonać wszystkie oczekujące handlery w danym momencie.
Przykład:
– name: Apply configuration change
ansible.builtin.template:
src: new.conf.j2
dest: /etc/service.conf
notify:
– Restart service
– meta: flush_handlers
6. Przykład praktyczny – automatyczny restart usługi
– name: Configure nginx service
hosts: webservers
become: yes
tasks:
– name: Deploy nginx config
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify:
– Restart nginx
handlers:
– name: Restart nginx
ansible.builtin.service:
name: nginx
state: restarted
Mechanizm notify i handlerów zapewnia pełną idempotentność oraz minimalizuje niepotrzebne przestoje usług.
Podsumowanie
Handlery i notify to podstawowy sposób reagowania Ansible na zmiany w systemie. Pozwalają wykonywać akcje tylko wtedy, gdy rzeczywiście zaszła zmiana, co zwiększa wydajność i stabilność automatyzacji. Ich umiejętne wykorzystanie jest niezbędne w profesjonalnych projektach, w których automatyzacja obejmuje zarządzanie konfiguracją i restart usług.