zurück zum Artikel

VMs mit Vagrant erstellen

Golo Roden

Virtuelle Maschinen haben lÀngst Einzug in den Alltag von Administratoren gehalten. Auch Entwickler können von ihrem Einsatz profitieren. Vagrant setzt an, das Erstellen und Provisionieren von virtuellen Maschinen zu vereinfachen und zu beschleunigen.

VMs mit Vagrant erstellen

Virtuelle Maschinen haben lÀngst Einzug in den Alltag von Administratoren gehalten. Auch Entwickler können von ihrem Einsatz profitieren: Eine standardisierte und im Team einheitliche Entwicklungs- und Testumgebung ist Gold wert. Vagrant setzt an, das Erstellen und Provisionieren von virtuellen Maschinen zu vereinfachen und zu beschleunigen.

Das Erstellen einer virtuellen Maschine (VM) beginnt unabhĂ€ngig von der gewĂ€hlten Software stets mit den gleichen Schritten: Zuerst spezifiziert man die Hardware, wĂ€hlt beispielsweise die Anzahl der Prozessoren aus und legt die GrĂ¶ĂŸe des Arbeitsspeichers sowie der angeschlossenen DatentrĂ€ger fest. Danach erfolgt die Installation des gewĂŒnschten Betriebssystems.

Der Prozess benötigt in der Regel zwar kaum Eingriffe des Anwenders, nimmt allerdings jede Menge Zeit in Anspruch: Je nach Betriebssystem kann das Aufsetzen durchaus zwischen einer halben und zwei Stunden dauern. Anschließend verfĂŒgt man zwar ĂŒber ein startbares Grundsystem, allerdings ist noch keinerlei zusĂ€tzliche Software vorhanden.

Sie hinzuzufĂŒgen geht in der Regel relativ rasch, da die Pakete im Vergleich zum Betriebssystem eher kompakt sind. Allerdings gilt es, auf die Versionen zu achten und zahlreiche AbhĂ€ngigkeiten aufzulösen. Diese Aufgabe ist lĂ€stig und durchaus fehleranfĂ€llig. Zudem fehlt die Garantie, dass die virtuellen Maschinen der einzelnen Teammitglieder identisch konfiguriert sind.

Das quelloffene Projekt Vagrant will die erwÀhnten Probleme auf elegante Weise lösen. Im Prinzip handelt es sich bei Vagrant um ein Werkzeug, das Software zur Virtualisierung wie VirtualBox oder VMware fernsteuern kann. Auf dem Weg ermöglicht es das automatisierte Erstellen von virtuellen Maschinen an Hand einer zuvor erzeugten Konfigurationsdatei.

Da Vagrant zudem auf vorbereitete Abbilder hĂ€ufig verwendeter Betriebssysteme zurĂŒckgreift, lĂ€sst sich die Installation drastisch beschleunigen: Statt sie jedes Mal von Grund auf durchzufĂŒhren, ist lediglich das passende Abbild herunterzuladen und zu kopieren.

Um das Werkzeug nutzen zu können, muss man es zunĂ€chst auf dem lokalen System installieren. Passende BinĂ€rpakete fĂŒr gĂ€ngige Plattformen wie OS X, Linux und Windows lassen sich von der Produktwebseite [1] herunterladen.

StandardmĂ€ĂŸig greift Vagrant auf die Software VirtualBox zurĂŒck, weshalb man sie zuvor gegebenenfalls gesondert installieren muss. Dabei ist zu beachten, dass nicht jede Version mit jeder Vagrant-Variante kompatibel ist. Sollten sie inkompatibel sein, erscheint beim Start jedoch ein entsprechender Hinweis und eine Liste der unterstĂŒtzten Versionen.

Die einzelnen Informationen zu einer virtuellen Maschine verwaltet Vagrant in einer Konfigurationsdatei namens Vagrantfile, die in Ruby zu verfassen ist. Ruft man Vagrant mit dem Parameter init auf, erzeugt es eine Konfigurationsdatei als Vorlage:

$ vagrant init

Das Kommando kann man bedenkenlos in einem bereits bestehenden Verzeichnis aufrufen, um ein Projekt im Nachhinein mit UnterstĂŒtzung fĂŒr Vagrant auszustatten.

