Ansible Collections bestehen aus einer definierten
Verzeichnisstruktur mit entpackten Python-Dateien und Metadaten. Eine
Collection wird mit ansible-galaxy collection install
heruntergeladen und lokal unter
~/.ansible/collections/ansible_collections/<namespace>/<collection>
entpackt abgelegt. Alternativ kann auch
/usr/share/ansible/collections/ansible_collections
verwendet werden.
Die Struktur folgt dabei festen Konventionen:
plugins/: Unterverzeichnisse wie modules/,
filter/, lookup/, callback/ usw.
enthalten Python-Pluginsroles/: Enthält Rollen, falls vorhandendocs/, tests/, meta/,
playbooks/: optionale Bestandteilegalaxy.yml: Beschreibt Metadaten, Abhängigkeiten, Name
und Version der CollectionDie Module und Plugins innerhalb einer Collection sind direkt lauffähige, entpackte Python-Dateien. Es handelt sich nicht um komprimierte oder byte-compilierte Artefakte. Die Struktur ist so ausgelegt, dass Module und Plugins versionierbar, testbar und unabhängig vom Ansible-Core sind.
Ansible verwendet eine dynamische Pfadauflösung zur Laufzeit. Collections werden aus Verzeichnissen geladen, die entweder den Standardpfaden entsprechen oder explizit über Konfiguration bekannt gemacht werden:
ANSIBLE_COLLECTIONS_PATHS kann
zusätzliche Pfade angeben (doppelpunktsepariert)ansible.cfg unter
[defaults] → collections_paths konfiguriert
werdenSobald eine Collection eingebunden ist, erfolgt der Zugriff auf
enthaltene Module und Plugins über die Namenskonvention
namespace.collection.modulename. Intern wird ein Importpfad
wie
ansible_collections.<namespace>.<collection>.plugins.modules.<modulename>
generiert. Die Importmechanismen basieren auf regulärem Python-Import,
ergänzt um spezielle Plugin Loader, die im Ansible-Core über
ansible.plugins.loader registriert sind.
Eigene Collections können projektlokal eingebunden werden. Dazu muss
die Collection-Hierarchie im Projekt korrekt aufgebaut sein, etwa unter
collections/ansible_collections/<namespace>/<collection>/.
Die Pfadangabe in collections_paths muss dann auf das
Verzeichnis collections zeigen. Wichtig ist die
vollständige Einhaltung des Namespace-Konzepts, da andernfalls die
Pfadauflösung fehlschlägt.
Ein eigenes Ansible-Modul ist ein ausführbares Python-Skript, das als
Subprozess von Ansible gestartet wird. Der Standardmechanismus basiert
auf der Hilfsklasse AnsibleModule, die aus
ansible.module_utils.basic importiert wird. Ein Modul
benötigt keine bestimmte Funktion oder Klassensignatur, sondern
verarbeitet über stdin übergebene JSON-Daten und gibt über
stdout ebenfalls JSON zurück.
AnsibleModuleAnsibleModulemodule.paramsmodule.exit_json() oder
module.fail_json()Plugins hingegen werden direkt importiert und müssen daher eine klare Python-API bereitstellen. Je nach Plugintyp gelten folgende Vorgaben:
LookupBase erbt, mit Methode run(...)FilterModule().filters() als Dictionary registriert
werdenCallbackBase erbt und Ereignismethoden implementiertIm Unterschied zu Modulen werden Plugins nicht als Subprozess ausgeführt, sondern innerhalb des Ansible-Prozesses geladen und verwendet. Dadurch benötigen sie saubere Klassendefinitionen, definierte Signaturen und gegebenenfalls objektorientierte Strukturen.
Ansible unterscheidet klar zwischen:
Module:
AnsibleModule-KlassePlugins:
Beide werden über Collections organisiert und zur Laufzeit über dynamische Pfadauflösung bereitgestellt.