Ansible ist ein leistungsstarkes Automatisierungswerkzeug, das es ermöglicht, IT-Infrastrukturen effizient zu verwalten. Eine der grundlegenden Komponenten in Ansible ist das Inventory, das die Liste der Hosts enthält, auf denen Ansible Befehle ausführt. Während statische Inventories für kleinere, weniger dynamische Umgebungen ideal sind, benötigen größere und flexibelere Umgebungen dynamische Lösungen. Dynamische Inventories sind eine flexible Möglichkeit, um Hosts und Server automatisch in Ansible einzubinden, insbesondere in Cloud-Umgebungen oder dynamisch skalierenden Infrastrukturen. In diesem Blog-Beitrag erkläre ich, wie du dynamische Inventories in Ansible einrichtest und welche Vorteile sie bieten.
Was ist ein dynamisches Inventory?
Ein dynamisches Inventory in Ansible ist eine Methode, bei der die Liste der Hosts automatisch und in Echtzeit aus externen Quellen, wie Cloud-Plattformen, Datenbanken oder APIs, bezogen wird. Dies bietet den Vorteil, dass du nicht manuell die IP-Adressen oder Hostnamen verwalten musst, sondern Ansible die Hostinformationen selbst dynamisch abruft.
Typische Einsatzszenarien für dynamische Inventories sind:
- Cloud-Umgebungen wie AWS, Google Cloud, Azure
- Virtualisierungsplattformen wie VMware
- Container-Umgebungen wie Docker oder Kubernetes
Vorteile eines dynamischen Inventories
- Automatische Aktualisierung: Hosts werden dynamisch von externen Quellen abgerufen. Das bedeutet, dass du dir keine Sorgen machen musst, wenn sich die IP-Adressen oder die Anzahl der Server ändern.
- Skalierbarkeit: Dynamische Inventories eignen sich besonders gut für große Umgebungen oder Cloud-basierte Architekturen, in denen sich die Server regelmäßig ändern.
- Weniger Wartung: Im Gegensatz zu statischen Inventories entfällt die manuelle Pflege von Hostlisten. Ansible übernimmt die dynamische Abfrage der Hosts.
Einrichtung eines dynamischen Inventories
Dynamische Inventories in Ansible können über externe Skripte oder Plugins realisiert werden, die Hosts aus verschiedenen Quellen abrufen. Viele Cloud-Plattformen wie AWS, Google Cloud oder Azure stellen offizielle Ansible-Plugins bereit, die eine nahtlose Integration ermöglichen.
Im Folgenden werde ich erklären, wie man dynamische Inventories in Ansible verwendet, insbesondere am Beispiel von Amazon Web Services (AWS).
1. Installation der benötigten Abhängigkeiten
Bevor du mit einem dynamischen Inventory für AWS arbeiten kannst, müssen einige Abhängigkeiten installiert werden. Du benötigst die boto3-Bibliothek (ein AWS SDK für Python), um Ansible zu ermöglichen, mit der AWS API zu kommunizieren.
Installiere boto3 und das Ansible AWS-Plugin über pip
:
pip install boto3 botocore
ansible-galaxy collection install amazon.aws
Mit diesen Paketen ist Ansible in der Lage, dynamische Inventories von AWS abzurufen.
2. Konfiguration des AWS Dynamic Inventory Plugins
Ansible bietet für viele Cloud-Anbieter, darunter AWS, Google Cloud und Azure, spezielle Plugins für dynamische Inventories. Für AWS wird das amazon.aws.aws_ec2
-Plugin verwendet.
Erstelle eine Datei namens aws_ec2.yml
für dein dynamisches Inventory:
plugin: amazon.aws.aws_ec2
regions:
- eu-central-1
filters:
instance-state-name: running
keyed_groups:
- key: tags.Name
prefix: tag
hostnames:
- tag:Name
compose:
ansible_host: public_ip_address
Erklärung der Konfiguration:
- plugin: Hier wird das Ansible-Plugin angegeben, das verwendet wird, um mit AWS zu interagieren. In diesem Fall
amazon.aws.aws_ec2
. - regions: Hier wird die Region definiert, aus der Ansible die EC2-Instanzen abrufen soll. In diesem Beispiel ist es
eu-central-1
(Frankfurt). - filters: Dies filtert die abgerufenen Instanzen. Im obigen Beispiel werden nur Instanzen im Zustand „running“ zurückgegeben.
- keyed_groups: Diese Option gruppiert Instanzen basierend auf bestimmten Schlüsseln, z. B. den Tags, die in AWS definiert sind.
- hostnames: Hier wird definiert, welche Information als Hostname verwendet werden soll. In diesem Fall das Tag
Name
der EC2-Instanz. - compose: Hier wird die öffentliche IP-Adresse (
public_ip_address
) der Instanz alsansible_host
gesetzt.
3. AWS Zugangsdaten konfigurieren
Ansible benötigt Zugriff auf deine AWS-Instanzen, um das dynamische Inventory zu erstellen. Dazu kannst du entweder die AWS CLI konfigurieren oder Umgebungsvariablen verwenden.
Um die AWS CLI zu konfigurieren, führe den folgenden Befehl aus:
aws configure
Dabei wirst du nach deinem AWS Access Key ID, AWS Secret Access Key, der AWS Region und dem Ausgabeformat gefragt. Alternativ kannst du diese auch als Umgebungsvariablen definieren:
export AWS_ACCESS_KEY_ID="your_access_key"
export AWS_SECRET_ACCESS_KEY="your_secret_key"
export AWS_REGION="eu-central-1"
4. Verwendung des dynamischen Inventories
Nachdem du die Konfiguration abgeschlossen hast, kannst du das dynamische Inventory verwenden. Um eine Liste der Hosts aus dem dynamischen Inventory abzurufen, kannst du den folgenden Befehl ausführen:
ansible-inventory -i aws_ec2.yml --list
Dies zeigt eine JSON-Ausgabe mit allen Hosts an, die aus deiner AWS-Umgebung dynamisch abgerufen wurden. Die Hosts werden nach den zuvor definierten Kriterien gefiltert und gruppiert.
5. Beispiel für ein Playbook mit dynamischem Inventory
Jetzt kannst du ein Playbook schreiben, das auf den dynamisch abgerufenen Hosts in AWS ausgeführt wird. Hier ist ein einfaches Beispiel, das alle EC2-Instanzen in der Region eu-central-1
aktualisiert:
---
- name: Update all EC2 instances
hosts: all
become: true
tasks:
- name: Installiere Updates
ansible.builtin.yum:
name: "*"
state: latest
Um dieses Playbook mit dem dynamischen Inventory auszuführen, kannst du den folgenden Befehl verwenden:
ansible-playbook -i aws_ec2.yml update_ec2.yml
Ansible verwendet jetzt das dynamische Inventory, um die aktuelle Liste der EC2-Instanzen abzurufen, und führt das Playbook auf diesen Instanzen aus.
Weitere Cloud-Anbieter für dynamische Inventories
Neben AWS bietet Ansible Unterstützung für viele weitere Cloud-Provider und Plattformen. Hier sind einige weitere Beispiele für dynamische Inventories:
- Google Cloud: Verwende das
gcp_compute
-Plugin, um dynamische Inventories für Google Cloud zu erstellen. - Microsoft Azure: Verwende das
azure_rm
-Plugin für die Integration mit Azure. - VMware vSphere: Das
vmware_vm_inventory
-Plugin ermöglicht die Interaktion mit vSphere-Umgebungen. - Kubernetes: Das
k8s
-Plugin ermöglicht die Verwaltung von Kubernetes-Clustern.
Diese Plugins funktionieren ähnlich wie das AWS-Plugin und bieten dynamische Abfragen von Hosts basierend auf den entsprechenden Plattformen.
Fazit
Dynamische Inventories sind ein unverzichtbares Werkzeug für die Verwaltung moderner, dynamischer IT-Infrastrukturen, insbesondere in Cloud-Umgebungen. Sie ermöglichen es dir, Ansible effizient und skalierbar zu nutzen, ohne Hosts und deren IP-Adressen manuell pflegen zu müssen. Durch die Verwendung von dynamischen Inventories kannst du sicherstellen, dass deine Playbooks immer auf die aktuellen Hosts angewendet werden, was besonders in Umgebungen mit häufigen Änderungen wichtig ist.
Wenn du eine dynamische Umgebung betreibst, lohnt es sich, dynamische Inventories zu verwenden, um deine Arbeitsabläufe zu optimieren und den Verwaltungsaufwand zu reduzieren.