"Also bei mir funktioniert's!" – die alte Ausrede bei defekten Produkten sollte unter Software-Entwicklern spätestens mit der Erfindung virtueller Maschinen ausgedient haben. Denn auf einer nackten, virtuellen Distribution lassen sich prima ganze Softwaresuiten reproduzierbar installieren, um vorher zu testen, ob das Gesamtsystem später beim Kunden funktioniert oder nicht.
Um diese Tests zu automatisieren, benötigt der Entwickler ein Kommandozeilentool zum Hochfahren der virtuellen Maschine, ein Einrichtungstool zum Installieren der Applikationspakete und ihrer Abhängigkeiten sowie ein Skript zum Anwerfen der Testsuite. Oft erstrecken sich Applikationen über mehrere Instanzen – wie bei einem Client, der zu einem Webserver Kontakt aufnimmt, der wiederum eine Datenbankinstanz nutzt.
Geschäftiger Vagabund
Das Tool Vagrant [2] definiert die in einem Softwareprojekt genutzten virtuellen Maschinen per Konfigurationsdatei, die das Entwicklungsteam versioniert und neben dem Sourcecode im Projekt-Repository mitführt. Vagrant nutzt als Virtualisierer das kostenlose Virtualbox [3], das auf Linux, Mac OS X und Windows läuft (Abbildung 1) und noch mehr Betriebssysteme als Gäste virtualisiert. Vagrant richtet die VMs in so genannten Boxes so her, dass in ihnen ein SSH-Daemon läuft und ein User namens »vagrant«
Sudo-Rechte besitzt (Abbildung 2).
So startet die Sequenz »vagrant up«
(oder »vagrant ssh«
) eine vorher von einem Distributionsserver wie Vagrantbox.es heruntergeladene Box als VM und wechselt auf der Kommandozeile in sie hinein. Um Softwarepakete automatisch einzurichten und Konfigurationsdateien anzupassen, stehen Softwareprovision-Tools wie Puppet [4], Chef [5] und Saltstack [6] bereit. Diese laden Distributionspakete vom Repositoryserver, installieren sie, lösen Abhängigkeiten auf, stellen rollenspezifische Konfigurationen ein, starten Services und halten sie am Laufen.
Abbildung 1: Vagrant und Virtualbox: Wer wollte nicht schon einmal auf einem Macbook mit einem Aufruf von der Kommandozeile in ein 64-Bit-Ubuntu wechseln?
Abbildung 2: Auf Vagrantbox.es stehen alle gängigen Linux-Distributionen als Vagrant-Boxes zum Download bereit.
Puppet als Innenarchitekt
Das Kommando »vagrant init«
in einem frisch angelegten Verzeichnis im Hostsystem legt eine Datei namens »VagrantFile«
an, die außer einer langen Liste von auskommentierten Optionen nur den Ruby-Code
Vagrant::Config.run do |config|
config.vm.box = "base"
end
enthält. Das anschließend abgesetzte Kommando »vagrant box add ...«
ersetzt in der angegebenen Datei den Wert für »base«
für die neu angelegte Box (»precise32«
in Listing 1) und lädt die Box vom Webserver an der angegebenen URL. Unterstützt die heruntergeladene VM-Box ein Einrichtungstool wie Puppet, Chef oder Saltstack, darf das Vagrant-File die Konfiguration der VM diesem überlassen. Listing 1 verweist zum Beispiel auf:
Damit erwartet Vagrant in der Datei »manifests/default.pp«
unter dem Vagrant-Verzeichnis eine Puppet-Konfigurationsdatei nach Art von Listing 2. Abbildung 3 zeigt das Datei-Layout im Hostsystem, das im Source-Control-Repository des Entwicklungsteams liegt.
1 Vagrant::Config.run do |config|
2
3 # 32-bit Ubuntu Box
4 config.vm.box = "precise32"
5
6 # provision with Puppet
7 config.vm.provision :puppet
8 end
config.vm.provision :puppet
01 # Basic Puppet Mojo manifest
02
03 class mojo {
04 exec { 'apt-get update':
05 command => '/usr/bin/apt-get update'
06 }
07
08 package { "libmojolicious-perl":
09 ensure => present
10 }
11
12 file { '/usr/bin/mymojo':
13 ensure => link,
14 target => "/vagrant/mymojo",
15 force => true
16 }
17 }
18
19 include mojo
Abbildung 3: Diese Dateien in der Sourcecode-Verwaltung bestimmen Parameter und Inventar der Vagrant-VM.
Abbildung 4: In wenigen Schritten ist eine virtuelle Maschine unter Ubuntu Precise (32 Bit) mit Vagrant und Virtualbox installiert.