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