Eigene Plugins in Ansible

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 (hier reverse_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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert