30. Dezember 2024, 16:40
Lesezeit: ca. 2 Min

Ansible Playbook Zusammenfassungen

Was mich bei der Ausführung von Ansible Playbooks schon länger nervt: Es fehlt eine summierende Zusammenfassung im PLAY RECAP. Wie oft gab es ein failed oder skipped? Wieviele Rechner waren zur Laufzeit überhaupt erreichbar, oder nicht?

Und so habe ich heute noch die Zeit gefunden, ein kleines Python Callback-Skript1 zu erstellen, welches nach der Ausführung eines Tasks getriggert wird. Die summierende Zusammenfassung wird dann am Ende ausgegeben:

Screenshot Ansible Summary am Ende des PLAY RECAPs

Voraussetzung zum Ausführen von Callbacks in Playbooks ist die Hinterlegung des Verzeichnisses, wo die Skripte enhalten sind. Das geschieht in der der Ansible .config.cfg2 Datei im Homeverzeichnis. Zusätzlich ist noch die Enviroment Variable ANSIBLE_CALLBACK_PLUGINS = 1 zu setzen.

Das Callback-Skript selbst wird im Ansible Repo einer Infrastrukur idealerweise in einem Unterverzeichnis /callbacks hinzugefügt. Ich bin zum Jahresende faul und habe für die paar Zeilen kein extra Repo auf Codeberg dafür erstellt:

from ansible.plugins.callback import CallbackBase

class CallbackModule(CallbackBase):
    CALLBACK_VERSION = 2.0
    CALLBACK_TYPE = 'aggregate'
    CALLBACK_NAME = 'summarize_totals'

    def __init__(self):
        super(CallbackModule, self).__init__()
        self.host_results = {
            'ok': 0,
            'changed': 0,
            'unreachable': 0,
            'failed': 0,
            'skipped': 0
        }

    def v2_runner_on_ok(self, result):
        if result._result.get('changed', False):
            self.host_results['changed'] += 1
        elif result._result.get('skipped', False):
            self.host_results['skipped'] += 1
        else:
            self.host_results['ok'] += 1

    def v2_runner_on_changed(self, result):
        self.host_results['changed'] += 1

    def v2_runner_on_skipped(self, result):
        self.host_results['skipped'] += 1

    def v2_runner_on_unreachable(self, result):
        self.host_results['unreachable'] += 1

    def v2_runner_on_failed(self, result, ignore_errors=False):
        self.host_results['failed'] += 1

    def v2_playbook_on_stats(self, stats):
        print("\n\nTASK SUMMARY:")
        print(f"  OK: {self.host_results['ok']}")
        print(f"  Changed: {self.host_results['changed']}")
        print(f"  Unreachable: {self.host_results['unreachable']}")
        print(f"  Failed: {self.host_results['failed']}")
        print(f"  Skipped: {self.host_results['skipped']}\n\n")

Generell können in Callbacks Trigger auch für Email-Benachrichtigungen, Inventarisierung, Monitoring- oder Ticketsystem APIs gesetzt werden. Es gibt da zahlreiche vorgefertigte Community Skripte für die verschiedenen Anwendungen und APIs.3

In diesem Sinne,
Tomas Jakobs

© 2024 Tomas Jakobs - Impressum und Datenschutzhinweis

Unterstütze diesen Blog - Spende einen Kaffee