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!