Da die Datei Vagrantfile die Konfigurationseinstellungen fĂŒr die zugehörige virtuelle Maschine enthĂ€lt, ist es sinnvoll, sie der Versionsverwaltung hinzuzufĂŒgen: So lĂ€sst sich die virtuelle Maschine stets wiederherstellen – trotzdem ist in der Versionsverwaltung nur wenig Speicherplatz belegt, da nur die Konfigurationsdatei zu verwalten ist.

FĂŒr sie gibt es allerdings zwei unterschiedliche Formate, die von der verwendeten Version von Vagrant abhĂ€ngen: Format 1 wurde in Version 1.0 eingefĂŒhrt, Format 2 in Version 1.1. Alle seither erschienenen Releases unterstĂŒtzen prinzipiell beide Formate. Zweiteres ist allerdings noch nicht endgĂŒltig definiert, sodass es bei dessen Verwendung gegebenenfalls zu InkompatibilitĂ€ten zwischen unterschiedlichen Versionen von Vagrant kommen kann.

Um nun an Hand von Vagrantfile eine neue virtuelle Maschine zu erstellen, benötigt man zunĂ€chst ein Betriebssystemabbild. Eine Auswahl steht zum direkten Download auf der Webseite von Vagrant zur VerfĂŒgung, alternativ gilt die darauf spezialisierte Webseite Vagrantbox.es [2] als erste Anlaufstelle.

Zur lokalen Installation eines Betriebssystemabbilds dient der Parameter add, der einen Bezeichner und die Download-URL erwartet. Der Bezeichner lĂ€sst sich frei wĂ€hlen. Der Übersichtlichkeit halber ist es allerdings sinnvoll, sich am Namen des Abbilds zu orientieren. Ubuntu 12.04.3 LTS "Precise Pangolin [3]" lĂ€sst
sich beispielsweise wie folgt herunterladen und bereitstellen:

$ vagrant add precise64 http://files.vagrantup.com/precise64.box

LĂ€dt man Betriebssystemabbilder nicht von der offiziellen Vagrant-Webseite herunter, sollte man stets ĂŒberprĂŒfen, ob die jeweilige Quelle vertrauenswĂŒrdig ist: Schließlich können vorgefertigte Abbilder prinzipiell Viren oder sonstigen Schadcode enthalten.

Um ein Abbild zu verwenden, muss man es in der Datei Vagrantfile hinterlegen:

Vagrant.configure("2") do |config|
config.vm.box = "precise64"
end

Diesen Schritt stets von Hand vornehmen zu mĂŒssen, wĂ€re lĂ€stig. Daher ermöglicht Vagrant beim Aufruf der init-Option die Angabe eines Abbildnamens und optional sogar der Abbildadresse, was den manuellen Aufruf von add erspart:

$ vagrant init precise64 http://files.vagrantup.com/precise64.box

Besonders praktisch ist, dass Vagrant in diesem Fall auch die Download-Adresse in Vagrantfile hinterlegt, sodass es in der Lage ist, sie bei Bedarf automatisch herunterzuladen:

Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end

Im einfachsten Fall ist das bereits alles, was fĂŒr das Erzeugen und Starten einer virtuellen Maschine erforderlich ist: Ruft man auf der Konsole nun das Kommando

$ vagrant up

auf, legt Vagrant ein Unterverzeichnis namens .vagrant an, erzeugt darin die gewĂŒnschte virtuelle Maschine und startet sie anschließend. Bei Bedarf lĂ€dt es das benötigte Abbild zuvor von der in Vagrantfile angegebenen URL herunter. Da sich das Verzeichnis .vagrant und dessen Inhalt jederzeit durch das AusfĂŒhren des Kommandos vagrant up wiederherstellen lassen, kann man es von der
Versionsverwaltung ausschließen.

Im Normalfall gibt das Programm nach kurzer Zeit die Meldung

[default] Machine booted and ready!

aus, was bedeutet, dass die virtuelle Maschine erfolgreich erstellt und gestartet werden konnte. Auf manchen Systemen bricht der Vorgang jedoch mit einer Fehlermeldung ab, die besagt, dass sich die virtuelle Maschine in einem ungĂŒltigen Zustand befindet:

