Benutzer-Werkzeuge

Webseiten-Werkzeuge


linux:ansible_report_all_hosts

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-cmdbhttps://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:

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

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

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

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

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:

gather_facts.yml
---
- 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
create_server_list.yml
---
- 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

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
"Autor: Gunther Pipperr"
linux/ansible_report_all_hosts.txt · Zuletzt geändert: 2021/06/28 12:12 von gpipperr