=====Mit Hilfe von Ansible das AUTONOMOUS HEALTH FRAMEWORK(AHF) auf allen DB Maschinen verteilen / installieren und konfigurieren===== **Aufgabe** Über Ansible Tower / den Oracle Linux Automation Manager soll der AHF auf allen DB Maschine ausgerollt und regelmäßig aktualisiert werden. Ablauf: * Auf dem Oracle Linux Automation ManagerServer Verzeichnis zur Verfügung stellen für den Download des AHF Patches * Auf die richtigen Rechte für den User "awx" achten (muss dort schreiben und lesen können!)! * MOS Zugangsdaten für den Download bereithalten und als User definied Credential Objekt in Tower hinterlegen * In Tower im Job Control Patch Verzeichnis für die Verwendung in Tower freigeben * Playbook für die Installation/Update und die Basis Konfiguration erstellen * Zugangsdaten für das Oracle Health Checks Collection Manager DB Repostitory als User definied Credential Objekt in Tower hinterlegen * Playbook für die Erweiterte Konfiguration für die Verwendung des Oracle Health Checks Collection Manager erstellen ---- ====AHF - Oracle AUTONOMOUS HEALTH FRAMEWORK ==== Zu AHF siehe [[dba:oracle_rac_19c_ahf_trace_file_analyser|Eine Oracle RAC Umgebung mit dem AUTONOMOUS HEALTH FRAMEWORK(AHF) überprüfen]] und [[dba:oracle_ahf_oracle_health_checks_collection_manager|Oracle Health Checks Collection Manager]] === Lizenz === https://www.oracle.com/technetwork/database/options/clustering/ahf/learnmore/oracle-ahf-faqs-4392561.pdf Zur Lizenz: //„Do I need a separate license for Oracle Autonomous Health Framework? Oracle Autonomous Health Framework consists of multiple components. Oracle Autonomous Health Framework compoents Cluster Health Advisor and Quality of Service Management, require an Oracle RAC license. However, the other components, Cluster Health Monitor, Cluster Verification Utility, ORAchk, Trace File Analyzer, Memory Guard, and Hang Manager do not. Please follow this link to the license guide for more information: http://docs.oracle.com/database/18/DBLIC/toc.htm“ // ---- ==== Tower vorbereiten ==== ===Verzeichnis anlegen=== #als Root mkdir -p /srv/patch_storage/ahf mkdir -p /srv/patch_storage/bin chown -R ansible:awx /srv/patch_storage chmod -R g+w /srv/patch_storage Unter /srv/patch_storage/bin getMOSPatch.jar von https://github.com/MarisElsins/getMOSPatch hinterlegen und in das ahf Verzeichnis verlinken #User ansible: cd /srv/patch_storage/bin wget https://github.com/MarisElsins/getMOSPatch/blob/master/getMOSPatch.jar # Manuell aufrufen um passende confiuguration datei zu erzeugen java -jar getMOSPatch.jar MOSUser=Gunther.Pipperr@nomail.de patch=30166242 download=all Enter your MOS password: # oder für Linux diese anlegen: vi .getMOSPatch.cfg 226P;Linux x86-64 4L;German (D) #verlinken aus dem ahf Verzeichnis: cd /srv/patch_storage/ahf ln -s /srv/patch_storage/bin/getMOSPatch.jar getMOSPatch.jar ln -s /srv/patch_storage/bin/.getMOSPatch.cfg .getMOSPatch.cfg ===Verzeichnis in Tower freigeben === In der Tower Oberfläche unter "ADMINISTRATION/SETTINGS/JOBS" In der Box "Paths to expose to isolated jobs" "/srv/patch_storage/ahf" und "/srv/patch_storage/bin" eintragen. ===Credential in Tower für den MOS Account hinterlegen === Für den Support Zugang wird im Tower ein eigener Credential Type hinterlegt, siehe dazu auch [[linux:ansible_tower_password_handling|Ansible Tower - Wie verhindere ich Klarschrift Passwörter in PlayBooks]] Unter "ADMINISTRATION/Credential Types" Input Configuration: fields: - id: oracleSupportUser type: string label: MOS Username - id: oracleSupportPWD type: string label: MOS Password secret: true required: - oracleSupportUser - oracleSupportPWD Injector Configuration extra_vars: oracleSupportPWD: '{{ oracleSupportPWD }}' oracleSupportUser: '{{ oracleSupportUser }}' Nun mit diesen Typ unter "Credentials" ein Credential mit Meta Link Mail Adresse und Passwort anlegen. ---- ==== Playbook Installation ==== --- - name: Install AHF Framework hosts: all tasks: - name: download last version local_action: module: ansible.builtin.command cmd: "/usr/bin/java -jar /srv/patch_storage/bin/getMOSPatch.jar MOSUser={{MosUser}} MOSPass={{MosPWD}} patch={{PatchId}} download=all" args: chdir: /srv/patch_storage/ahf register: downloadAHF run_once: true become: no - debug: var=downloadAHF.stdout_lines - name: create install directory ansible.builtin.file: path: /tmp/ahf-install state: directory - name: extract File ansible.builtin.unarchive: src: "{{item}}" dest: /tmp/ahf-install remote_src: no with_fileglob: - "/srv/patch_storage/ahf/AHF-*" - name: create ahf bin directory become_user: root become: yes ansible.builtin.file: path: /opt/oracle.ahf owner: root group: root state: directory - name: create ahf data directory become_user: root become: yes ansible.builtin.file: path: /opt/oracle.ahf/data owner: root group: root state: directory - name: start the installer in silent mode become_user: root become: yes ansible.builtin.command: "/tmp/ahf-install/ahf_setup -ahf_loc /opt/oracle.ahf -data_dir /opt/oracle.ahf/data -silent" register: installAHF - debug: var=installAHF.stdout_lines - name: delete content & directory ansible.builtin.file: state: absent path: /tmp/ahf-install - name: register Mail Adress become_user: root become: yes ansible.builtin.command: "/opt/oracle.ahf/bin/tfactl set notificationAddress={{AhfEMail}}" register: ConfigureMailAHF - debug: var=ConfigureMailAHF.stdout_lines - name: Stop oraChk auto run to avoid disk problems become_user: root become: yes ansible.builtin.command: "/opt/oracle.ahf/bin/tfactl run orachk -autostop" register: ConfigureOraChk - debug: var=ConfigureOraChk.stdout_lines === Tower Template === In Tower nun das Template anlegen mit folgenden Extra Variables: --- MosUser: "{{ oracleSupportUser }}" MosPWD: "{{ oracleSupportPWD }}" PatchId: "30166242" AhfEMail: "dba@pipperr.local" Mos Credentials unter Credentials mit hinterlegen! ---- ==== Playbook Konfiguration==== === Credential Objekt für das Repository anlegen === Im Credential Objekt soll diese Informationen hinterlegt werden: OracleConnectString: "(DESCRIPTION =(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.90)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME = SRV_GPIDB_IMPORT)))" DBPWD: "orachk" Unter "ADMINISTRATION/Credential Types" Input Configuration: fields: - id: oracleDBUser type: string label: Oracle Datenbank Username - id: oracleDBConnectString type: string label: Oracle Datenbank ConnectString - id: oracleDBPWD type: string label: Oracle Datenbank Password secret: true required: - oracleDBUser - oracleDBPWD - oracleDBConnectString Injector Configuration extra_vars: oracleDBConnectString: '{{ oracleDBConnectString }}' oracleDBPWD: '{{ oracleDBPWD }}' oracleDBUser: '{{ oracleDBUser }}' Nun mit diesen Typ unter "Credentials" ein Credential mit Meta Link Mail Adresse und Passwort anlegen. === Das eigentliche Playbook === Zuerst wird eine bestehende DB Konfiguration entfernt und dann der interaktive Dialog zur Konfiguration "ferngesteuert": --- - name: Configure the DB Connection for orachk hosts: all become: yes become_user: root tasks: - name: Deregister the existing configuration ansible.builtin.command: "/opt/oracle.ahf/bin/tfactl orachk -unsetdbupload all" register: UnConfigureDBConnect - debug: var=UnConfigureDBConnect.stdout_lines - name: register the configuration ansible.builtin.expect: echo: yes chdir: "/opt/oracle.ahf/bin" command: "/opt/oracle.ahf/bin/tfactl orachk -setdbupload all" timeout: "300" responses: (.*)Enter value for RAT_UPLOAD_CONNECT_STRING(.*): "{{ OracleConnectString }}" (.*)Enter value for RAT_UPLOAD_PASSWORD(.*): "{{ DBPWD }}" register: setDBConnection #failed_when: "setDBConnection.rc != 0 and 'successfully' not in setDBConnection.stdout" - debug: var=setDBConnection.stdout_lines - name: Check the existing configuration ansible.builtin.command: "/opt/oracle.ahf/bin/tfactl orachk -checkdbupload" register: checkDBConnect failed_when: "checkDBConnect.rc != 0 and 'good to upload' not in checkDBConnect.stdout" - debug: var=checkDBConnect.stdout_lines Unter "EXTRA VARIABLES" auf dem Template den Zugriff auf die Wert im Credential Objekt definieren: --- OracleConnectString: "{{ oracleDBConnectString }}" DBPWD: "{{ oracleDBPWD }}" ===Problem: Failed to import the required Python library (pexpect) === fatal: [apex01.pipperr.local]: FAILED! => {"changed": false, "msg": "Failed to import the required Python library (pexpect) on apex01.pipperr.local's Python /usr/bin/python3.6. Please read module documentation and install in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter"} Lösung auf den konten: dnf install python3-pexpect ---- ==== Playbook Bericht erzeugen ==== Theoretisch könnte der Bericht auch über den internen Scheduler von orachk in das Repository geladen werden. Hier aber zentral über Ansible gesteuert: --- - name: Run orachk report hosts: all become: yes become_user: root tasks: - name: run the orachk report ansible.builtin.command: "/opt/oracle.ahf/bin/tfactl orachk -a -dball" register: runReport - debug: var=runReport.stdout_lines Damit aber das zentrale Repository nicht überfordert wird, wird der "FORKS" Parameter auf 2 gesetzt, damit sollten nur je zwei DB System je gleichzeitig den Bericht erzeugen und auf den zentralen Server hochladen um zu verhindern das beim Upload Zuviel Daten auf dem DB Server übertragen werden. ---- ==== Quellen ==== Oracle: https://docs.oracle.com/en/engineered-systems/health-diagnostics/autonomous-health-framework/ahfug/autonomous-health-framework-checks-and-diagnostics-users-guide.pdf