Vagrant: Installation und der Weg zur ersten Entwicklungs-VM

19. September 2013 Allgemein von Eric Kubenka

Vorbei die Zeit der Ausreden von Aber bei mir ging der Code gerade noch oder Muss wohl an deiner Konfiguration liegen, sowie Hast du denn dies oder das installiert?

Mit Vagrant, einem einfachen aber wirkungsvollen Tool lassen sich in Kürze komplette virtuelle Maschinen so einrichten, dass korrekt konfiguriert, identische Entwicklungssysteme für jeden im Entwickler-Team bereitgestellt werden.

Ich gebe eine kurze Einführung für eine beispielhafte Erstkonfiguration mit laufendem Apache, sowie PHP 5 und Composer.

Was macht Vagrant

Vagrant stellt eine virtuelle Maschine bereit, welche in Kürze voll funktionsfähig aufgesetzt und gestartet werden kann. Mittels diverser Skripte lässt sich in die Initialisierung eingreifen. So können für die Entwicklung benötigte Tools einfach heruntergeladen und vorinstalliert werden. Für die Entwickler besteht also kein Bedarf mehr, selbst irgendwelche Abhängigkeiten zu suchen und zu installieren, wenn einmal eine Vagrantfile erzeugt wurde.

Darüber hinaus lässt sich die erzeugte VM mittels SSH schnell, sicher und einfach administrieren. Von Haus aus gibt es einfache Möglichkeiten geteilte Ordner (Shared Folders) zwischen Host und Gast-Systemen anzugeben. Doch dazu gleich mehr.

Und wie geht das nun?

Der Vorgang ist etwas knifflig. Daher möchte ich kurz skizzieren wie die VM später nach der Initialisierung an den Entwickler übergeben wird. Ziel ist es ein Ubuntu 12.04 LTS mit Apache-WebServer und PHP5 zu konfigurieren. Composer soll zur Arbeitserleichterung ebenfalls vorinstalliert werden.

Es ist wie folgt vorzugehen:

  1. Herunterladen von Vagrant-Setup
  2. Installation nach Anleitung
  3. Möglicherweise ein System-Neustart damit alle Änderungen erfolgreich übernommen werden

Sind diese drei Basisschritte erfolgreich durchgeführt, folgt nun die erste Konfiguration. Dazu reicht das Öffnen einer Eingabeaufforderung, beziehungsweise PowerShell, der Git-Bash oder dem Cygwin-Terminal. Was auch immer. ;)

Zum Erstellen einer VM nach einem Image, muss das Basis-Image der VM natürlich vorliegen. Also muss zuerst eine Vorlage bezogen werden. Dafür nutzte ich in diesem Beispiel die von Vagrant bereitgestellte Box unter http://files.vagrantup.com/precise32.box.

Diese kann einfach mittels folgendem Befehl zu einem lokalen Speicher auf eurem Rechner hinzugefügt werden. Mit dem Befehl wird deutlich dass für den Namen precise32 die Box von der angegebene URL bezogen werden soll.

vagrant box add precise32 http://files.vagrantup.com/precise32.box

Die Ausführung dieser Zeile führt dazu, dass die angegebene Box heruntergeladen wird und wie bereits erwähnt in einem globalen lokalen Speicher unter diesem Namen abgelegt wird. Der Name wird in naher Zukunft interessant werden.

Wenn der Download abgeschlossen ist, navigiert man in ein beliebiges Verzeichnis um mal ein wenig mit Vagrant rumzuspielen. Bei mir ist das Verzeichnis /myprroject. In diesem Verzeichnis erstellt man via Bash/Shell oder Eurem bevorzugten Tool mittels folgendem Befehl eine Vagrantfile.

vagrant init

In der beschriebenen Vagrantfile befinden sich viele auskommentiere Parameter zur einfachen Konfiguration von Netzwerkrelevanten Themen, sowie diversen Voreinstellungen. Weiterhin wird angegeben, welche Skripte nach der Initialisierung aufgerufen werden sollen. 

Um es so einfach wie möglich zu halten, kann der gesamte Inhalt gelöscht und durch folgenden ersetzt werden. Anschließend erläutere ich ein paar der Parameter.

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "precise32"

  # Url if this precise32 box doesnt exist
  config.vm.box_url = "http://files.vagrantup.com/precise32.box"

  # define, that the bootstrap.sh script will be executed on "vagrant up"
  config.vm.provision :shell, :path => "bootstrap.sh"

  # host-only-network-ip
  # config.vm.network :hostonly, "10.0.0.1"

  # forward some ports to access the vm websites
  config.vm.network :forwarded_port, host: 1337, guest: 80
end

Der Parameter config.vm.box gibt an, welche auf dem System vorhandene Box als Basis-Image dienen soll. Im vorherigen Schritt wurde eine Box unter dem namen precise32 angelegt. Diese kann nun hier verwendet werden.

Der Parameter config.vm.box_url gibt die Fallback-Url an, falls die VM noch nicht im lokalen Storage liegt, so wird sie frisch von der angegebenen Quelle bezogen.

config.vm.provision gibt mit dem hier gezeigten Beispiel an, dass das Script bootstrap.sh nach der Initialisierung aufgerufen werden soll. Die Konfiguration des Scripts zeige ich an späterer Stelle.

