Wie wird im Ansible Automation Controller eine neue Inventory Source hinzugefügt?
In diesem Überblick beschreibe ich am Beispiel der Proxmox inventory source, wie eine eigene Inventory Source im Ansible Automation Controller hinzugefügt werden kann.
Die folgenden Schritte wurden mit der Ansible Automation Platform 2.4 getestet. Die einzelnen Schritte sollten in gleicher Weise auch in Ansible AWX ausgeführt werden können.
Um diesem Text folgen zu können, werden Kenntnisse im Umgang mit Ansible und Git auf der Kommandozeile vorausgesetzt.
Der Text verweist, wo möglich, auf bestehende Dokumentation. Es handelt sich bei diesem Text nicht um ein klassisches Tutorial. Er dient mir als Gedächtnisstütze und mag euch eine Anregung sein, bzw. im besten Fall die Wissenslücken schließen, die sich mit der Dokumentation allein nicht schließen lassen.
Ausgangssituation
Abschnitt 18.4.5.1. Inventory sources im Automation Controller User Guide führt die in der Ansible Automation Platform (AAP) unterstützten Inventory Sources auf. Möchte man nun bspw. Proxmox Virtual Environment (PVE), Microsoft Active Directory oder Cisco DNA Center als Quelle für sein Inventar benutzen, wird man auf den ersten Blick nicht fündig.
Für das Beispiel in diesem Text werden Hosts aus der Bestandsliste eines PVE als Inventory Source hinzugefügt. Die dabei verwendete Vorgehensweise kann auch für andere Inventory Plugins verwendet werden. Die Entwicklung von Inventory Plugins ist jedoch nicht Gegenstand dieses Textes. Hierzu wird auf die Dokumentation unter „Developing dynamic inventory“ verwiesen.
Mein Kollege Steffen Scheib hat mir geholfen, das Proxmox-Plugin zu konfigurieren, wofür ich ihm an dieser Stelle nochmal ganz herzlich danke. Es liegt auf meiner Arbeitsstation als Ansible Project in folgender Verzeichnisstruktur vor:
]$ tree proxmox_inventory/
proxmox_inventory/
├── collections
│ └── requirements.yml
├── inventory
│ └── inventory.proxmox.yml
└── vault_password_file
3 directories, 3 files
Mit Ausnahme der Datei vault_password_file
wurden alle Dateien und Verzeichnisse in Git aufgenommen. Ich verwende einen einfachen Git-Server in meiner Laborumgebung, auf welchen ich meine lokalen Repositorys pushe. Der Automation Controller synchronisiert das Projekt aus dem Git-Repo, um es als Inventory Source verfügbar zu machen.
Die Vorgehensweise im Überblick
- Ansible Credential für Source Control erstellen
- Ein Ansible Projekt hinzufügen
- Einen Custom Credential Type erstellen
- Ein Ansible Inventory hinzufügen
Ansible Credential für Source Control erstellen
Das Proxmox Inventory Plugin befindet sich in einem Git-Repository, auf welches mit SSH-Key-Authentifizierung zugegriffen werden kann. Damit auch der Automation Controller auf dieses Repository zugreifen kann, wird ein Credential vom Typ Source Control erstellt.
Der SSH-Private-Key wurde von meinem Host hochgeladen und verschlüsselt im Automation Controller gespeichert. Der Key lässt sich in der GUI nicht wieder sichtbar machen, lediglich ersetzen.
Ein Ansible Projekt hinzufügen
Der Dokumentation folgend, wird ein Projekt hinzugefügt:
Wenn alles passt, wird das Projekt nach dem Speichern erfolgreich synchronisiert:
Dieses Projekt wird in einem späteren Schritt zur Erstellung des Inventory benötigt.
Einen Custom Credential Type erstellen
Bevor ich auf die Erstellung selbst eingehe, möchte ich kurz beschreiben, warum dieser Schritt notwendig ist.
Folgender Codeblock zeigt meine Datei inventory.proxmox.yml
welche einige mit Ansible Vault verschlüsselte Werte enthält:
]$ cat inventory/inventory.proxmox.yml
---
plugin: 'community.general.proxmox'
url: 'https://pve.example.com'
user: !vault |
$ANSIBLE_VAULT;1.1;AES256
30623661316338386633623162303036346562346238386162633263636164636338393532613565
3332616265353962326139363533313261623739643765640a623032613034613139653162356266
34646464323233313964663939643631313539353736313364333433643136306632633065633664
3234346635396563350a656334353632643830353534386636306365656261356436613662623163
31663535363264356537336531393731633164613733316537383433653334643433
token_id: !vault |
$ANSIBLE_VAULT;1.1;AES256
62356662336534646661353666356263363734666231643932393430336639363032303266636432
3762343235633335613663393838343532326230353130380a616161313830373265306137346562
61613662333764393565316362623838633332376366373161646237363163663039613863393439
3165616664626633390a396465343430373837343662373634653634643138613131633034306432
62623438366166353765366339323263393833396133653866343833663335663766
token_secret: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386338643463373837666164396332306261366634396630306430663937613963346164636433
3362396566343932393234353439383932316436396437380a336365393038373566383534623136
30353332383464356664393666383664636536666531663463623232353136353636363366653431
3234616531623537630a393530643437376363653438643036636436316636616265316361623661
35313832613063633662363531346164306638373538393164373663633335333863646430663232
6339343164633865636239356538326438333937366134613738
validate_certs: false
# fail if a variable is not resolvable
strict: true
# facts are required to retrieve proxmox_vmtype
want_facts: true
# only allow qemu VMs
filters:
- "proxmox_vmtype == 'qemu'"
Auf der Kommandozeile meines Hosts kann ich den Inhalt des Dynamic Inventory wie folgt anzeigen lassen:
ansible-inventory -i inventory/inventory.proxmox.yml --list --vault-password-file vault_password_file
Die Datei vault_password_file
befindet sich jedoch nicht im Git, da sie das Passwort im Klartext enthält. Aus diesem Grund möchte ich die Datei auch nicht auf dem Automation Controller ablegen. Irgendwie müssen auf dem Automation Controller jedoch Credentials hinterlegt werden, um die Ansible Vault encrypted_strings zu entschlüsseln. Die Lösung steckt in diesem Kommentar auf Github. Im Automation Controller User Guide gibt es dazu Chapter 11. Custom credential types.
Fertig sieht das dann so aus:
Das Schlüssel-Wert-Paar secret: true
stellt sicher, dass das Passwort verschlüsselt gespeichert wird. Es kann danach im Automation Controller nicht mehr im Klartext angezeigt werden. Nachdem der neue Credential Typ erstellt ist, kann dieser instanziiert werden:
Das Vault Passwort wird in das entsprechende Formularfeld kopiert. Es ist standardmäßig nicht sichtbar und wird wie oben bereits erwähnt, verschlüsselt gespeichert. Mit diesem Credential verfügt der Automation Controller nun über die notwendigen Informationen, um das Proxmox Inventory auszulesen.
Ein Ansible Inventory hinzufügen
Zuerst wird ein Inventory nach Dokumentation erstellt. Anschließend wird diesem eine Inventory Source hinzugefügt.
Die Formularfelder sind dabei wie folgt zu befüllen:
- Name: Kann frei vergeben werden
- Source: Sourced from a Project
- Credential: Hier wird das im vorangegangenen Schritt erstellte Credential ausgewählt
- Project: Hier wird das in obigen Abschnitt erstellte Projekt ausgewählt
- Inventory file: Kann in diesem Fall auf `/ (project root)` gesetzt werden
Nach dem Speichern wird die Inventory Source durch Klick auf ‚Sync‘ synchronisiert:
Und wir haben 17 Hosts in unserem Inventory:
Damit endet dieser kurze Überblick auch schon. Ich wünsche euch viel Freude bei der Inventarpflege.