Installation der Atlassian Suite mit Hilfe von Vagrant und Ansible

In diesem Blog möchte ich kurz vorstellen, wie die Installation der Produktpalette von Atlassian mit Hilfe von Vagrant, VirtualBox und Ansible automatisiert und der Zeitbedarf um 94% verringert werden kann.

Als Atlassian-Partner sind wir neben der Entwicklung von maßgeschneiderten Lösungen in Form von Plugins auch mit der Installation und Konfiguration der Anwendungen aus der Atlassian Suite beauftragt. Zur erstmaligen Installation der meist genutzten Atlassian-Produkte benötigt man laut Atlassian ungefähr viereinhalb Stunden (siehe Here Be Dragons). Für die reine Installation der Anwendungen (4 von 9 Schritten) sind in etwa zwei Stunden zu veranschlagen. Zusätzlich dazu muss das Grundsystem (hier: Ubuntu Linux 12.04) installiert und wie gewünscht konfiguriert werden, was bei einem einfachen Setup ungefähr 30 Minuten in Anspruch nimmt.

Was beinhaltet die virtuelle Maschine?

Folgenden Anwendungen sollen in der virtuellen Maschine installiert werden:

Um eine Umgebung zu schaffen, die möglichst nah an Produktiv-Umgebungen liegt greifen alle Webanwendungen auf eigens für sie erstellteMySQL-Datenbanken zu und können mit Hilfe des Apache HTTP- Servers unter verschiedenen Kontextpfaden nur verschlüsselt über HTTPS erreicht werden. Als Betriebssystem wird Ubuntu 12.04 Server eingesetzt. Um die bestmögliche Performance des Tomcat Servlet Containers (verwendet von allen Anwendungen außer Crucible) zu gewährleisten, wird die Apache Portable Runtime (APR) installiert und eingerichtet.

 

Systemvoraussetzungen

Zum Betrieb einer virtuellen Maschine mit den genannten Anwendungen empfiehlt sich mindestens folgende Konfiguration:

  • Windows 7/8/8.1 oder Linux (Kernel 3+)
  • 6 GB Arbeitsspeicher
  • 10 GB Festplattenspeicher
  • 2-Kern-Prozessor mit HyperThreading und 2 GHz oder vergleichbarer 4-Kern-Prozessor mit Intel VT-x oder AMD-V
  • Ansible (v1.8+) - benötigt PythonVagrant (v.1.6.3+) - benötigt Ruby; VirtualBox (v4.3+) und einen SSH-Client (Linux: in der Regel ist bereits OpenSSH installiert, für Windows eignet sich zum Beispiel Putty oder der GIT Client für Windows).
  • Zip des atlassiansuite Repositories


Unsere Testumgebung hat folgende Eigenschaften:

  • Ubuntu Linux 12.04 als Host
  • 12 GB RAM
  • Intel Core i7 3610QM @ 2,3 GHz
  • VDSL 50/10 MBit/s (zum Download des Ubuntu Images, der Systempakete und der Web-Anwendungen)

JIRA als Beispielanwendung

Am Beispiel von JIRA soll die Erstellung einer voll funktionsfähigen virtuellen Maschine genauer beleuchtet werden. Dies erfolgt ins zwei Teilen:

  • Download und Konfiguration der virtuellen Maschine mit Hilfe von Vagrant.
  • Provisionierung der erzeugten virtuellen Maschine unter Verwendung von Ansible.

Vagrant – Development environments made easy

Mit Vagrant lassen sich schnell und einfach virtuelle Maschinen inklusive Betriebssystem erstellen.

Gesteuert wird Vagrant mit Hilfe der zentralen Konfigurationsdatei – dem Vagrantfile, welches die Eigenschaften der virtuellen Maschine beschreibt, darunter:

  • das zu verwendende Base Image (hier: Ubuntu 12.04 Server)
  • die Netzwerkanbindung (Bridged oder NAT, hier: NAT mit Portforwarding von Port 443 (Guest) auf Port 8443 (Host))
  • der zugewiesene Arbeitsspeicher (hier: 3072 MB)
  • die Anzahl an virtuellen CPUs (hier: 2)
  • der genutzte Provisionierer (hier: Ansible)

Nachdem das Vagrantfile an unsere Bedürfnisse angepasst ist, genügt ein einfaches

vagrant up

um die virtuelle Maschine zu erstellen, zu starten und zu provisionieren. Für die Provisionierung nutzen wir Ansible, alternativ werden auch Puppet, Chef oder ähnliche Programme zur Provisionierung unterstützt.

Ansible is Simple IT Automation

Ansible ist allem voran ein Werkzeug zur Konfigurations- und Anwendungsverwaltung unter Linux. Eine Unterstützung von Windows Clients befindet sich gerade in der Entwicklung. Die größten Unterschiede zu anderen Werkzeugen wie Puppet oder Chef sind, dass Ansible aufgrund seiner Einfachheit einen schnelleren Einstieg erlaubt und außer einem SSH-Server und einer Python (2.6+)-Installation auf dem zu verwaltenden System keine weiteren Voraussetzungen hat.

Da die Control Machine von Ansible bisher nur unter Linux laufen kann, behelfen wir uns zur Ausführung unter Windows mit einem kleinen Trick, welcher durch das Skript windows.sh von Jeff Geerling umgesetzt wird. Ansible wird dadurch nicht auf dem VM-Host (Windows) mit dem Ziel der Provisionierung des Guests gestartet, sondern direkt auf dem Guest installiert und von dort ausgeführt.

Dafür werden ein zentrales Playbook, atlassian_server.yml, sowie eine Rolle zur Installation von JIRA benötigt.