Die Datei bootstrap.sh muss von Euch im Projekt-Root, bei mir /myproject, angelegt werden. Oder ihr verändert den in der Vagrantfile angegebenen Pfad.

Der Clou mit der Port-Weiterleitung und dem Web-Server-Root

Der Parameter config.vm.network kann nachfolgend diverse Sachen managen. Speziell :forwarded_port dient dazu Portweiterleitungen vom Host-System auf das Gastsystem zu realisieren, damit lokale Ports nicht überschrieben werden und so beispielsweise auf Host- und Gast-System unterschiedliche Webseiten auf dem gleichen Port laufen.

Und nun zu dem angesprochenen Script bootstrap.sh, welches bei mir wie folgt aussieht um die zuvor definierten Anforderungen zu erfüllen.

#!/usr/bin/env bash

apt-get update
apt-get install -y apache2
rm -rf /var/www
ln -fs /vagrant /var/www
apt-get install -y php5
/etc/init.d/apache2 restart
apt-get install -y curl
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Wie sich wohl erkennen lässt, wird mit diesem Script Apache installiert, PHP5 in der aktuell stablien und verifizierten Version installiert, sowie Composer unter dem globalen Pfad "composer" bereitgestellt.

Der einzig unklare Puntk könnte sein, warum das /var/www-Verzeichnis gelöscht und mittels einem symbolischen Link auf /vagrant neu "angelegt" wird - Die Lösung ist ganz einfach. Der Ordner /vagrant stellt von Haus aus eine direkte Verbindung zur Außenwelt dar. Es ist also ein geteilter Ordner zwischen Eurem Host- und Gastsystem. Genauer gesagt ist /vagrant der Index-Ordner, in meinem Fall /myproject.

Diese Möglichkeit bringt den Vorteil, dass live an Code gearbeitet werden kann und dieser anschließend über den WebServer der VM aufgerufen wird. So steht jedem Entwickler eine identische VM bereit, auf welcher die Anwendung zu laufen hat. Wie bereits erwähnt: Die Ausrede Bei mir geht's zählt dann nicht mehr, da alles in einer identisch konfigurierten Umgebung getestet wird.

Platziert man nun eine Vagrantfile im Projekt-Root, so steht beim Abruf über die Versionskontrolle immer eine aktuelle Version der nötigen Abhänigkeiten zru Ausführung des Projekts bereit. Ein sauberer Weg Änderungen direkt an Mitarbeiter durchzureichen.

Start der VM - Let's the magic work

Nach diesen doch zähen Konfigurationsschritten kommt nun der spannende Teil. Die Initialisierung und der erste Start. Mittels nachstehendem Befehl lässt sich die VM starten. Wichtig dabei. Alle Ausgaben des Provision-Scripts, also der bootstrap.sh werden direkt im aktuellen Fenster ausgegeben. So wird schnell deutlich, ob ein Fehler in der bootstrap.sh vorliegt. Wenn alles erfolgreich ist, ergibt sich nachstehendes Bild.

vagrant up

Vagrant up erfolgreich

Ab die Post und Spielerei

Nun kann mittels des Befehls vagrant ssh direkt eine Verbindung zur einfachen Administration aufgebaut werden. Wenn ihr folgende Fehlermeldung seht, so haltet Euch an die angegeben Anweisungen. Ich persönlich nutze das Cygwin-Terminal, oder die Git-Bash, weshalb ich keine Probleme mit SSH hatte.

Vagrant benötigt ssh in PATH

Wenn ihr gleich noch sehen wollt, ob wirklich alles so konfiguriert wurde, dann probierts mit php -v doch einfach aus.

Falls Euch das noch nicht als Beweis reicht, so legt doch einfach mal eine index.php-Datei im Hauptverzeichnis, bei mir /myproject an und lasst einfach phpinfo() ausgeben.

Beim Aufruf von http://127.0.0.1:1337 sollte mit der oben angegeben Konfiguration nun die PHP Info Ausgabe bei Euch erscheinen. Das Port-Forwarding funktioniert also. Und auch das Mappen des Document/WebRoots hat ohne Probleme geklappt.

Fazit

Also mein Fazit fällt ganz klar positiv aus. Aufmerksam geworden bin ich auf Vagrant durch Chris Fidao (@fideloper) , welcher ständig davon schwärmte. Also habe ich mich auch mal damit auseinander gesetzt und kann seine Schwärmerei verstehen.

Mit Vagrant wird es Entwicklerteams leicht gemacht eindeutige Bedingungen zu schaffen und stets die Abhängigkeiten-Liste zu aktualisieren und gleichmäßig auszurollen. Beispielsweise soll auf eine neuere Version von PHP aktualisiert werden, so muss dies nur in der Vagrantfile angegeben werden und schon erhält jeder Member des Teams  beim nächsten vagrant up oder vagrant reload --provision eine aktualisierte PHP-Version in der VM.

Eine ausführliche Dokumentation kann über die Vagrant-Seite abgerufen werden.

Das war‘s von mir. Über Feedback und Fragen bin ich dankbar.

Zurück