Ansible ist ein mächtiges Open-Source-Werkzeug zur Automatisierung von IT-Aufgaben. Eines der interessantesten Merkmale von Ansible ist seine Erweiterbarkeit durch Plugins. Wenn du also eine Funktionalität benötigst, die in Ansible noch nicht enthalten ist, kannst du ganz einfach eigene Plugins schreiben. In diesem Tutorial zeige ich dir, wie du eigene Plugins erstellst und in Ansible integrierst.
Was sind Ansible-Plugins?
Plugins in Ansible erweitern das Verhalten und die Funktionalität von Ansible selbst. Es gibt verschiedene Arten von Plugins, die jeweils eine spezifische Rolle übernehmen, z. B.:
- Callback-Plugins: Sie ermöglichen es, während und nach der Ausführung von Playbooks benutzerdefinierte Aktionen auszuführen, wie z. B. spezielle Berichte zu erstellen.
- Filter-Plugins: Ermöglichen das Erstellen eigener Jinja2-Filter, die in Playbooks oder Rollen verwendet werden können.
- Lookup-Plugins: Sie rufen Daten aus externen Quellen ab, um sie innerhalb von Playbooks zu verwenden.
- Action-Plugins: Sie bieten erweiterte Logik, um die Ausführung von Modulen zu modifizieren oder zu steuern.
In diesem Tutorial konzentrieren wir uns auf zwei gängige Plugin-Typen: Filter-Plugins und Callback-Plugins.
Beispiel 1: Ein eigenes Filter-Plugin erstellen
Filter-Plugins erweitern die Jinja2-Templating-Engine, die in Ansible verwendet wird. Sie erlauben es dir, Daten innerhalb von Playbooks zu transformieren oder zu manipulieren.
1. Verzeichnisstruktur
Zuerst legen wir eine einfache Verzeichnisstruktur für unser Plugin an. Dies könnte z. B. so aussehen:
my_ansible_project/
├── filter_plugins/
│ └── my_filter.py
├── playbook.yml
└── hosts
Die Datei my_filter.py
wird unser Filter-Plugin enthalten.
2. Filter-Plugin schreiben
Erstelle die Datei filter_plugins/my_filter.py
und füge den folgenden Code ein:
# my_filter.py
class FilterModule(object):
def filters(self):
return {
'reverse_string': self.reverse_string,
}
def reverse_string(self, value):
"""Dreht einen String um"""
if not isinstance(value, str):
raise TypeError("Erwartet einen String als Eingabewert")
return value[::-1]
Erklärung:
FilterModule
ist die Klasse, die Ansible verwendet, um Filter zu laden.- Die Methode
filters()
gibt ein Wörterbuch zurück, das den Namen des Filters (hierreverse_string
) mit der entsprechenden Funktion verknüpft. - Die Funktion
reverse_string()
dreht einen übergebenen String um. Wenn der übergebene Wert kein String ist, wird ein Fehler ausgelöst.
3. Playbook erstellen
Jetzt erstellen wir ein einfaches Playbook playbook.yml
, um unser Filter-Plugin zu testen:
---
- hosts: localhost
vars:
my_string: "Ansible"
tasks:
- name: Teste mein eigenes Filter-Plugin
debug:
msg: "{{ my_string | reverse_string }}"
Dieses Playbook verwendet den Filter reverse_string
, um den String „Ansible“ umzukehren.
4. Ausführen des Playbooks
Führe das Playbook mit folgendem Befehl aus:
ansible-playbook -i hosts playbook.yml
Das Ergebnis sollte wie folgt aussehen:
TASK [Teste mein eigenes Filter-Plugin]
ok: [localhost] => {
"msg": "elbisnA"
}
Wie erwartet wurde der String „Ansible“ umgekehrt.
Beispiel 2: Ein eigenes Callback-Plugin erstellen
Callback-Plugins ermöglichen es, bestimmte Aktionen während der Ausführung eines Playbooks auszuführen, z. B. detaillierte Logs zu schreiben oder eine Benachrichtigung zu senden.
1. Verzeichnisstruktur
Erstelle die Verzeichnisstruktur für das Callback-Plugin:
my_ansible_project/
├── callback_plugins/
│ └── my_callback.py
├── playbook.yml
└── hosts
2. Callback-Plugin schreiben
Erstelle die Datei callback_plugins/my_callback.py
und füge den folgenden Code ein:
# my_callback.py
from ansible.plugins.callback import CallbackBase
class CallbackModule(CallbackBase):
CALLBACK_VERSION = 2.0
CALLBACK_TYPE = 'notification'
CALLBACK_NAME = 'my_callback'
def v2_playbook_on_start(self, playbook):
self._display.display("Das Playbook hat begonnen: {}".format(playbook._file_name))
def v2_runner_on_ok(self, result):
self._display.display("Task erfolgreich auf {}: {}".format(result._host, result._task.get_name()))
Erklärung:
CallbackModule
ist die Hauptklasse, die von Ansible verwendet wird, um Callback-Plugins zu definieren.v2_playbook_on_start()
wird aufgerufen, wenn das Playbook startet. Es zeigt eine benutzerdefinierte Nachricht mit dem Playbook-Namen an.v2_runner_on_ok()
wird aufgerufen, wenn eine Aufgabe erfolgreich ausgeführt wurde. Es gibt eine benutzerdefinierte Nachricht für jede erfolgreiche Aufgabe aus.
3. Playbook erstellen
Erstelle ein einfaches Playbook playbook.yml
, um das Callback-Plugin zu testen:
---
- hosts: localhost
tasks:
- name: Eine Beispielaufgabe
debug:
msg: "Dies ist eine Testnachricht"
4. Callback-Plugin aktivieren
Damit Ansible das Callback-Plugin erkennt, musst du es in der Ansible-Konfiguration aktivieren. Öffne oder erstelle die Datei ansible.cfg
im gleichen Verzeichnis und füge die folgende Konfiguration hinzu:
[defaults]
callback_whitelist = my_callback
5. Playbook ausführen
Führe das Playbook mit folgendem Befehl aus:
ansible-playbook -i hosts playbook.yml
Wenn das Callback-Plugin korrekt konfiguriert ist, wird die Ausgabe etwa so aussehen:
Das Playbook hat begonnen: playbook.yml
TASK [Eine Beispielaufgabe]
ok: [localhost] => {
"msg": "Dies ist eine Testnachricht"
}
Task erfolgreich auf localhost: Eine Beispielaufgabe
Das Callback-Plugin gibt beim Start des Playbooks und nach dem erfolgreichen Ausführen einer Aufgabe benutzerdefinierte Nachrichten aus.
Fazit
In diesem Tutorial haben wir gelernt, wie man eigene Filter- und Callback-Plugins in Ansible erstellt. Mit Filter-Plugins kannst du benutzerdefinierte Datenmanipulationen in Playbooks durchführen, während Callback-Plugins es dir ermöglichen, die Ausführung von Playbooks in Echtzeit zu überwachen und zu erweitern.
Ansible bietet viele weitere Möglichkeiten zur Erweiterung, indem du Plugins für verschiedene Bereiche wie Lookup, Action oder Connections erstellst. Durch die Flexibilität von Ansible und Python kannst du deine Automatisierungsworkflows vollständig an deine Bedürfnisse anpassen. Viel Spaß beim Erstellen eigener Plugins!