Jak oszukuję inventory w Ansible

Inventory, czyli zbiór urządzeń, na których ma zostać wykonany playbook Ansible, co do zasady definiujemy jako statyczny plik, lub w sposób dynamiczny korzystając z wtyczek z grupy Inventory Plugins. Ja czasami jednak uciekam się do drobnej sztuczki, która jest dla mnie niezwykle wygodna, gdy uruchamiam proste playbooki, w których wykorzystuję moduły do Dockera. Jaka to sztuczka?

Moduły Ansible Docker

Zacznijmy od tego po co mi ta sztuczka jest potrzebna. Gdy korzystam z modułów Ansible do Docker i Docker Swarm połączenie z Docker Engine nawiązuję na dwa sposoby. Pierwszy z nich jest „tradycyjny” – w trakcie wykonywania playbooka następuje połączenie SSH ze wskazanym w inventory urządzeniem, na którym uruchomiony jest Docker. Następnie następuje lokalne wykonanie modułu (zatem muszą na tamtym urządzeniu być zainstalowane wszystkie niezbędne biblioteki Pythona) a wynik zwracany jest do urządzenia, na którym uruchomiono playbook.

Osobiście preferuję drugi sposób. Playbook wykonywany jest lokalnie na komputerze, na którym zainstalowany jest Ansible i niezbędne biblioteki. Skrypt łączy się ze zdalnym hostem, na którym uruchomiony jest Docker Engine za pomocą sieci IP. Najlepiej w sposób szyfrowany zabezpieczony protokołem TLS. Taki tryb wymaga oczywiście odpowiedniej konfiguracji Docker Engine na zdalnym systemie by nasłuchiwał nie tylko na lokalnym gnieździe (ang. socket), ale też wskazanym porcie i adresie IP.

Jak przekazać nazwę hosta?

W obu tych przypadkach inventory zawiera listę urządzeń, na których ma zostać wykonany playbook. Informacja o nazwie hosta zapisanego w inventory, na którym w danym momencie wykonywany jest playbook zapisana jest w zmiennej ansible_host. 

W przypadku gdy chcemy korzystać z połączenia z API, nie z lokalnego gniazda, zmienna ansible_host musi zostać przekazana do parametru host wywołania zadania w playbooku. Domyślna wartość tego parametru to ścieżka do lokalnego gniazda, na którym nasłuchuje Docker Engine. Podając adres IP lub nazwę FQDN wymuszamy połączenie po IP.

Jak wygląda mój przykładowy playbook?

---
- name: docker_swarm_facts example
  hosts: localhost
  connection: local
  gather_facts: no

  tasks:
    - name: Get swarm facts
      community.docker.docker_swarm_info:
        docker_host: '{{ ansible_host }}'
        tls: true

Jeżeli w wywołaniu ansible-playbook podam jako parametr plik z inventory, to zadanie zostanie wykonane w odniesieniu do każdego z zapisanych w nim hostów. 

Zamiast bawić się w modyfikowanie pliku z inventory lub wywoływanie jego podzbiorów, gdy potrzebuję wykonać zadanie tylko w odniesieniu do jednego wskazanego urządzenia, stosują małą sztuczkę. Polega ona na podaniu wprost wartości zmiennej ansible_host z linii poleceń

ansible-playbook -e ansible_host=moj_host.lan:2376 playbook.yaml

Proste i efektywne. Tą samą sztuczkę możesz oczywiście zastosować też w innych playbookach!


Subscribe
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

0 komentarzy
Inline Feedbacks
View all comments

ZdradziĆ Ci sekretY udanego projektu automatyzacji?

(link otwiera się w nowym oknie)