The guest machine entered an invalid state while 
waiting for it to boot. [...]

Die Meldung ist in der Regel auf ein Problem mit der Virtualisierung der Hardware zurĂŒckzufĂŒhren und lĂ€sst sich durch das Abschalten dieser beheben. Dazu muss man die Datei Vagrantfile um einen neuen Konfigurationsabschnitt ergĂ€nzen, in dem man Einstellungen fĂŒr VirtualBox vornehmen kann:

Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"

config.vm.provider :virtualbox do |vb|
vb.customize [ "modifyvm", :id, "--hwvirtex", "off" ]
end
end

In dem Abschnitt ist es zudem möglich, unter anderem die Anzahl der Prozessoren und die Menge des Arbeitsspeichers fĂŒr die virtuelle Maschine vorzugeben: Dazu sind die zwei folgenden Zeilen erforderlich, wobei die Parameter wunschgemĂ€ĂŸ anzupassen sind.

Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"

config.vm.provider :virtualbox do |vb|
vb.customize [ "modifyvm", :id, "--hwvirtex", "off" ]
vb.customize [ "modifyvm", :id, "--cpus", 2 ]
vb.customize [ "modifyvm", :id, "--memory", 2048 ]
end
end

Danach ist es ratsam, das Verzeichnis .vagrant samt Inhalt zu löschen und das Kommando vagrant up erneut auszufĂŒhren. Außer der Meldung, dass die virtuelle Maschine gestartet wurde, sieht man von ihr zunĂ€chst nichts. Um zu ĂŒberprĂŒfen, ob sie wirklich lĂ€uft, genĂŒgt es, das Kommando

$ vagrant status

auf der Konsole auszufĂŒhren. Es meldet als Status wie erwartet running und gibt zudem einige Hinweise aus, wie man die virtuelle Maschine wieder beenden kann: Das Kommando

$ vagrant halt

fÀhrt die virtuelle Maschine herunter,

$ vagrant suspend

friert sie hingegen ein. Den jeweiligen Status kann man danach auf dem nun bekannten Weg abfragen. Um eine Maschine erneut zu starten, genĂŒgt es, das Kommando vagrant up abermals auszufĂŒhren.

Gelegentlich gelingt es Vagrant nicht, eine virtuelle Maschine beim Aufruf von vagrant halt sauber herunterzufahren. In dem Fall kann man das Herunterfahren mit dem zusÀtzlichen Parameter --force erzwingen.

Benötigt man eine virtuelle Maschine nicht lÀnger, lÀsst sie sich mit dem Kommando

$ vagrant destroy

entfernen. Bei Bedarf wird sie zuvor angehalten. Auch hier lĂ€sst sich optional der Parameter --force ĂŒbergeben.

FĂŒr den Zugriff auf die virtuelle Maschine leitet Vagrant den Port 22 auf den Port 2222 des Wirtsystems weiter, sodass sich eine SSH-Verbindung herstellen lĂ€sst. Um den Benutzernamen und den Port nicht stets von Hand eingeben zu mĂŒssen, steht zudem ein Kommando zur VerfĂŒgung, das die Anmeldung automatisch vornimmt:

$ vagrant ssh 

Wenn die Verbindung zur virtuellen Maschine hergestellt ist, kann man sie ohne EinschrĂ€nkungen verwenden und fĂŒr die weitere Arbeit konfigurieren. Das Verzeichnis des Wirtsystems, das die Datei Vagrantfile enthĂ€lt, bindet Vagrant in der virtuellen Maschine als Pfad /vagrant ein. Damit ist ein einfacher Austausch von Dateien zwischen Wirt und Gast möglich.

Unter UmstĂ€nden kann es hilfreich sein, weitere Ordner des Wirts in der virtuellen Maschine zur VerfĂŒgung zu stellen. Dieses Feature bezeichnet Vagrant als "Shared Folders". Ihre Konfiguration erfolgt in Vagrantfile, wobei pro Verzeichnis ein weiterer Eintrag erforderlich ist:

Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"

config.vm.synced_folder "./foo", "/foo"

config.vm.provider :virtualbox do |vb|
vb.customize [ "modifyvm", :id, "--hwvirtex", "off" ]
end
end

Die synced_folder-Konfigurationseinstellung nimmt dabei zwei Parameter entgegen: Den Pfad des zu teilenden Verzeichnisses auf dem Wirt und den Pfad, unter dem das Verzeichnis in der virtuellen Maschine einzubinden ist.

Ausgesprochen praktisch sind geteilte Verzeichnisse fĂŒr Softwareentwickler: Sie können die darin enthaltenen Datei wie gewohnt auf dem Wirtssystem mit dem Editor oder der integrierten Entwicklungsumgebung ihrer Wahl bearbeiten. Nach dem Speichern stehen die Dateien sofort in der virtuellen Maschine bereit, wo sie sich beispielsweise von einem Webserver ausliefern lassen.

Damit man auf einen Webserver in der virtuellen Maschine zugreifen kann, muss man jedoch noch zwei Anpassungen vornehmen: Zum einen benötigt die virtuelle Maschine eine IP-Adresse, ĂŒber die sie sich mit dem Netzwerk verbinden lĂ€sst, zum anderen muss der benötigte Port fĂŒr den Zugriff von Außen freigegeben sein.

FĂŒr die Netzwerkkonfiguration unterstĂŒtzt Vagrant drei Modi: Das Weiterleiten von Ports sowie "Host Only"- und "Bridged"-Netzwerke. Die einfachste Lösung besteht im Weiterleiten von Ports. Hierbei ordnet das Tool der virtuellen Maschine keine von Außen zugĂ€ngliche IP-Adresse zu, stattdessen werden lediglich interne Ports auf Ports des Wirts abgebildet. Dieses Vorgehen verwendet Vagrant serienmĂ€ĂŸig beispielsweise bei der Abbildung des SSH-Ports 22 auf den Port 2222 des Wirts.

NatĂŒrlich verfĂŒgt die virtuelle Maschine intern dennoch ĂŒber eine eigene IP-Adresse. Sie lĂ€sst sich mit der Datei Vagrantfile konfigurieren. Es genĂŒgt, ihr die folgende Zeile hinzuzufĂŒgen und die gewĂŒnschte IP-Adresse zu hinterlegen:

config.vm.network :private_network, ip: "192.168.33.100"

Um darĂŒber hinaus eine Portweiterleitung zu konfigurieren, muss man die folgende Zeile hinzufĂŒgen und die Ports nach Bedarf anpassen:

config.vm.network :forwarded_port, guest: 3000, host: 3000

Falls der Port 3000 auf dem Wirt bereits anderweitig Verwendung findet, meldet Vagrant beim Start der virtuellen Maschine einen Konflikt. Optional kann man es anweisen, letzteren automatisch aufzulösen, indem es eigenstĂ€ndig einen anderen Port auswĂ€hlt. Dazu muss man zusĂ€tzlich die Option auto_correct ĂŒbergeben und ihr den Wert true zuweisen:

config.vm.network :forwarded_port, guest: 3000,
host: 3000, auto_correct: true

SerienmĂ€ĂŸig sucht Vagrant im Fall des Falles dann nach einem freien Port zwischen 2200 und 2250. Auch diesen Bereich kann man bei Bedarf innerhalb des Vagrantfile konfigurieren:

config.vm.usable_port_range = (2200..2250)

Außerdem gilt es zu beachten, dass das Programm lediglich das TCP-Protokoll weiterleitet, nicht jedoch UDP. Will man letzteres ebenfalls aktivieren, muss man der Portweiterleitung zusĂ€tzlich den Parameter protocol ĂŒbergeben und ihm den Wert udp zuweisen:

config.vm.network :forwarded_port, guest: 3000, 
host: 3000, protocol: "udp"

Sofern man auf dem gleichen Port sowohl TCP als auch UDP verwendet, ist die Portweiterleitung zweifach zu konfigurieren: einmal ohne und einmal mit dem protocol-Parameter.

Nachteilig an der Portweiterleitung ist, dass man jeden erforderlichen Port einzeln auflisten muss und sie anschließend im ganzen Netzwerk unter der IP des Wirtsystems erreichbar sind.

