Dynamiczne inventory w Ansible – automatyczne zarządzanie hostami
W tradycyjnych środowiskach infrastruktura była statyczna – liczba serwerów i ich adresy IP rzadko się zmieniały, a pliki inventory zawierały ręcznie wpisane hosty. W erze chmury, konteneryzacji i automatycznego skalowania taka metoda przestaje być wystarczająca. Aby zachować elastyczność, Ansible oferuje dynamiczne inventory, które automatycznie pobiera informacje o hostach z zewnętrznych źródeł, takich jak AWS, Docker, Kubernetes czy GCP.
1. Czym jest dynamiczne inventory
Dynamiczne inventory to mechanizm, który pozwala Ansible na automatyczne generowanie listy hostów w oparciu o dane z API, usług chmurowych lub innych źródeł. Zamiast statycznego pliku inventory.ini, używany jest skrypt, plugin lub plik YAML, który zwraca aktualną listę maszyn wraz z ich atrybutami.
Dzięki temu playbooki mogą być uruchamiane na rzeczywistej infrastrukturze, niezależnie od jej zmian – np. w środowiskach z auto-skalowaniem.
2. Format dynamicznego inventory
Ansible obsługuje różne formaty inventory: pliki YAML, skrypty JSON, a także wtyczki (plugins). Najczęściej stosowanym rozwiązaniem są pluginy dynamiczne, które łączą się z API chmurowym i generują dane w czasie rzeczywistym.
Przykładowa struktura inventory dynamicznego:
plugin: aws_ec2
regions:
– eu-central-1
filters:
tag:Environment: production
keyed_groups:
– key: tags.Role
prefix: role
compose:
ansible_host: public_ip_address
Powyższy przykład pobiera wszystkie instancje EC2 z regionu eu-central-1 oznaczone tagiem Environment=production.
3. Konfiguracja dynamicznego inventory AWS
Ansible oferuje wtyczkę aws_ec2 dostępną w kolekcji amazon.aws. Pozwala ona dynamicznie wykrywać instancje w chmurze AWS i automatycznie przypisywać je do grup.
Przykład konfiguracji:
# inventory/aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
– eu-west-1
filters:
tag:Project: devops
hostnames:
– tag:Name
keyed_groups:
– key: tags.Role
prefix: role
Uruchomienie playbooka z tym inventory:
ansible-playbook -i inventory/aws_ec2.yml playbooks/deploy.yml
Plugin automatycznie połączy się z AWS i utworzy grupy hostów na podstawie tagów EC2.
4. Dynamiczne inventory Docker
Dla środowisk kontenerowych dostępny jest plugin community.docker.docker_containers, który generuje inventory z aktywnych kontenerów Docker.
Przykład:
# inventory/docker.yml
plugin: community.docker.docker_containers
filters:
running: true
keyed_groups:
– key: Image
prefix: image
Uruchomienie:
ansible-inventory -i inventory/docker.yml –list
Wynikiem będzie lista aktywnych kontenerów z przypisanymi grupami w zależności od obrazu.
5. Dynamiczne inventory Kubernetes
W przypadku klastrów Kubernetes można użyć kolekcji community.kubernetes i pluginu k8s, który pobiera informacje o podach i węzłach bezpośrednio z API klastra.
Przykład konfiguracji:
# inventory/k8s.yml
plugin: community.kubernetes.k8s
connections:
– kubeconfig: ~/.kube/config
namespaces:
– default
– production
Playbook uruchomiony z takim inventory może automatycznie wykrywać pody w zadanych przestrzeniach nazw.
6. Dynamiczne inventory Google Cloud Platform (GCP)
Dla środowisk opartych o GCP można użyć pluginu gcp_compute z kolekcji google.cloud. Pozwala on wykrywać instancje wirtualne w projekcie Google Cloud i przypisywać je do grup.
Przykład konfiguracji:
# inventory/gcp.yml
plugin: google.cloud.gcp_compute
projects:
– my-gcp-project
zones:
– europe-west1-b
filters:
status: RUNNING
auth_kind: serviceaccount
service_account_file: ~/.gcp/ansible.json
Dzięki temu możliwe jest zautomatyzowanie operacji na instancjach GCP bez konieczności ręcznego utrzymywania plików inventory.
7. Weryfikacja i testowanie dynamicznego inventory
Aby sprawdzić poprawność działania dynamicznego inventory, można użyć polecenia:
ansible-inventory -i inventory/aws_ec2.yml –graph
Wyświetla ono grupy i hosty w formie drzewa. Dodatkowo opcja –list zwraca pełne dane JSON o wszystkich hostach, w tym zmienne i atrybuty pobrane z API.
8. Łączenie dynamicznego i statycznego inventory
W wielu projektach stosuje się podejście hybrydowe, gdzie część hostów jest zdefiniowana statycznie, a część pobierana dynamicznie. Można to osiągnąć, wskazując katalog inventory zawierający kilka plików:
inventory/
static.ini
aws_ec2.yml
docker.yml
Ansible automatycznie połączy dane z obu źródeł, tworząc pełny obraz środowiska.
9. Dobre praktyki przy pracy z dynamicznym inventory
- utrzymywanie konfiguracji pluginów w repozytorium (wersjonowanie inventory),
- stosowanie tagów w chmurach (AWS, GCP) do logicznego grupowania hostów,
- unikanie zbyt ogólnych filtrów – ograniczanie zapytań tylko do potrzebnych zasobów,
- łączenie dynamicznego inventory z group_vars dla nadania kontekstu środowiska,
- testowanie inventory za pomocą –graph i –list przed uruchomieniem playbooka,
- ochrona danych uwierzytelniających (np. kluczy API, tokenów) w Ansible Vault.
Podsumowanie
Dynamiczne inventory to kluczowy element nowoczesnej automatyzacji w Ansible. Pozwala na pełną integrację z chmurą, kontenerami i klastrami Kubernetes, zapewniając zawsze aktualną listę hostów. Dzięki niemu playbooki stają się bardziej elastyczne, a zarządzanie infrastrukturą — prostsze, skalowalne i zgodne z ideą Infrastructure as Code.