=====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