=====Die Ansible Facts mit ansible-cmdb für eine HTML Seite mit allen konfigurieren Hosts verwenden=====
**Aufgaben:**
Alle Host der Umgebung sollen in einem Bericht zusammengestellt werden.
Dazu gibt es bereits ein recht praktisches Skript **ansible-cmdb** => https://ansible-cmdb.readthedocs.io
Ablauf:
* ansible-cmdb in der normalen Python Umgebung installieren
* ansible-cmdb in der Kommando Zeile aufrufen
* Ergebnis HTML in Ansible Tower darstellen
* ansible-cmdb in Ansible Tower/AWX verwenden
* ansible-cmdb im AWX Laufzeit Umgebung bereitstellen
* Skripte für Ablauf in Tower erstellen
* Als Job laufen lassen
----
==== Report Tool installieren ====
In der "normalen" Python Umgebung für den normalen Ansible Aufruf als Skript.
Installation => https://ansible-cmdb.readthedocs.io/en/latest/installation/
Falls pip zur Verfügung steht:
pip3 install ansible-cmdb
=== Redhat 7 ===
Pip vorbereiten:
yum install python27-python-pip.noarch
scl enable python27 bash
siehe auch => https://access.redhat.com/solutions/1519803
pip install ansible-cmdb
----
==== Report mit ansible-cmdb erzeugen ====
In ein Ansible Playbook mit hinterlegter Host Konfiguration wechseln:
Alle Daten einsammeln:
mkdir output
ansible -m setup --tree output/ all
HTML Bericht aus den Daten erstellen:
ansible-cmdb output/ > index.htm
alternativ mit:
python 3 /usr/local/lib/ansiblecmdb/ansible-cmdb.py ./output/ > overview.html
----
==== Html Seite in Ansible Tower Statisch zur Verfügung stellen ====
mkdir /var/lib/awx/public/static/enviroment
#rechte für die spätere Automatisierung einstellen
chown -R root:awx /var/lib/awx/public/static/enviroment
chmod g+w /var/lib/awx/public/static/enviroment/
#Datei bereitstellen
cp /var/lib/awx/projects/deploy_ansible_user/index.html /var/lib/awx/public/static/enviroment
Aufruf über https://myhost/static/enviroment/index.html.
Leider funktioniert das Java Skript in der Seite aus Sicherheitsgründen nicht.
Das muss lokal auf dem Webserver liegen!
D.h. Seite anpassen und JavaScript Lib (JQuery) lokal in das gleiche Verzeichnis legen.
Folgende Dateien werden benötigt:
# wo liegen die?
cd /
find . -name jquery.dataTables.js
./usr/local/lib/ansiblecmdb/data/static/js/jquery.dataTables.js
find . -name jquery-1.10.2.min.js
/usr/local/lib/ansiblecmdb/data/static/js/jquery-1.10.2.min.js
# Libs kopieren
cp ./usr/local/lib/ansiblecmdb/data/static/js/jquery-1.10.2.min.js /var/lib/awx/public/static/enviroment/
cp /usr/local/lib/ansiblecmdb/data/static/js/jquery.dataTables.js /var/lib/awx/public/static/enviroment/
Im Template Html diese Stelle anpassen, damit der Pfad passt:
=== Eigenes Template verwenden ===
Damit das nicht jedes mal neu angepasst werden muss, kann auch ein Template für die Seite hinterlegt werden.
# wo liegen die templates
cd /
find . -name html_fancy.
#Projektverzeichnis anlegen
mkdir -p /var/lib/awx/projects/server_inventory/report_templates
cd /var/lib/awx/projects/server_inventory/report_templates
cp /usr/local/lib/python3.6/site-packages/ansiblecmdb/data/tpl/html_fancy.tpl .
cp /usr/local/lib/python3.6/site-packages/ansiblecmdb/data/tpl/html_fancy_defs.html .
Anpassen in der html_fancy_defs.html
% if local_js is False:
% else:
% endif
Template verwenden:
#Muss im Template Verzeichnis aufgerufen werden!
cd /var/lib/awx/projects/server_inventory/report_templates
#
python3 /usr/local/lib/ansiblecmdb/ansible-cmdb.py -p local_js=1 -t ./html_fancy -i ../../deploy_ansible_user/inventory ../../deploy_ansible_user/output/ > /var/lib/awx/public/static/enviroment/index.html
----
==== In Ansible Tower als Playbook umsetzen ====
Das Skript läuft aber nur in einer lokalen Ansible Umgebung auf der mit Ansible gesammelten Facts im Json Format in einem Out Verzeichnis.
In Tower steht das aber so einfach nicht zur Verfügung, d.h. wir müssen zuerst die benötigten Details einsammeln.
Dabei ist zu beachten das ein Playbook in Ansible Tower unter dem User AWX und in einer eigenen Python Umgebung läuft und normalerweise auf keine lokalen Verzeichnisse zugreifen kann.
=== Skript in der Tower Umgebung bereitstellen ===
Das Problem => Ein Python Skript in einem Playbook wird ein einer eigenen Umgebung innerhalb von Ansible Tower
..
ansible-cmdb.py\", line 19, in \n from mako import exceptions\nImportError: No module named mako
..
=> siehe auch dazu => https://www.redhat.com/sysadmin/virtualenvs-ansible-tower
==How do I Install Packages Inside the Ansible venv for Ansible Tower?==
siehe => https://docs.ansible.com/ansible-tower/latest/html/upgrade-migration-guide/virtualenv.html#using-virtualenv-with-at
Installieren:
source /var/lib/awx/venv/ansible/bin/activate
umask 0022
pip install --upgrade ansible-cmdb
deactivate
In dieser Umgebung dann auch das Skript testen!
=== Job Steuerungs-Parameter definieren===
==Zugriff auf Verzeichnis sicherstellen==
Nächstes Problem:
msg": "Destination directory /var/lib/awx/public/static/enviroment does not exist"
Lösung siehe => https://access.redhat.com/solutions/5669861
Why Job Is Failing With "Destination directory does not exist" Even It Is Present In Ansible Tower?
..
Resolution
If you have ENABLE JOB ISOLATION Checked, you would have to mention the path of the directory for which the Job is failing in SETTINGS>>JOBS>>PATHS TO EXPOSE TO ISOLATED JOBS in Ansible Tower.
..
Problem:
msg": "Destination /var/lib/awx/public/static/enviroment not writable"
Fehlende Rechte! Prüfen/Neu setzen!
#zuvor schon Gruppe auf awx gesetzt:
chown -R root:awx /var/lib/awx/public/static/enviroment
# Datei kann aber nicht überschrieben werden!
chmod 664 /var/lib/awx/public/static/enviroment/index.html
chmod g+w /var/lib/awx/public/static/enviroment/
== Zeithandling prüfen/ einstellen ==
Damit Playbooks auch vom den Ausgaben in der richtigen Zeitzone laufen (Default ist immer UTC) diese für den Job setzen , siehe dazu => https://access.redhat.com/solutions/4124131
Unter Settings/Job/EXTRA ENVIRONMENT Variables:
{
"TZ": "Europe/Berlin"
}
----
=== Playbooks zusammenstellen===
==Fact Files erzeugen==
Der Trick beim Einsammeln der Facts liegt darin das Ergebnis lokal zu speichern, dazu wird per vorheriges "register" auf dem Output on "setup" referenziert, dann kann mit "local_action" und "copy" wieder auf den Output zugegrifen werden.
Wichtig ist es in der Ansible Tower Job Steuerung das Output Directory freigeben werden! Auf die Rechte auf dem Verzeichnis achten, die Gruppe AWX muss in das Verzeichnis schreiben können!
Rechte einstellen:
chwon -R root:awx /var/lib/awx/projects/server_inventory
chmod g+w /var/lib/awx/projects/server_inventory/output/
Das Playbook:
---
- name: gather_facts
hosts: all
gather_facts: 'true'
tasks:
- name: Gather facts
ansible.builtin.setup:
register: ansible_facts_setup
- local_action:
module: ansible.builtin.copy
content: "{{ ansible_facts_setup }}"
dest: "/var/lib/awx/projects/server_inventory/output/{{ inventory_hostname }}"
==Host Liste erzeugen==
Soll auch die Gruppen Zuordnung pro Server in der Liste hinterlegt werden, benötigt das Skript ein Inventory.
Da ist noch in Arbeit, gestaltet sich leider etwas komplizierte das aus Tower im Ansible Conf Format ohne großes Scripting auszulesen, d.h. die Datei "inventory" wird erstmal nur leer angelegt bzw. die Variante um Tower mit Hosts zu beladen verwandt.
== Den Bericht erzeugen==
---
- name: create Server Inventory Liste
hosts: localhost
tasks:
- name: Execute ansiblecmdb on local host
command:
cmd: "ansible-cmdb -p local_js=1 -t html_fancy -i ../inventory ../output/"
args:
chdir: ./report_templates/
register: serverCMDB
# - debug: var=serverCMDB.stdout
- name: Write variable to file
local_action: copy content="{{serverCMDB.stdout}}" dest=/var/lib/awx/public/static/enviroment/index.html
== Main Playbook ===
Für den Aufruf in Ansible Tower zentrales Skript zusammen stellen:
---
- name: Collect the Facts
import_playbook: gather_facts.yml
- name: create Server Inventory Liste
import_playbook: create_server_list.yml
=== Schedule für den Ansible Tower Job anlegen===
Wenn das Playbook sich in Tower starten läßt , kann das auch in Ansible per Schedule automatisiert werden.
----
==== Quellen ====
* https://ansible-cmdb.readthedocs.io/en/latest/usage/