Ansible bietet eine leistungsstarke Möglichkeit, IT-Prozesse zu automatisieren, aber manchmal reichen die Standardfunktionen nicht aus, um spezielle Anforderungen abzudecken. In solchen Fällen bietet Ansible Entwicklern die Möglichkeit, eigene Plugins, Lookups, Filter und Callbacks zu erstellen. Diese Erweiterungen können verwendet werden, um die Standardfunktionalität von Ansible zu erweitern und maßgeschneiderte Lösungen für spezielle Anwendungsfälle zu bieten.
In diesem Tutorial werden wir erklären, wie man eigene Plugins, Lookups, Filter und Callbacks erstellt, um die Flexibilität von Ansible zu maximieren.
1. Einführung in Ansible-Erweiterungen
Ansible bietet mehrere Arten von Erweiterungen, die Sie selbst erstellen können:
- Plugins: Erweitern die Funktionalität von Ansible in verschiedenen Bereichen wie Aktionen, Verbindungen, Cache usw.
- Lookups: Ermöglichen das Abrufen von Daten aus externen Quellen wie Dateien oder APIs.
- Filter: Modifizieren und transformieren Daten innerhalb von Ansible-Playbooks.
- Callbacks: Reagieren auf bestimmte Ereignisse während der Ausführung eines Playbooks, wie z. B. das Protokollieren von Statusinformationen.
2. Eigene Plugins in Ansible erstellen
Ansible Plugins sind Python-Skripte, die unterschiedliche Aufgaben in einem Playbook unterstützen. In diesem Beispiel erstellen wir ein Aktions-Plugin, das eine benutzerdefinierte Aktion in einem Playbook ausführt.
2.1 Beispiel: Eigene Aktion mit einem Plugin
Erstellen Sie die Verzeichnisstruktur:
my_ansible_plugins/action_plugins/
Legen Sie nun das Python-Skript my_custom_action.py
im Verzeichnis action_plugins
ab:
from ansible.plugins.action import ActionBase
class ActionModule(ActionBase):
def run(self, tmp=None, task_vars=None):
# Parameter empfangen
result = super(ActionModule, self).run(tmp, task_vars)
my_param = self._task.args.get('my_param')
# Benutzerdefinierte Aktion
result['changed'] = True
result['msg'] = f"Aktion mit Parameter '{my_param}' ausgeführt."
return result
2.2 Verwendung des Plugins im Playbook
Sobald das Plugin erstellt ist, können Sie es in einem Playbook verwenden:
---
- hosts: localhost
tasks:
- name: Eigene Aktion aufrufen
my_custom_action:
my_param: "Hallo Welt!"
Erklärung:
- Dieses einfache Aktions-Plugin empfängt einen Parameter
my_param
und gibt eine Erfolgsmeldung mit diesem Parameter zurück. - Sie können nun komplexere Aktionen innerhalb des Plugins definieren.
3. Eigene Lookup-Plugins erstellen
Lookups sind eine großartige Möglichkeit, um Daten von externen Quellen in ein Playbook zu integrieren. Sie können z. B. Inhalte aus Dateien, Datenbanken oder APIs abrufen.
3.1 Beispiel: Eigenes Lookup-Plugin
Erstellen Sie die Verzeichnisstruktur:
my_ansible_plugins/lookup_plugins/
Legen Sie das Python-Skript my_custom_lookup.py
im Verzeichnis lookup_plugins
ab:
from ansible.plugins.lookup import LookupBase
class LookupModule(LookupBase):
def run(self, terms, variables=None, **kwargs):
# Empfangene Parameter
my_param = terms[0]
# Hier kann man externe Daten abrufen oder manipulieren
result = [f"Lookup-Ergebnis für: {my_param}"]
return result
3.2 Verwendung des Lookup-Plugins
Das Lookup-Plugin kann in einem Playbook wie folgt verwendet werden:
---
- hosts: localhost
tasks:
- name: Verwendung des eigenen Lookups
debug:
msg: "{{ lookup('my_custom_lookup', 'Beispieldaten') }}"
Erklärung:
- Das Lookup-Plugin empfängt einen Parameter und gibt ihn in einer modifizierten Form zurück.
- Diese Art von Plugin kann erweitert werden, um Daten von externen APIs, Datenbanken oder Dateien abzurufen.
4. Eigene Filter-Plugins erstellen
Filter werden verwendet, um Variablen oder Daten in Playbooks zu transformieren. Sie können damit z. B. Textformatierungen, Berechnungen oder logische Operationen durchführen.
4.1 Beispiel: Eigenes Filter-Plugin
Erstellen Sie die Verzeichnisstruktur:
my_ansible_plugins/filter_plugins/
Legen Sie das Python-Skript my_custom_filter.py
im Verzeichnis filter_plugins
ab:
def reverse_string(value):
return value[::-1]
class FilterModule(object):
def filters(self):
return {
'reverse_string': reverse_string
}
4.2 Verwendung des Filter-Plugins
Verwenden Sie den Filter im Playbook wie folgt:
---
- hosts: localhost
tasks:
- name: Verwende den benutzerdefinierten Filter
debug:
msg: "{{ 'Hallo Ansible' | reverse_string }}"
Erklärung:
- Dieses Filter-Plugin dreht den übergebenen String um und gibt ihn in umgekehrter Reihenfolge zurück.
- Filter-Plugins können in komplexeren Szenarien nützlich sein, um Datentransformationen durchzuführen.
5. Eigene Callback-Plugins erstellen
Callback-Plugins reagieren auf Ereignisse während der Ausführung eines Playbooks. Sie können verwendet werden, um benutzerdefinierte Protokolle zu schreiben, Benachrichtigungen zu senden oder Aktionen bei bestimmten Playbook-Ereignissen auszulösen.
5.1 Beispiel: Eigenes Callback-Plugin
Erstellen Sie die Verzeichnisstruktur:
my_ansible_plugins/callback_plugins/
Legen Sie das Python-Skript my_custom_callback.py
im Verzeichnis callback_plugins
ab:
from ansible.plugins.callback import CallbackBase
class CallbackModule(CallbackBase):
def v2_runner_on_ok(self, result):
# Ausgabe bei erfolgreicher Task
print(f"TASK OK: {result._task.name}")
5.2 Verwendung des Callback-Plugins
Das Callback-Plugin wird automatisch von Ansible bei bestimmten Ereignissen aufgerufen, ohne dass es im Playbook explizit erwähnt werden muss. Es gibt beim erfolgreichen Abschluss einer Task eine Meldung aus.
Um das Callback-Plugin zu verwenden, platzieren Sie es im Ordner callback_plugins
und führen ein Playbook aus. Die Ausgabe wird dann in der Konsole erscheinen.
6. Fazit
Die Möglichkeit, eigene Plugins, Lookups, Filter und Callbacks in Ansible zu erstellen, bietet Ihnen die Flexibilität, die Automatisierung an Ihre spezifischen Anforderungen anzupassen. Ob Sie benutzerdefinierte Aktionen ausführen, Daten aus externen Quellen abrufen oder spezielle Protokollierungen und Benachrichtigungen einrichten möchten – mit diesen Erweiterungen können Sie Ansible nach Belieben anpassen.
Durch die Erstellung eigener Plugins und Erweiterungen können Sie Ihre Automatisierungs-Playbooks effizienter gestalten und maßgeschneiderte Lösungen für Ihre IT-Infrastruktur entwickeln.