Dynamiczne inventory w Ansible – automatyczne zarządzanie hostami

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.

Przewijanie do góry