#Playbook
---
- name: Install a developer server applications		# Was soll getan werden? Beschreibung des Playbooks
hosts: all						# Wer soll die Kommandos ausführen?
sudo: yes						# Wird sudo zur Privilege Separation genutzt?
roles:						# Welche Rollen sollen von den spezifizierten Maschinen übernommen werden?
- apache
- jira
- confluence
- bamboo
- stash
- crucible
- developer_tools

Details zu Playbooks in Ansible findet man hier und in den Beispielen im Ansible Projekt bei Github.

Der Verzeichnissbaum der einzelnen Rollen hat folgendes Layout:

jira
├── defaults
│ ├── main.yml			# beinhaltet Standardwerte für alle notwendigen Variablen (AJP-Port, MySQL Zugangsdaten etc.)
├── meta
│ └── main.yml			# definiert die Abhängigkeiten der Rolle, hier: MySQL, APR
├── tasks
│ └── main.yml			# beinhaltet alle Arbeitsschritte, die nötig sind, um die Installation durchzuführen
└── templates
├── jira.apache.j2			# Apache Site mit ProxyPass-Direktive
├── response.varfile.j2		# Antworten zum Betrieb des JIRA Installers im „unattended“-mode
└── server.xml.j2			# Konfigurations-Datei des mitgelieferten Apache Tomcat Servlet Containers

 

Weiterführende Details zu Rollen sind der Dokumentation von Ansible zu entnehmen.

Die Installation von JIRA läuft wie folgt ab (Inhalt der Datei roles/jira/tasks/main.yml):

  • Erstellen und Einrichten der MySQL-Datenbank
  • Herunterladen des JIRA Installers
  • Überprüfen des heruntergeladenen Installers auf Konsistenz (MD5 Summe bei JIRA, Dateigröße bei Confluence)
  • Ausführen des JIRA Installers mit den Antworten aus der response.varfile.j2, wenn JIRA nicht bereits installiert ist oder sich der Installer geändert hat (Update-Fall)
  • Setzen der Tomcat-Konfiguration (server.xml.j2)
  • Erstellen einer symbolischen Verknüpfung für den MySQL-JDBC-Connector (wird mittels der Rolle mysql installiert)
  • Neustart der JIRA-Instanz, um alle Änderungen zu übernehmen
  • Installieren & Aktivieren der Apache2-Konfiguration für JIRA

Nach erfolgreichem Abschluss der Provisionierung ist JIRA unter der Adresse https://localhost:8443/jira erreichbar und kann mit den in jira/defaults/main.yml gesetzten oder per Argument an die Rolle "jira" im Playbook atlassian_server.yml übergebenen Datenbank-Zugangsdaten installiert werden. Voraussetzung hierfür ist eine gültige Lizenz für JIRA – eine 30-tägige Test-Lizenz kann mit Hilfe einer kostenlosen Atlassian-ID generiert werden (siehe https://www.atlassian.com/licensing/purchase-licensing#evaluations-1).


Die Installation der verbleibenden Anwendungen (Confluence, Bamboo, Stash, Fisheye & Crucible) verläuft mit kleinen Anpassungen analog zu JIRA.

Ausführung & Bewertung

Herunterladen der Vagrant & Ansible Konfiguration.

Zum Starten und Provisionieren der virtuellen Maschine genügt nach dem Clone des GIT Repositories folgendes Kommando:

vagrant up

Zum Schluss der Provisionierung wird man mit folgendem Ergebnis begrüßt:

default: ok=103 changed=87 unreachable=0 failed=0 

vagrant up 13,13s user 6,08s system 2% cpu 14:10,44 total

 

Die installierten Anwendungen sind kurze Zeit später unter folgenden Kontextpfaden auf http://localhost:8080 erreichbar:

  • /jira
  • /confluence
  • /bamboo
  • /stash
  • /crucible


Die Standard-Login-Daten sind der README.md im GIT Repository zu entnehmen.

Eine SSH-Verbindung zur virtuellen Maschine kann man mit Hilfe des Kommandos vagrant ssh aufbauen.

Der Zeitbedarf von vagrant up wurde mit Hilfe des time-Kommandos ermittelt. Wie sich leicht erkennen lässt, dauert die Installation der beschriebenen Atlassian-Anwendungen auf unserem Testsystem gute 14 Minuten, was einer Zeitersparnis von 94,5 % gegenüber der manuellen Installation aller fünf Anwendungen entspricht.

Fazit

Der größte Vorteil der geskripteten Installation mit Hilfe von Vagrant und Ansible liegt unserer Meinung nach in der zeitnahen Erstellung von Entwicklungsumgebungen, welche, bei gleichzeitigem Einsatz von Ansible im Produktivbetrieb, 1:1 der Produktivumgebung entsprechen und somit die Wahrscheinlichkeit von Plattform-bedingten Fehlern (z.B. Test unter Windows mit HSQL, Produktivbetrieb unter Linux mit MySQL) verringern und die Zeit bis zum erfolgreichen Ausliefern von Software verkürzen. Entwickler können damit einfach und in kurzer Zeit Testumgebungen selbst erstellen, die im Idealfall zu 100 % den Produktivumgebungen entsprechen.

Ausblick

Im Hinblick auf unsere Angebote im Bereich Continuous Delivery lässt sich die vorgestellte Methode so anpassen, dass neue Vagrant- und Ansible-Konfigurationen beim Push in ein zentrales GIT Repository automatisch von Bamboo getestet und gebaut werden. Um dieses Ziel zu erreichen, ist es allerdings notwendig, von VirtualBox als Virtual Machine Provider für Ansible auf Docker oder ähnliche Container-basierte Ansätze ( z.B. LXC) umzusteigen, wenn man die genutzte Instanz von Bamboo ebenfalls in einer virtuellen Maschine (erstellt mit Vagrant & Ansible) betreiben möchte.