Odpowiedź: host pojawia się w więcej niż jednej grupie i obie grupy mają w nich te same zadania; jakikolwiek sposób, aby uruchomić zadania raz?

9

Mam podręcznik, który wygląda mniej więcej tak:

---
- hosts: group1
  roles:
    - role1
    - role2

- hosts: group2
  roles:
    - role2
    - role3

Powiedzmy teraz, że mam plik hosts, który ma taki wpis:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible uruchomi zadania w rola 2 TWICE dla host1.przyklad.com, ponieważ pojawia się w 2 grupach i do każdej z nich przypisana jest rola 2.

Jak sprawić, by Ansible zdał sobie sprawę, że pełni tę samą rolę dwukrotnie, a zatem powinien uruchomić go tylko raz?

Asfand Qazi
źródło
Lepiej byłoby podać nam prawdziwe przykłady zamiast „rola 1”, „rola2” itd., Ponieważ być może powinieneś robić to inaczej. Ale zależy to od tego, co tak naprawdę próbujesz osiągnąć.
Antonis Christofides,

Odpowiedzi:

10

Jak wspomniano, jest to zgodne z projektem. Ansible wykonuje tylko jedną grę na raz. Twój podręcznik składa się z dwóch odtworzeń (dwa elementy na liście YAML na poziomie głównym zdefiniowane przez plik podręcznika). Pierwsza gra dotyczy roli 1 i roli 2 w grupie 1. Ta gra jest wykonywana jako pierwsza i dopiero po jej zakończeniu rozpoczyna się druga gra. Ale Ansible nie próbuje logicznie łączyć sztuk. W końcu możesz chcieć, aby zadania w roli 2 były uruchamiane dwukrotnie.

Jeśli chodzi o rozwiązanie problemu, istnieje kilka sposobów obejścia tego problemu, a wybór zależy od szczegółów grup i ról.

Jeśli wszystkie zadania w roli 2 są idempotentne, tzn. Jeśli można je uruchamiać wiele razy i za każdym razem kończą się tym samym rezultatem, to tak naprawdę tracisz tylko czas i dobrze jest pozwolić, aby role się powtarzały. Jeśli zastosowanie ról zajmuje naprawdę dużo czasu lub jeśli nie możesz uczynić go idempotentnym, rozważ następujące pomysły:


Możesz podzielić podręcznik na trzy sztuki i zastosować role indywidualnie:

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

Lub jeśli twoje role muszą być zgrupowane razem, możesz utworzyć trzecią grupę dla serwerów, które potrzebują wszystkich trzech ról. Nie musisz ich usuwać z pozostałych dwóch grup. Możesz utworzyć grupę w pliku ekwipunku w następujący sposób:

[group1and2:children]
group1
group2

Następnie w swoim poradniku możesz ponownie podzielić się na trzy sztuki, ale użyj trzeciej grupy, aby uniknąć ponownego uruchamiania ról:

---
- hosts: group1:!group1and2
  roles:
    - role1
    - role2

 - hosts: group1and2
   roles:
     - role1
     - role2
     - role3

 - hosts: group2:!group1and2
   roles:
     - role2
     - role3

To dość brzydkie, ale w niektórych przypadkach może być przydatne.

daveadams
źródło
Dzięki, myślę, że pójdę z wariantem opcji (2) - sprawię, że moje grupy i role będą bardziej szczegółowe, aby pogrupować moje serwery razem.
Asfand Qazi
Jeśli dzwonię do hostów za pomocą zmiennej jako {{host1}} i {{host2}}, jak mogę je połączyć?
BMW,
Jeśli szukasz sekcji dokumentacji: Typowe wzorce
Sahap Asci
3

To jest z założenia. Jedynym sposobem jest zastosowanie roli 2 tylko w jednym podręczniku do jednej konkretnej grupy i nie używanie roli 2 w żadnym innym podręczniku w grupie, która może mieć wspólnych członków, tak jak tutaj.

Serge van Ginderachter
źródło