Odpowiedź: Jak uruchomić jeden Host zadań przez Host?

15

Na poziomie gry musimy serial: 1pozwolić nam na uruchomienie całej gry pojedynczo. Ale nie znalazłem prostego sposobu na zrobienie tego w jednym zadaniu. Jest to szczególnie istotne, jeśli dane zadanie nie wykonuje właściwego blokowania (z jakiegokolwiek powodu).

Oczywistą odpowiedzią jest postawienie zadania we własnej grze. Ale to nie pomaga w rolach. (Konieczność serial: 1grania przy użyciu roli nie jest tak naprawdę intuicyjna).

Elrond
źródło

Odpowiedzi:

12

Jeśli nie chcesz wykonywać paralelności podczas wykonywania kroków opisanych w podręczniku, ustaw poziom rozwidlenia na 1:

ansible-playbook --forks=1 ...

Możesz również umieścić to w pliku ansible cfg:

[defaults]
forks=1

ale jeśli chcesz to indywidualnie, użyj powyższej opcji wiersza polecenia.

EDYTOWAĆ:

serial: 1robi coś zupełnie innego: to jest jak uruchamianie podręcznika dla każdego hosta po kolei, czekanie na ukończenie pełnego podręcznika przed przejściem do następnego hosta. forks=1oznacza uruchomienie pierwszego zadania w grze na jednym hoście przed uruchomieniem tego samego zadania na następnym hoście, więc pierwsze zadanie zostanie uruchomione dla każdego hosta przed dotknięciem następnego zadania.

Więc chcesz forks=1tylko na jedną grę; niestety nie jest to obecnie możliwe.

wurtel
źródło
2
Nie chciałem tego ustawiać na całym podręczniku. To dużo w przypadku granulacji. serial: 1ustawmy to przynajmniej na grze. Ale chcę tylko ustawić go na podelement sztuki (jakkolwiek to właściwie jest. Myślałem, że to „zadanie”, ale powyższy komentarz wydaje się nie zgadzać).
Elrond
3
serial: 1robi coś zupełnie innego: to jest jak uruchamianie podręcznika dla każdego hosta po kolei, czekanie na ukończenie pełnego podręcznika przed przejściem do następnego hosta. forks=1oznacza uruchomienie pierwszego zadania w grze na jednym hoście przed uruchomieniem tego samego zadania na następnym hoście, więc pierwsze zadanie zostanie uruchomione dla każdego hosta przed dotknięciem następnego zadania. Więc chcesz forks=1tylko na jedną grę; niestety nie jest to obecnie możliwe.
wurtel
Słuszna uwaga! Czy mógłbyś dodać to do odpowiedzi?
Elrond
2

Istnieje obejście tego problemu - można przekazać listę hostów (lub grupy) do with_items, a następnie użyć delegate_toz tą listą. W ten sposób zadanie będzie wykonywane host za hostem.

Na przykład:

- name: start and enable rabbitmq (run task host by host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true
Tomasz Klosiński
źródło
Dla tych, którzy zastanawiają się, dlaczego run_once: truetam jest, spróbuj go wyjąć. Nie spodoba ci się to, co się stanie. (tyle powtórzeń aaaahhhh)
Almenon
1

Jeśli uruchamiasz go na jednym komputerze, wówczas występuje problem wyłącznych blokad dla więcej niż jednego hosta. Więc powinieneś wykonać jeden po drugim dla wszystkich hostów. W tym celu musisz --forks=1być ustawiony podczas wywoływania polecenia ansible playbook. Przykład: ansible-playbook webserver.yml --forks=1gdzie webserver.yml ma app01 i app02 w twoim[webserver]

Rohan Seth
źródło
0

Pomyśl, co chcesz

run_once: true

użytkownik19151
źródło
4
nope: „run_once: true” oznacza uruchomienie zadania dla dokładnie jednego hosta na liście hostów. Chcę uruchomić go dla każdego hosta na liście, ale jeden po drugim.
Elrond
0

W przypadku poleceń, które można uruchamiać lokalnie, użyj pętli, aby iterować wszystkie hosty w grze. Działa to TYLKO, jeśli polecenie można uruchomić lokalnie. Możesz również uruchomić polecenie z ssh w nim na zdalnych komputerach jeden po drugim w ten sposób, jeśli klucze są skonfigurowane, ale staje się to trudne, gdy mówimy o eskalacji.

NA PRZYKŁAD:

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"
Michele
źródło
1
Musisz podać listę hostów zamiast tylko na nazwie hosta inventory_hostname, w przeciwnym razie pętla nie ma sensu.
Konstantin Suworow