Ansible ist ein leistungsstarkes Open-Source-Tool zur Automatisierung von IT-Umgebungen. Eine der herausragenden Stärken von Ansible ist seine Flexibilität, die es ermöglicht, eigene Module zu erstellen. Diese Module erweitern die Funktionen von Ansible und helfen bei der Umsetzung spezifischer Anforderungen, die durch vorhandene Module nicht abgedeckt sind. In diesem Tutorial werden wir die Erstellung eigener Ansible-Module sowohl in Bash als auch in Python erläutern.
1. Einführung: Was sind Ansible-Module?
Ansible-Module sind in sich geschlossene Skripte, die eine bestimmte Aufgabe auf einem Zielsystem ausführen. Diese Module werden durch Ansible aufgerufen, um Aktionen wie das Kopieren von Dateien, das Starten von Diensten oder das Verwalten von Benutzern durchzuführen. Standardmäßig stellt Ansible eine Vielzahl von Modulen zur Verfügung, aber in vielen Fällen benötigen Sie maßgeschneiderte Lösungen. Hier kommen eigene Module ins Spiel.
2. Struktur eines eigenen Ansible-Moduls
Jedes Ansible-Modul, egal in welcher Sprache es geschrieben ist, sollte nach einem bestimmten Muster arbeiten:
- Input: Das Modul empfängt Eingabewerte (Parameter) als JSON.
- Output: Das Modul gibt seine Ergebnisse in einem JSON-Format zurück.
- Return-Codes: Es sollte Rückgabewerte wie Erfolg oder Misserfolg beinhalten.
Diese Module können in verschiedenen Programmiersprachen geschrieben werden, aber Python und Bash sind zwei der häufigsten Sprachen, die verwendet werden.
3. Beispiel: Ansible-Modul in Bash
Bash eignet sich gut für kleinere und einfache Aufgaben. Hier ein Beispiel für ein einfaches Ansible-Modul in Bash, das eine Datei auf einem Remote-Host erstellt.
3.1 Skript für das Bash-Modul erstellen
#!/bin/bash
# Ansible Eingabe wird als JSON gelesen
read -r INPUT_JSON
# Parameter aus dem JSON extrahieren
FILENAME=$(echo "$INPUT_JSON" | jq -r '.filename')
# Datei erstellen
if touch "$FILENAME"; then
# Erfolgreich: JSON-Antwort ausgeben
echo "{\"changed\": true, \"msg\": \"Datei wurde erstellt: $FILENAME\"}"
else
# Fehlerfall: Fehler melden
echo "{\"failed\": true, \"msg\": \"Fehler beim Erstellen der Datei: $FILENAME\"}"
fi
3.2 Wichtige Punkte des Bash-Skripts:
- Das Modul liest die Eingabewerte als JSON von Ansible ein.
- Mithilfe des Tools
jq
werden Parameter wie der Dateiname extrahiert. - Das Modul führt die Aktion (Erstellung einer Datei) aus und gibt die Ergebnisse als JSON zurück.
changed: true
bedeutet, dass das System geändert wurde,failed: true
gibt einen Fehler an.
3.3 Modul in Ansible aufrufen
Um das Modul in einem Ansible-Playbook zu verwenden, können Sie wie folgt vorgehen:
---
- hosts: localhost
tasks:
- name: Eigene Datei mit Bash-Modul erstellen
ansible.builtin.command:
cmd: ./mein_bash_modul.sh
register: result
- debug:
var: result.stdout
4. Beispiel: Ansible-Modul in Python
Python ist die bevorzugte Sprache für Ansible-Module, da es viele eingebaute Ansible-Hilfsfunktionen bietet. Hier ein einfaches Modul, das eine Datei erstellt und die Ergebnisse zurückgibt.
4.1 Skript für das Python-Modul erstellen
#!/usr/bin/python
import json
import os
import sys
def main():
# Parameter von Ansible empfangen
input_data = json.load(sys.stdin)
filename = input_data.get('filename')
# Datei erstellen
try:
with open(filename, 'w') as f:
f.write('')
# Erfolgsnachricht
result = {
'changed': True,
'msg': f"Datei '{filename}' wurde erstellt."
}
except Exception as e:
# Fehlernachricht
result = {
'failed': True,
'msg': str(e)
}
# Rückgabe des Ergebnisses
print(json.dumps(result))
if __name__ == '__main__':
main()
4.2 Wichtige Punkte des Python-Skripts:
- Das Modul liest die Eingabedaten von Ansible als JSON über
sys.stdin
. - Es erstellt eine Datei und gibt je nach Ergebnis eine Erfolgsmeldung (
changed
) oder eine Fehlermeldung (failed
) zurück. - Python bietet nützliche Standardbibliotheken, die das Arbeiten mit JSON und Dateien erleichtern.
4.3 Modul in Ansible aufrufen
Um das Python-Modul in einem Playbook zu verwenden:
---
- hosts: localhost
tasks:
- name: Datei mit Python-Modul erstellen
ansible.builtin.command:
cmd: ./mein_python_modul.py
register: result
- debug:
var: result.stdout
5. Fazit
Die Erstellung eigener Ansible-Module in Bash oder Python bietet Flexibilität und Erweiterbarkeit für individuelle Anforderungen. Bash eignet sich hervorragend für einfache Module, während Python aufgrund seiner besseren Integration mit Ansible und seiner Flexibilität ideal für komplexere Module ist.
Durch das Schreiben eigener Module können Sie Ansible auf Ihre spezifischen Bedürfnisse anpassen und Aufgaben automatisieren, die durch Standardmodule nicht abgedeckt werden.