Ansible Teil 2 - Facts und Jinja2 Filter

Im ersten Teil der kleinen Ansible Serie ging es um die Installation von RPM Paketen für die Oracle Software. Der nächste Schritt wäre nun der Aufbau einer Datenbank mit dem Database Configuration Assistant (DBCA) der Firma Oracle. Es macht aber Sinn, vorab zum besseren Verständnis die Punkte Ansible Facts und Jinja2 Filter zu behandeln.

In unserem Demo-Beispiel soll es später die Möglichkeit geben, die Hauptspeicher-Grösse der Datenbank-Instanz in Megabyte als Variable zu definieren. Ist kein Wert explizit gesetzt, soll als Default-Wert 50% des verfügbaren Hauptspeichers genutzt werden. Für die praktische Umsetzung gibt es in Ansible Standard-Facts die automatisch vom Zielsystem ermittelt werden. In unserem Fall das Fact ansible_memtotal_mb das wir als Grundlage für eigene Berechnungen nutzen könnten:

- name: calculate totalMemory parameter for dbca
  debug:
    msg: "{{ oracle_memory | default((ansible_memtotal_mb / 2) | round | int) }}"

Zusätzlich möchten wir den DBCA später nur starten, wenn auf dem Zielsystem noch keine entsprechende Datenbank vorhanden ist. Ein Indikator für diese Erkennung ist der Inhalt der Datei /etc/oratab. In diesem Fall ist die Verarbeitung etwas aufwendiger, zunächst könnten wir den Inhalt von /etc/oratab in Ansible verfügbar machen:

- name: Slurp /etc/oratab
  ansible.builtin.slurp:
    src: /etc/oratab
  register: slurped_etc_oratab

Aus diesem Inhalt können wir dann mit Jinja2 Filtern eine Liste der ORACLE_SIDs herausfiltern:

- name: Extract list of Oracle SIDs from slurped /etc/oratab
  ansible.builtin.set_fact:
    oracle_sids: "{{ slurped_etc_oratab.content | 
                     ansible.builtin.b64decode | 
                     ansible.builtin.regex_findall('^((?!#).+):.*:.*$', multiline=True) }}"

Die so ermittelten ORACLE_SIDs könnten wir für Debug-Zwecke in einer Schleife ausgeben lassen:

- name: Iterate over list of Oracle SIDs and display them
  ansible.builtin.debug:
    msg: "{{ item }}"
  loop: "{{ oracle_sids }}"

Um zu verhindern, dass der DBCA gestartet wird, wenn die gewünschte ORACLE_SID schon in der /etc/oratab vorhanden ist, könnten wir den späteren Task mit folgender when-Bedingung versehen:

- name: Only execute if given SID is not in extracted Oracle SID list
  ansible.builtin.debug:
    msg: "Database {{ oracle_sid }} is not in list..."
  when: oracle_sid not in oracle_sids