Ein Ansible-Modul wird bei der Ausführung nicht lokal auf dem Control
Node verarbeitet, sondern auf dem Zielsystem. Dazu überträgt Ansible das
Python-Modul (also eine .py-Datei) per scp,
sftp oder über eine eingebettete
ssh-Übertragung (z.B. mit einem Here-Document) temporär auf
das Zielsystem. Zusätzlich wird ein kleines Wrapper-Skript generiert,
das den Modulaufruf samt Parameterübergabe vorbereitet.
Die Steuerung erfolgt über eine standardisierte JSON-Schnittstelle.
Das bedeutet: Die Eingabedaten (Parameter aus dem Playbook) werden im
JSON-Format über stdin an das Modul übergeben. Das Modul
verarbeitet diese Eingabe typischerweise mit Hilfe der Klasse
AnsibleModule und erzeugt am Ende ein Ergebnisobjekt, das
ebenfalls im JSON-Format an stdout ausgegeben wird. Nur
dieses finale JSON wird von Ansible als Ergebnis gewertet.
Die wichtigsten Parameter des JSON-Eingabeobjekts sind:
_ansible_module_name, _ansible_check_mode oder
_ansible_diffDas Ergebnis eines Modullaufs wird ebenfalls im JSON-Format an
stdout zurückgegeben. Ansible liest den gesamten
stdout-Stream zeilenweise ein, verwirft aber alle Zeilen
außer der letzten validen JSON-Zeile, die als
tatsächliches Rückgabeobjekt dient. Frühere Zeilen in
stdout werden gespeichert, aber nicht als Ergebnis
interpretiert. Sie erscheinen z.B. im Feld stdout_lines des
Resultats.
Zusätzlich erfasst Ansible alle Ausgaben auf stderr und
stellt sie im Feld stderr_lines als Array von Textzeilen
zur Verfügung. Diese haben keine direkte Auswirkung auf Erfolg oder
Misserfolg des Tasks, können aber bei der Fehlersuche oder
Protokollierung hilfreich sein.
Die Kommunikation erfolgt ausschließlich über Standard-Ein- und -Ausgabe:
stdinstdout, alles andere
optionalstderr wird
protokolliert, aber nicht interpretiertNach erfolgreichem Lauf entfernt Ansible die temporär kopierten Dateien wieder vom Zielsystem, es sei denn, in der Konfiguration ist ein anderes Verhalten vorgegeben.
Diese Architektur stellt sicher, dass Module auf beliebigen Systemen lauffähig sind, ohne dass dort vorab eine Ansible-Installation oder eine besondere Laufzeitumgebung erforderlich ist. Voraussetzung ist lediglich ein kompatibler Python-Interpreter und eine SSH-Verbindung.
stdin übergebenstdout zurückgegeben