Als Alternative bietet sich daher ein "Host Only"-Netzwerk an, das abgesehen von der virtuellen Maschine ausschließlich fĂŒr den Wirt zugĂ€nglich ist. Damit ist die VM vor dem wahllosen Zugriff von Außen geschĂŒtzt. Essenziell bei dem Verfahren ist, dass man zwingend eine IP-Adresse vorgeben muss – andernfalls ließe sich nicht auf die Maschine zugreifen:

config.vm.network :hostonly, ip: "192.168.33.100"

Innerhalb der virtuellen Maschine steht der Wirt stets unter der IP-Adresse zur VerfĂŒgung, die lediglich im letzten Block abweicht und dort eine 1 aufweist, im angegebenen Beispiel also 192.168.33.1.

Verwendet man Vagrant, um mehrere VMs gleichzeitig zu starten, können sie bei einem "Host Only"-Netzwerk ĂŒber ihre jeweiligen IP-Adressen untereinander kommunizieren – beim reinen Weiterleiten von Ports ist das nicht möglich.

Das grĂ¶ĂŸte Problem bei diesem Vorgehen besteht darin, dass Vagrant Kenntnisse ĂŒber das virtualisierte Betriebssystem besitzen muss, um das Netzwerk richtig aufsetzen zu können. Die Variante bietet sich folglich nicht in jedem Fall an.

Zu guter Letzt besteht als dritte Herangehensweise die Option, auf ein "Bridged"-Netzwerk zurĂŒckzugreifen. Dabei wird die virtuelle Maschine als eigenstĂ€ndiger Teilnehmer im Netzwerk des Wirts gemeldet. Die Konfiguration erfolgt, Ă€hnlich wie zuvor, durch die Angabe der folgenden Zeile:

config.vm.network :bridged

Das Verfahren ist ausgesprochen praktisch, weist allerdings einen gravierenden Nachteil auf: Vagrant unterstĂŒtzt in diesem Modus keine statischen IP-Adressen, sodass man nach dem Start der virtuellen Maschine zunĂ€chst eine SSH-Verbindung per vagrant ssh herstellen muss, um danach ihre IP-Adresse ermitteln zu können.

Alle vorgestellten Modi und Netzwerktypen unterstĂŒtzt Vagrant gleichzeitig: Es ist folglich ohne Weiteres möglich, Ports weiterzuleiten und darĂŒber hinaus ein eigenes Netzwerk mit dem Wirt zu betreiben. Die einzige EinschrĂ€nkung ist, dass Ports stets ĂŒber den ersten Netzwerkadapter des Wirts weitergeleitet werden.

Ausgesprochen hilfreich ist die FĂ€higkeit von Vagrant, mit einer einzigen Vagrantfile-Datei mehrere virtuelle Maschinen zu verwalten. Dazu muss man die Konfigurationsdatei lediglich in weitere Abschnitte unterteilen und den einzelnen Maschinen passende Namen zuordnen:

Vagrant.configure("2") do |config|
config.vm.define("web") do |web|
web.vm.box = "precise64"
web.vm.box_url = "http://files.vagrantup.com/precise64.box"
[...]
end

config.vm.define("database") do |database|
database.vm.box = "precise64"
database.vm.box_url = "http://files.vagrantup.com/precise64.box"
[...]
end
end

FĂŒhrt man das Kommando vagrant up aus, startet das Programm alle konfigurierten virtuellen Maschinen gleichzeitig. Das Gleiche gilt fĂŒr die ĂŒbrigen Kommandos. Möchte man ein Kommando explizit nur auf eine einzige virtuelle Maschine beziehen, muss man zusĂ€tzlich deren Namen angeben:

$ vagrant up web

Besonders interessant in dem Szenario sind die zuvor besprochenen Netzwerkmodi "Host Only" und "Bridged", die das Zusammenspiel mehrerer virtueller Maschinen ermöglichen.

HÀufig bedarf es jedoch nicht nur eines nackten Betriebssystems ohne zusÀtzliche installierte Anwendungen: In den vorangegangenen Beispielen war bereits von einem Webserver die Rede. Allerdings sind auch andere Dienste wie Datenbanken naheliegend.

