Ansible Teil 10 – Filterung nach Playbook-Run Zuständen

Ansible bietet in seiner Standardausstattung bereits zahlreiche Module und Funktionen, um die gängigsten Einsatzzwecke abzudecken. Leider wird die Fehleranaylse nach fehlgeschlagenen Playbooks-Runs nach wie vor eher stiefmütterlich behandelt. Gut, dass Ansibles Modularität es uns erlaubt, eigene sogenannte Callback-Plugins hinzuzufügen.
Ein solches Callback-Plugin, welches uns eine Auflistung aller Hosts während eines erfolgreichen/nicht erfolgreichen Playbook-Runs gibt, werden wir uns im folgenden Beitrag einmal näher anschauen.

Wie eingangs erwähnt bietet Ansible von Haus aus eher spärliche Möglichkeiten, erfolgreiche oder fehlgeschlagene Ansible-Runs abzufangen. Gerade in größeren Ansible-Infrastrukturen ist es nicht unüblich, dass auch mal die ein oder andere Kontaktierung in die Hose gehen kann. Damit man darüber auch ordnungsgemäß in Kenntnis gesetzt wird, können wir uns das folgende Callback-Plugin zunutze machen.
Wir erstellen uns zwei beliebige Ordner, jeweils für das Callback-Plugin und für die Dateien, die das Callback-Plugin erzeugen wird:

sudo mkdir -p /etc/ansible/callback_plugins/
sudo mkdir -p /etc/ansible/callback_plugins/

und erstellen dort diese Datei …

sudo nano /etc/ansible/callback_plugins/hosts_status_list.py

… mit dem folgenden Inhalt:

from ansible.plugins.callback import CallbackBase

class CallbackModule(CallbackBase):
def init(self, *args, *kwargs): super(CallbackModule, self).init(args, **kwargs)
self.successful_hosts = []
self.failed_hosts = []
self.unreachable_hosts = []
self.changed_hosts = []

### When Host is successful
def v2_runner_on_ok(self, result):
    host = result._host.get_name()
    self.successful_hosts.append(host)
    self._write_status()

### When Host is failed
def v2_runner_on_failed(self, result, ignore_errors=False):
    host = result._host.get_name()
    self.failed_hosts.append(host)
    self._write_status()

### When Host is unreachable
def v2_runner_on_unreachable(self, result):
    host = result._host.get_name()
    self.unreachable_hosts.append(host)
    self._write_status()

### When Host is changed
def v2_runner_on_changed(self, result):
    host = result._host.get_name()
    self.changed_hosts.append(host)
    self._write_status()

### Write the status of all hosts to files
def _write_status(self):
    with open('/etc/ansible/callback_messages/successful_hosts.txt', 'w') as f:
        f.write("\n".join(self.successful_hosts))

    with open('/etc/ansible/callback_messages/failed_hosts.txt', 'w') as f:
        f.write("\n".join(self.failed_hosts))

    with open('/etc/ansible/callback_messages/unreachable_hosts.txt', 'w') as f:
        f.write("\n".join(self.unreachable_hosts))

    with open('/etc/ansible/callback_messages/changed_hosts.txt', 'w') as f:
        f.write("\n".join(self.changed_hosts))

Dieses Callback-Plugin erstellt uns nach jedem durchgeführten Playbook-Run jeweils 4 Dateien in der alle Hosts aufgelistet werden, die mit dem Status „erfolgreich“, „nicht erfolgreich“, „nicht erreichbar“ und „geändert“ kontaktiert wurden und legt sie unter /etc/ansible/callback/ ab. Falls ein anderer Ablageort gewünscht ist, kann dieser in den Zeilen … geändert werden.
Damit dieses Callback-Plugin von Ansible auch verwendet wird, muss jedoch zuvor noch eine Einstellung in Ansibles Hauptkonfigurationsdatei ansible.cfg vorgenommen werden. Wo genau diese ansible.cfg liegt, kann je nach Distribution und Ansible-Version variieren. Falls ihr das nicht genau wisst, gebt ihr einfach …

ansible --version | grep config

… ein. Dort sollte der Pfad zur ansible.cfg aufgelistet werden. Sollte dort wider erwarten config file = None stehen, erstellt ihr euch zuvor noch eine
Diese öffnen wir dann auch …

sudo nano /etc/ansible/ansible.cfg

… und suchen innerhalb der Kategorie [defaults] nach der Zeile callback_plugins =, kommentieren diese ein und setzen den entsprechenden Pfad zu unseren eben erstellten Callback-Plugin-Ordner. Das sollte dann in etwa so aussehen:

[defaults]
...
callback_plugins = /etc/ansible/callback_plugins/

Ein anschließender Neustart von Ansible ist nicht erforderlich da es keinen dahinterliegenden Dienst gibt. Führen wir nun einen erneuten beliebigen Ansible-Run aus, werden die 4 Dateien unter /etc/ansible/callback_messages/ erzeugt, unabhängig dessen ob ein Host darin aufgelistet wird oder nicht.

Kommentar verfassen

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

Nach oben scrollen