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:
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
Pip vorbereiten:
yum install python27-python-pip.noarch scl enable python27 bash
siehe auch ⇒ https://access.redhat.com/solutions/1519803
pip install ansible-cmdb
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
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:
<!-- DataTables assets --> <script type="text/javascript" charset="utf8" src="jquery-1.10.2.min.js"></script> <script type="text/javascript" charset="utf8" src="jquery.dataTables.js"></script> </head>
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
<!-- DataTables assets --> % if local_js is False: <script type="text/javascript" charset="utf8" src="https://code.jquery.com/jquery-1.10.2.min.js"></script> % else: <script type="text/javascript" charset="utf8" src="jquery-1.10.2.min.js"></script> % endif <script type="text/javascript" charset="utf8" src="jquery.dataTables.js"></script>
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
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.
Das Problem ⇒ Ein Python Skript in einem Playbook wird ein einer eigenen Umgebung innerhalb von Ansible Tower <ausgeführt, in dieser sind aber nicht die notwendigen Libraries hinterlegt!
.. ansible-cmdb.py\", line 19, in <module>\n from mako import exceptions\nImportError: No module named mako ..
⇒ siehe auch dazu ⇒ https://www.redhat.com/sysadmin/virtualenvs-ansible-tower
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!
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/
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" }
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 }}"
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.
--- - 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
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
Wenn das Playbook sich in Tower starten läßt , kann das auch in Ansible per Schedule automatisiert werden.