NatĂŒrlich möchte man nicht nach jedem Neuaufsetzen einer virtuellen Maschine sĂ€mtliche Anwendungssoftware von Hand nachinstallieren mĂŒssen. Das wĂ€re nicht nur lĂ€stig, sondern der durch Vagrant angezielten Einheitlichkeit innerhalb eines Teams abtrĂ€glich: Zwar hĂ€tte dann jede VM ein gleich aufgesetztes Betriebssystem, sonst aber nichts.

Abhilfe schafft Vagrant durch die Möglichkeit, eine virtuelle Maschine automatisiert zu provisionieren, das heißt, sie mit einer vorgegebenen Menge von Anwendungssoftware zu bestĂŒcken und geeignet zu konfigurieren. Als einfachste Option bietet sich der Einsatz eines Shell-Skripts an, das sich bei Vagrant wahlweise in der Konfigurationsdatei oder extern ablegen lĂ€sst. Alternativ unterstĂŒtzt es die dedizierten Konfigurationsverwaltungswerkzeuge Puppet, Chef, Ansible und Salt. Seit der im Dezember 2013 veröffentlichten Version 1.4.0 kann Vagrant darĂŒber hinaus automatisch Docker in der virtuellen Maschine installieren und passende Abbilder herunterladen und starten.

FĂŒr die integrierte Angabe eines Shell-Skripts genĂŒgt es, Vagrantfile die folgende Zeile hinzuzufĂŒgen:

config.vm.provision :shell, :inline => "echo Hallo Vagrant!"

An Stelle des echo-Kommandos lĂ€sst sich jeder beliebige andere Aufruf angeben. Es liegt allerdings auf der Hand, dass solch ein Vorgehen höchstens dazu geeignet ist, beispielsweise – im Falle eines "Bridged"-Netzwerks – die eigene IP-Adresse auszugeben, oder bestenfalls ein externes Shell-Skript zu starten.

Dabei sind allerdings die Benutzerrechte zu beachten, weshalb in der Regel ein Aufruf via sudo sinnvoll ist:

config.vm.provision :shell, :inline => "sudo -iu vagrant
bash -c './vagrant/provision.sh'"

Es zeigt sich, dass dieses Vorgehen rasch unĂŒbersichtlich wird. Daher gibt es zwei Alternativen, wie man mit dem Aufruf eines Shell-Skripts umgehen kann. Zum Einen kann man ein externes Skript starten, indem man an Stelle von :inline den Parameter :path verwendet und ihm den Pfad zum auszufĂŒhrenden Skript ĂŒbergibt. Besonders praktisch ist, dass Vagrant das Skript in dem Fall automatisch mit sudo ausfĂŒhrt und der Pfad nicht nur auf das Dateisystem verweisen, sondern auch eine URL enthalten kann, von der Vagrant das Skript zunĂ€chst herunterladen soll:

config.vm.provision :shell, :path => "https://www.example.com/provision.sh"

Zum Anderen kann man das auszufĂŒhrende Shell-Skript in die Konfigurationsdatei von Vagrant einbetten, und in der genannten Zeile darauf verweisen. Dazu ist prinzipiell eine Konfigurationsdatei nach folgendem Aufbau von Nöten:

$script = <<SCRIPT
echo "Hallo Vagrant!"
[...]
SCRIPT

Vagrant.configure("2") do |config|
[...]
config.vm.provision :shell, :inline $script
end

Analog zu dem Parameter :shell gibt es die Werte :puppet, :puppet_server, :chef_solo, :chef_client, :ansible, :salt und :docker. Mit ihnen ist eine deutlich komplexere Einrichtung und Konfiguration der virtuellen Maschine möglich. Praktischerweise unterstĂŒtzt Vagrant zudem die Option, innerhalb einer Vagrantfile-Datei mehrere Provisionierungswege anzugeben, die sich dann nacheinander in der Reihenfolge ihres Auftretens abarbeiten lassen.

