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