AWX Project von Red Hat

awx_titel_football

AWX (https://github.com/ansible/awx) von Red Hat ist eine webbasierte Benutzeroberfläche für Ansible (https://www.ansible.com/), die nicht nur die Benutzung von Ansible vereinfacht, sondern auch um einige Funktionen erweitert. Das Open-Source-Programm bringt eine Task-Engine für Ansible mit, sodass Ansible Playbooks zeitgesteuert gestartet werden können. Jobs, Inventories und Playbooks lassen sich einfach über die Web-Oberfläche oder über die REST-API verwalten. AWX ist der Open-Source-Ableger von Red Hat's kostenpflichtigem Ansible Tower. Für AWX gibt es sehr häufig Updates (alle 2 Wochen), während es für Ansible Tower in größeren Abständen neue Versionen mit Langzeitsupport gibt. Red Hat empfiehlt AWX ausdrücklich nicht für den produktiven Einsatz, sondern Ansible Tower, da es hier Support durch Red Hat gibt. Da Ansible Tower und AWX sehr ähnlich sind, ist die sehr ausführliche Dokumentation für Tower auch für AWX gültig. Sie ist unter  https://docs.ansible.com/ zu finden.

AWX bietet eine gute Übersicht über abgeschlossene und laufende Jobs und ist dabei sehr einfach und strukturiert zu bedienen. Es können mehrere Benutzer und Benutzergruppen angelegt werden, wobei die Rechte der Nutzer und Gruppen sehr feingranular vergeben werden können. AWX läuft vollständig in Containern, ist daher betriebssystemunabhängig und leicht zu installieren.

Installation:

Es gibt verschiedene Möglichkeiten, um AWX zu installieren. Die Installation erfolgt mit einem Ansible Playbook und kann entweder auf das lokale System oder jeden beliebigen Ansible Host, erfolgen. Die Installation kann über die Datei awx/installer/inventory angepasst werden. Hier werden auch Einstellungen zu Proxy, SSL, Ports und der Datenbank vorgenommen. Mit Docker, Kubernetes und OpenShift stehen mehrere Containervirtualisierungssysteme zur Verfügung. Im Folgenden wird AWX mit Docker genutzt. Für die Installation müssen folgende Komponenten installiert sein:

  • Ansible 2.4+
  • Docker
  • Docker-compose
  • Docker Python Modul
  • Docker-compose Python Modul
  • GNU Make
  • Git
  • Node 10.x LTS
  • NPM 6.x LTS

Die Installation wird mit dem Befehl ansible-playbook -i inventory install.yml gestartet und dauert einige Minuten. Nach der Installation stehen fünf neue Docker Container zur Verfügung

  • awx_web stellt ein Webserver mit der Weboberfläche zur Verfügung
  • awx_task führt Ansible Tasks durch
  • mem cached Cache für Daten aus der Datenbank
  • postgres stellt eine Postgres-Datenbank zur Verfügung
  • rabbitmq stellt einen Message Broker zur Verfügung

Die Web-Oberfläche ist standardmäßig unter dem Port 80 erreichbar. Die Anmeldung ist mit dem Benutzernamen "admin" und dem Passwort "password" voreingestellt.

Nach der Anmeldung sieht man das Dashboard. Hier werden alle wichtigen Statusmeldungen übersichtlich dargestellt. Abbildung 1 zeigt ein Beispiel eines Dashboards.
Abbildung 1: Dashboard Beispiel


Nachdem AWX installiert ist, muss es konfiguriert und an den Anwendungszweck angepasst werden. Dafür sind mehrere Schritte erforderlich:

Organisation anlegen

Zur Konfiguration von AWX ist als erstes eine Organisation zu erstellen. In AWX werden Systeme in Organisationen aufgeteilt, sodass mehrere Unternehmen oder Bereiche mit AWX verwaltet werden können. Bei dem Anlegen neuer Organisationen ist zuerst ein Name erforderlich. Nach dem Speichern können Benutzer hinzugefügt und die Rechte der Benutzer angepasst werden.

Benutzer verwalten

Einzelne Benutzer können manuell und lokal angelegt werden. Alternativ kann die Authentifizierung über LDAP, RADIUS oder anderen Diensten erfolgen. Gruppen von Nutzern werden in Teams organisiert.

Inventory erstellen

In AWX werden die Hosts in Inventories verwaltet. Diese enthalten die IPs bzw. die Domainnamen aller Zielhosts. Nach der Angabe eines Namens für das Inventory und dem Speichern können Hosts gruppiert werden und einzelnen Benutzern oder Teams verschiedene Rechte erteilt werden. Hosts und Gruppen können manuell angelegt werden, direkt aus der Cloud importiert werden (z.B. EC2, Azure, OpenStack, …) oder über eigene Inventory Scripts erstellt werden. Diese können in jeder auf dem System installierten Programmiersprache geschrieben sein und müssen die Gruppen und Hosts als JSON-Objekt zurückliefern. Sie können dann manuell oder zeitgesteuert ausgeführt werden. Zusätzlich können spezifische Variablen für jeden Host, jede Gruppe und jedes Inventory gesetzt werden. Abbildung 2 zeigt das Anlegen eines neuen Inventories.

Abbildung 2: Anlegen eines Inventory


Zugangsdaten hinzufügen 

Damit AWX sich gegenüber Hosts oder Services authentifizieren kann, müssen Zugangsdaten (Credentials) hinterlegt werden. Es werden verschiedene Typen unterstützt, zum Beispiel Credentials für Clouds wie AWS oder Azure oder Credentials zum Anmelden per SSH. Für SSH-Zugangsdaten muss der Typ Machine ausgewählt werden. Dabei kann entweder eine Authentifizierung mit Nutzername und Passwort erfolgen oder mit Public und Private Keys. Zusätzlich sollte eine Methode zum Erlagen von höheren Benutzerrechten (z.B. sudo) und gegebenenfalls ein zugehöriges Passwort angegeben werden.

Projekt erstellen

Zum Erstellen eines neuen Projekts muss ein Name und die Organisation angegeben werden. Zusätzlich muss angegeben werden, wo AWX die Playbooks finden kann. Es wird nicht empfohlen Playbooks lokal zu speichern, sondern in einem Versionsverwaltungssystem. AWX unterstützt Git, SVN, Mercurial und Red Hat Insights. Um darauf zugreifen zu können, müssen gegebenenfalls noch Credentials angelegt werden. Der Pfad für lokale Projekte kann bei der Installation geändert werden und ist standardmäßig /var/lib/awx/projects/. Da die Anwendung aber in einem Docker Container läuft, ist es wichtig, dass der Pfad ein Docker Volume ist, da Änderungen sonst bei einem Restart des Containers verloren gehen.

 

Job Templates anlegen

Als letztes muss nur noch ein Job-Template angelegt werden. Hier wird eine Verbindung zwischen Inventory, Credentials und Playbooks hergestellt. Dazu sind einige Angaben erforderlich: ein eindeutiger Name, ein Inventory, ein Projekt und ein Playbook aus diesem Projekt. Zusätzlich muss ein Job-Type ausgewählt werden. Run führt das Playbook normal aus während Check die Syntax des Playbooks testet und Änderungen, die das Playbook machen würde, anzeigt. Dabei wird das Playbook jedoch nicht ausgeführt. Weiterhin können optionale Parameter angegeben werden, zum Beispiel auf wie vielen Hosts die Playbooks gleichzeitig ausgeführt werden sollen. Limit beschränkt das Inventory, sodass das Playbook nur auf bestimmten Gruppen ausgeführt wird. Dabei werden die Gruppen durch Pattern (weitere Infos zu Pattern unter https://docs.ansible.com/ansible-tower/2.2.0/html/userguide/job_templates.html) ausgewählt.

Abbildung 3: Job Templates


Jetzt ist AWX grundlegend konfiguriert und bereit zur Ausführung von Playbooks. Es gibt aber noch einige Features, die die Arbeit mit AWX erleichtern oder den Funktionsumfang erweitern.

Workflow Templates 

Workflows sind eine Abfolge von einzelnen Jobs, die unter definierten Bedingungen ausgeführt werden. Nach der Eingabe eines Namens und der Zuordnung zu einer Organisation, können mit dem Workflow Visualizer Jobabläufe erstellt werden. Abbildung 4 zeigt ein Beispiel eines Workflows. Als erstes nach dem Start wird Job 1 ausgeführt. Danach gibt es eine Unterscheidung: wenn Job 1 erfolgreich war (grüne Linie) wird Job 2 als nächstes ausgeführt. War Job 2 nicht erfolgreich (rote Linie), wird Job 3 als nächstes ausgeführt. Job 4 wird immer (blaue Linie) ausgeführt, unabhängig von dem Status von Job 1. Dabei kann die Verkettung von Jobs beliebig lang werden oder auch andere Workflows enthalten. Zusätzlich kann man Jobs zum synchronisieren des Projektes oder des Inventories in einen Workflow integrieren.

Abbildung 4: Workflow-Beispiel


Notifications

Notifications sind ein sinnvolles Feature von AWX. Es können automatisch Benachrichtigungen zu dem Status eines Jobs versendet werden. Zum Beispiel kann immer, wenn ein Job startet oder fehlschlägt, eine Benachrichtigung per E-Mail versendet werden. Es werden auch weitere Benachrichtigungstypen wie Slack, Grafana, HipChat und andere unterstützt. Die Benachrichtigungen enthalten detaillierte Informationen zu dem Job, wie Abbildung 5 zeigt.

Abbildung 5: Beispiel einer E-Mail Notification


REST API

AWX liefert eine REST API mit. Sie liefert Ergebnisse im JSON Format zurück und erlaubt die gesamte Steuerung und Konfiguration von AWX über die API. Man kann die API allerdings auch manuell im Browser benutzen. Unter der Adresse <IP des AWX Servers>/api/ findet sich eine Startseite der API. Klickt man in dem JSON Objekt auf /api/v2/ oder gibt dies direkt in die Adressleiste ein, kann man alle Einstellungen über die API anzeigen und ändern.

Fazit 

AWX ist die frei verfügbare Version von Ansible Tower. Mit AWX ist ein einfacher, strukturierter und organisierter Einsatz von Ansible möglich. Mit dem Benutzermanagement lassen sich Rechte strukturiert und für jeden Benutzer oder Gruppe individuell vergeben. Dank guter Dokumentation wird die Nutzung für Administratoren und Benutzer erleichtert.