Im Gegensatz zu frĂŒheren Versionen von Vagrant fĂŒhren die modernen Versionen die Provisionierung nicht mehr bei jedem Lauf des Kommandos vagrant up aus, sondern nur noch direkt nach dem Erstellen der virtuellen Maschine. Das verkĂŒrzt nicht nur deren Startzeit im normalen Betrieb, sondern erspart Shell-Skripten auch die Aufgabe, zu prĂŒfen, ob sie bereits ausgefĂŒhrt wurden.

Bei Bedarf kann man die Provisionierung jedoch durch die Angabe des Parameters --provision beim Aufruf von vagrant up erzwingen. Verwendet man stattdessen --provision-with, kann man zudem eine Art der Provisionierung angeben, um beispielsweise nur die Konfiguration von Puppet durchfĂŒhren zu
lassen:

$ vagrant up --provision-with puppet

In der Regel genĂŒgt der Ansatz, die Konfiguration der virtuellen Maschine ĂŒber Puppet, Chef & Co. durchzufĂŒhren. Gelegentlich kann es aber auch interessant sein, auf der Basis eines bestehenden ein neues Betriebssystemabbild zu erzeugen, das bereits fertig installierte und konfigurierte Anwendungssoftware enthĂ€lt.

GlĂŒcklicherweise ist das Vorgehen in Vagrant hierfĂŒr ausgesprochen einfach: ZunĂ€chst erstellt man auf dem bereits bekannten Weg eine neue virtuelle Maschine, stellt per SSH eine Verbindung her und fĂŒhrt sĂ€mtliche Installations- und Konfigurationsschritte aus, die fĂŒr das neue Abbild erforderlich sind.

Anschließend fĂŒhrt man das Kommando

$ vagrant package

aus. Als Ergebnis erzeugt Vagrant eine Datei namens package.box in einem temporĂ€ren Verzeichnis, das das neue Betriebssystemabbild enthĂ€lt. Letzteres lĂ€sst sich anschließend mit vagrant init beziehungsweise vagrant add verwenden.

GenĂŒgt ein vorhandenes Abbild nicht, kann man auch ein eigenes von Grund auf erstellen. Das ist jedoch deutlich aufwĂ€ndiger, da unter anderem einige Vorgaben bezĂŒglich der verwendeten Benutzer, Rechte und SSH-Konfiguration einzuhalten sind. Eine ausfĂŒhrliche Anleitung liefert Ryan Skoblenick in seinem Blogeintrag "Creating a Custom Vagrant Box from Scratch [4]".

Generell sollte man sich allerdings zunĂ€chst die Frage stellen, ob das Erzeugen eines komplett neuen Abbilds den Aufwand wirklich wert ist, oder ob das Anpassen eines bestehenden nicht den gleichen Zweck erfĂŒllt.

Um die Funktionen von Vagrant zu erweitern, kann man auf Plug-ins zurĂŒckgreifen. Deren Installation ist denkbar einfach: Es genĂŒgt, das folgende Kommando auf der Konsole aufzurufen:

$ vagrant plugin install <plugin-name>

Eine Liste aller installierten Plug-ins erhÀlt man, indem man das Kommando

$ vagrant plugin list

aufruft. Benötigt man eines nicht mehr, kann man es mit

$ vagrant plugin uninstall <plugin-name>

wieder entfernen. FĂŒr den Einsatz von Plug-ins gelten dabei prinzipiell die gleichen Sicherheitsbedenken wie fĂŒr den Einsatz von Abbildern unbekannter oder nicht vertrauenswĂŒrdiger Herkunft: Sie können SicherheitslĂŒcken enthalten oder die StabilitĂ€t von Vagrant beeintrĂ€chtigen. Daher sollte man sie nicht wahllos einsetzen.

Nachteilig ist, dass Vagrant Plug-ins derzeit nur global installieren kann und nicht fĂŒr ausgewĂ€hlte virtuelle Maschinen: Somit ist ein Plug-in entweder stets oder nie aktiv. Das mag fĂŒr die meisten zu verschmerzen sein, kann allerdings schnell lĂ€stig werden.

Ein ausgesprochen hilfreiches Plug-in, das man (fast) jeder Installation bedenkenlos hinzufĂŒgen kann, ist vagrant-vbguest, das die in der virtuellen Maschine installierten VirtualBox Guest Additions mit der Version von VirtualBox synchronisiert [5].

