Ansible Inventory direkt aus der Proxmox API

Wer Ansible und Proxmox nutzt, kann sich die Funktion eines dynamisch erzeugten Inventory aller Proxmox VMs zu nutze machen. Wir zeigen wie das geht.

Wenn es um die Automatisierung von VMs geht, die auf Proxmox VE Systemen laufen, kann man bei wenigen VMs natürlich das Ansible Inventory schnell manuell erstellen. Wenn es eine größere Anzahl VMs und Container eines Proxmox Clusters sind oder die VM Landschaft häufigen Änderungen unterworfen ist, lohnt es sich ein über die Proxmox API dynamisch erzeugtes Inventory in Ansible zu nutzen.

Ansible Inventory für Proxmox VE

Es existierte bereits ein Inventory Script im Ansible Repository aus 2016, das seinen Dienst bei einzelnen Proxmox Servern versah. Allerdings gab es ein paar Schwierigkeiten, wenn das Script auf einen Proxmox Cluster zugreifen sollte. Außerdem verwendete das Script zur Übergabe von API Benutzername, Passwort und URL Environment-Variablen und bestand auf der Nutzung validierter SSL Zertifikate.

Daher haben wir den Code angepasst. Die aktualisierte Version kann nun auch mit Proxmox Clustern umgehen, eine Konfigurationsdatei verwenden und wahlweise auch selbstsignierte SSL Zertifikate akzeptieren, wie sie von Proxmox bei der Installation selbst generiert werden.

Die neue Version der proxmox.py sowie der neuen proxmox.ini findet man in unserem Github Repository. Ein Upstream Pull Request für Ansible wurde ebenfalls schon eingereicht, so dass es möglicherweise in Ansible 2.10 upstream automatisch enthalten sein wird.

Download der Dateien

Die beiden Dateien können direkt in das eigene Ansible Projekt Verzeichnis heruntergeladen werden:

wget -O proxmox.ini <a href="https://raw.githubusercontent.com/inettgmbh/ansible/devel/contrib/inventory/proxmox.ini">https://raw.githubusercontent.com/inettgmbh/ansible/devel/contrib/inventory/proxmox.ini
</a>wget -O proxmox.py <a href="https://raw.githubusercontent.com/inettgmbh/ansible/devel/contrib/inventory/proxmox.py">https://raw.githubusercontent.com/inettgmbh/ansible/devel/contrib/inventory/proxmox.py</a>

Konfiguration des Ansible Dynamic Inventory Scripts

Anschließend müssen in der proxmox.ini die entsprechenden Einstellungen für die eigene Infrastruktur hinterlegt werden:

# Ansible Proxmox dynamic inventory settings
#

[proxmox]

# ip or name of a proxmox node
host = 10.1.1.1

# username for api user (or root@pam)
username = root@pam

# password for api user (or password for root@pam)
password = your_password

# validate ssl certificates or accept all (even self signed)?
validate_certs = no

Es empfiehlt sich aus Sicherheitsgründen zur Nutzung der API auf einem Proxmox Cluster einen separaten Benutzer im Proxmox VE Authentication Backend anzulegen und diesen mit einem starken Passwort zu versehen. Legt man einen Benutzer "ansible" im Proxmox VE Authentication Backend an, muss man als Benutzername in der Datei oben "ansible@pve" hinterlegen.

Betreibt man die Proxmox VE Server mit den selbstsignierten SSL Zertifikaten, lässt sich die Validierung einfach in der Konfiguration mit "validate_certs = no" abschalten.

Test des Scripts

Nach der Konfiguration lässt sich die korrekte Funktionsweise wie folgt testen:

python proxmox.py --list

erzeugt dann beispielsweise eine Ausgabe wie die folggende:

{"all": {"hosts": ["vm1", "vm20", "debian9", "nas", "debian-ab3", "ct352", "vm25", "win19", "samba4", ...

Mit Ansible selbst lässt sich das Ganze ebenfalls testen, z.B. mit einem einfachen ping command:

ansible -i proxmox.py -m ping all

Danach versucht ansible die im Inventory aufgeführten Hosts einmal zu erreichen und gibt den Erfolg aus.


Relevante Artikel in unserem Blog