21 Typen von Inventories: Statisch vs. Dynamisch

Ansible unterstützt zwei Haupttypen von Inventories: statische und dynamische. Beide haben ihre spezifischen Einsatzszenarien und Vorteile, abhängig von der Größe und Komplexität der IT-Umgebung, die verwaltet wird.

21.1 Statische Inventories

Ein statisches Inventory ist eine Datei, die die Liste der Zielknoten sowie deren Gruppierungen und Variablen enthält. Ansible unterstützt mehrere Formate für statische Inventories: INI, YAML und JSON.

21.1.1 INI-Format (Klassisch)

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
db2.example.com

21.1.2 YAML-Format (Modern)

all:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:
    dbservers:
      hosts:
        db1.example.com:
        db2.example.com:

Das YAML-Format wird in modernen Ansible-Umgebungen bevorzugt, da es besser lesbar ist und sich nahtlos in GitOps- und CI/CD-Workflows integriert.

Vorteile von statischen Inventories:

Nachteile von statischen Inventories:

21.2 Dynamische Inventories

Dynamische Inventories werden durch Inventory Plugins generiert, die in Echtzeit Informationen über die Zielknoten abrufen. Dies ist besonders nützlich in Umgebungen, in denen sich die Anzahl und der Zustand der Zielknoten häufig ändern, wie z.B. in Cloud-Umgebungen.

21.2.1 Plugin-basierte Konfiguration (Modern)

Beispiel für AWS EC2 Plugin:

# inventory_aws.yml
plugin: amazon.aws.aws_ec2
regions:
  - eu-central-1
  - us-east-1
filters:
  tag:Environment: production
  instance-state-name: running
keyed_groups:
  - prefix: tag
    key: tags.Environment
  - prefix: instance_type
    key: instance_type
compose:
  ansible_host: public_ip_address

Beispiel für Azure Plugin:

# inventory_azure.yml
plugin: azure.azcollection.azure_rm
include_vm_resource_groups:
  - production-rg
  - staging-rg
conditional_groups:
  webservers: "'web' in tags.role"
  dbservers: "'database' in tags.role"

21.2.2 Legacy: Skript-basierte Inventories

Früher wurden dynamische Inventories über eigene Skripte realisiert:

#!/bin/bash
# Nur für Verständnis - nicht mehr empfohlen
echo '{
  "webservers": {
    "hosts": ["web1.example.com", "web2.example.com"]
  },
  "dbservers": {
    "hosts": ["db1.example.com", "db2.example.com"]
  }
}'

Moderne Praxis nutzt ausschließlich Inventory Plugins, da diese robuster, wartbarer und besser integriert sind.

Vorteile von dynamischen Inventories:

Nachteile von dynamischen Inventories:

21.3 Inventory-Plugins konfigurieren

Inventory Plugins werden in der ansible.cfg aktiviert:

[defaults]
inventory = inventory/

[inventory]
enable_plugins = auto, yaml, ini, amazon.aws.aws_ec2, azure.azcollection.azure_rm

21.4 Grundlegende Struktur und Best Practices

21.4.1 Erweiterte statische Inventory-Struktur

YAML-Format mit Variablen:

all:
  vars:
    ntp_server: ntp.example.com
    dns_servers:
      - 8.8.8.8
      - 8.8.4.4
  children:
    webservers:
      vars:
        http_port: 80
        max_clients: 200
      hosts:
        web1.example.com:
          ansible_user: deploy
          ansible_port: 2222
        web2.example.com:
          ansible_host: 192.168.1.100
          ansible_user: admin
    dbservers:
      vars:
        db_port: 5432
      hosts:
        db1.example.com:
          ansible_connection: ssh
          ansible_user: dbadmin
        db2.example.com:
          ansible_connection: winrm
          ansible_user: winadmin

21.4.2 Empfohlene Verzeichnisstruktur

inventory/
├── hosts.yml                    # Hauptinventory
├── inventory_aws.yml            # Dynamisches AWS-Inventory
├── group_vars/
│   ├── all.yml                  # Globale Variablen
│   ├── webservers.yml           # Variablen für Webserver-Gruppe
│   └── dbservers.yml            # Variablen für Datenbankserver-Gruppe
├── host_vars/
│   ├── web1.example.com.yml     # Host-spezifische Variablen
│   └── db1.example.com.yml      # Host-spezifische Variablen
└── vault/
    ├── group_vars/
    │   └── all.yml              # Verschlüsselte globale Variablen
    └── host_vars/
        └── db1.example.com.yml  # Verschlüsselte Host-Variablen

21.4.3 Variablen-Hierarchie verstehen

Die Variablen-Priorität in Ansible (niedrig zu hoch):

  1. group_vars/all
  2. group_vars/gruppe_name
  3. host_vars/hostname
  4. Inventory-Variablen (in der Inventory-Datei)
  5. Play-Variablen
  6. Task-Variablen

21.5 Mehrere Inventories verwenden

Ansible kann mehrere Inventory-Quellen gleichzeitig nutzen:

# Mehrere Dateien
ansible-playbook -i inventory/hosts.yml -i inventory/aws.yml playbook.yml

# Verzeichnis (alle Dateien darin)
ansible-playbook -i inventory/ playbook.yml

# Mix aus statisch und dynamisch
ansible-playbook -i inventory/static.yml -i inventory/aws_dynamic.yml playbook.yml

21.6 Das ansible-inventory CLI-Tool

Das ansible-inventory Tool ist essentiell für das Testen und Debuggen von Inventories:

# Inventory als JSON ausgeben
ansible-inventory -i inventory.yml --list

# Inventory als Graph anzeigen
ansible-inventory -i inventory.yml --graph

# Spezifische Hosts anzeigen
ansible-inventory -i inventory.yml --host web1.example.com

# Nur bestimmte Gruppen
ansible-inventory -i inventory.yml --graph webservers

# YAML-Ausgabe (besser lesbar)
ansible-inventory -i inventory.yml --list --yaml

# Variablen für einen Host anzeigen
ansible-inventory -i inventory.yml --host db1.example.com --vars

21.7 Praktische Tipps

21.7.1 1. Inventory-Testen

# Alle Hosts anpingen
ansible all -i inventory.yml -m ping

# Connectivity für spezifische Gruppe testen
ansible webservers -i inventory.yml -m setup --limit 1

21.7.2 2. Bedingte Gruppen nutzen

# Dynamische Gruppierung basierend auf Fakten
webservers_nginx:
  children:
    webservers:
  vars:
    web_server: nginx
  
webservers_apache:
  children:
    webservers:
  vars:
    web_server: apache

21.7.3 3. Inventory-Plugins für verschiedene Umgebungen

inventories/
├── production/
│   ├── aws.yml
│   └── group_vars/
├── staging/
│   ├── azure.yml
│   └── group_vars/
└── development/
    ├── hosts.yml
    └── group_vars/