Die Installation erfolgt auf dem bereits erwÀhnten Weg:

$ vagrant plugin install vagrant-vbguest

SelbstverstĂ€ndlich ist es zudem möglich, eigene Plug-ins zu entwickeln. Eine Beschreibung der hierfĂŒr notwendigen Schritte findet sich in der Vagrant-Dokumentation [6].

Zu guter Letzt sei noch darauf hingewiesen, dass Vagrant außer VirtualBox auch andere Software zur Virtualisierung fernsteuern kann. Zu Beginn dieses Artikels wurde bereits VMware erwĂ€hnt: HierfĂŒr ist jedoch ein Plug-in erforderlich, das man auf der entsprechenden Webseite [7] kostenpflichtig herunterladen kann. Abgesehen davon, dass man fĂŒr den Einsatz mit VMware andere Betriebssystemabbilder benötigt, unterscheidet sich der Arbeitsablauf nicht von dem auf Basis von VirtualBox: Kommandos wie vagrant up und vagrant ssh gelten gleichermaßen.

DarĂŒber hinaus gibt es noch weitere Plug-ins, die Vagrant mit anderen Plattformen verbinden: Das vom Autor von Vagrant, Mitchell Hashimoto, entwickelte vagrant-aws [8] dient beispielsweise dem automatisierten Verwalten und Provisionieren von virtuellen Maschinen auf Basis von Amazons EC2-Cloud. Ähnliche Plug-ins gibt es fĂŒr zahlreiche andere Cloud-Plattformen wie Joyent, OpenStack oder Rackspace. Eine vollstĂ€ndige Liste findet sich in einer Übersicht des Projekts [9].

Vagrant stellt eine enorme Vereinfachung fĂŒr Entwickler dar, die regelmĂ€ĂŸig virtuelle Maschinen erstellen und provisionieren mĂŒssen. Es erleichtert nicht nur die Arbeit, sondern stellt insbesondere die Reproduzierbarkeit des Ergebnisses sicher. Dies kommt in besonderem Maße Teams zu Gute.

Da die gesamte Konfiguration in einer kompakten Datei erfolgt, lĂ€sst sie sich leicht mit einer Versionsverwaltung kontrollieren und verteilen ohne zugleich viel Speicherplatz im zentralen Repository zu verschwenden. SelbstverstĂ€ndlich fĂ€llt zunĂ€chst der Aufwand an, eine virtuelle Maschine vorzubereiten und die Konfiguration der Provisionierung vorzunehmen: Das mag zwar lĂ€stig sein, wĂ€re aber ohne Vagrant ebenfalls erforderlich. Der Einsatz des Tools reduziert die Notwendigkeit fĂŒr diesen Schritt aber auf ein einziges Mal, danach lĂ€sst sich eine virtuelle Maschine auf Tastendruck erstellen und stets gleich konfigurieren und provisionieren.

Abschließend kann man festhalten, dass Vagrant in die Werkzeugsammlung eines jeden Softwareentwicklers gehört und insbesondere Teams gut beraten sind, einen nĂ€heren Blick zu wagen. Der hierzu nötige Aufwand kann sich in kurzer Zeit auszahlen.

Golo Roden
ist GrĂŒnder der "the native web UG", eines auf native Webtechniken spezialisierten Unternehmens. FĂŒr die Entwicklung moderner Webanwendungen bevorzugt er JavaScript und Node.js und hat mit "Node.js & Co." das erste deutschsprachige Buch zum Thema geschrieben.
(jul [10])


URL dieses Artikels:
https://www.heise.de/-2066800

Links in diesem Artikel:
[1] http://www.vagrantup.com/
[2] http://www.vagrantbox.es/
[3] http://releases.ubuntu.com/precise/
[4] http://www.skoblenick.com/vagrant/creating-a-custom-box-from-scratch/
[5] https://github.com/dotless-de/vagrant-vbguest
[6] http://docs.vagrantup.com/v2/plugins/development-basics.html
[7] http://www.vagrantup.com/vmware
[8] https://github.com/mitchellh/vagrant-aws
[9] https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins
[10] mailto:jul@heise.de