jak uzyskać dostęp do zmiennej hosta innego hosta za pomocą Ansible?

45

Załóżmy, że masz hosta, który zbiera niektóre dane i jest w grupie [collectors]. Mam również gospodarzy w grupie [reporters]. Chcę więc ustawić zmienną dla reporterów z groups['collectors'][0]adresu IP. Ale podręcznik konfigurowania reporterów nie działa w [collectors]grupie, więc fakty dotyczące tego hosta nie są gromadzone. Czy istnieje sposób, aby nie kodować adresu IP na stałe?

hryamzik
źródło

Odpowiedzi:

87

Możesz uzyskać dostęp do prawie wszystkich faktów / zmiennych dotyczących zapasów, wykonując coś takiego:

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}

lub, jeśli chcesz to zrobić poprzez indeks do grupy:

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}

Wielka sztuczka polega na tym, że musisz zebrać fakty dotyczące wszystkich hostów / grup, którymi jesteś zainteresowany. Dlatego chciałbyś zmodyfikować swój podręcznik, który działa przeciwko grupie reporterów, tak aby zawierał zastosowane zadanie braku działania do grupy kolekcjonerów. Spowoduje to, że Ansible zbierze fakty na temat hostów kolekcjonerów, aby uzyskać do nich dostęp z grupy reporterów. Możesz więc dodać coś takiego na początku poradnika dla reporterów:

- hosts: collectors
  name: Gather facts from collectors
  tasks: [ ]

Puste nawiasy oznaczają, że żadne zadania nie zostaną wykonane, ale to zmusi Ansible do zbierania faktów o kolekcjonerach, abyś mógł odwoływać się do nich w zadaniach, które wykonujesz przeciwko swoim reporterom.

Edytuj nr 1

Przyszło mi do głowy, że powinienem również wspomnieć, że od wersji 1.8 Ansible dostępna jest funkcja buforowania faktów . Buforowanie faktów polega na serwerze redis do przechowywania faktów między uruchomieniami playbooka. Po włączeniu jeden podręcznik może odnosić się do faktów uzyskanych przez inny wcześniej uruchomiony podręcznik. Przykład podany w dokumentacji Ansible:

Wyobraź sobie na przykład bardzo dużą infrastrukturę z tysiącami hostów. Faktyczne buforowanie można skonfigurować tak, aby działało w nocy, ale konfiguracja niewielkiego zestawu serwerów może działać ad-hoc lub okresowo przez cały dzień. Po włączeniu buforowania faktów nie byłoby konieczne „trafianie” wszystkich serwerów w celu odniesienia do zmiennych i informacji o nich.

Bruce P.
źródło
2
Czy istnieje sposób ustawienia indeksu asocjacyjnego jako zmiennej? w przykładzie ansible localhost --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}} '
skoryguj
Aby dodać do powyższej odpowiedzi, upewnij się, że odwołujesz się do Ansible FAQ tutaj: docs.ansible.com/ansible/faq.html, który szczegółowo wyjaśnia rzeczy, takie jak zapętlanie grupy hostów lub ustawianie zmiennej w celu uzyskania określonego hosta w grupie.
einarc
Dziękujemy za pomysł pobrania faktów z węzła z pustą listą zadań.
pedz