Aus Linux-Magazin 05/2013

Perl steuert Virtualbox

© french_03, photocase.com

Das Paket Vagrant (Vagabund) verwaltet mit Virtualbox als Hypervisor virtuelle Maschinen einfach von der Kommandozeile aus. Der Entwickler kann seinen Kunden, die einfach mal in ein Produkt hineinschnuppern wollen, fertig installierte Umgebungen mitgeben.

“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 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.

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.

Listing 1

VagrantFile

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

Listing 2

default.pp

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 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.

Abbildung 4: In wenigen Schritten ist eine virtuelle Maschine unter Ubuntu Precise (32 Bit) mit Vagrant und Virtualbox installiert.

Puppets tanzen

Ein »vagrant up« fährt nicht nur die virtuelle Maschine der Box hoch, sondern wirft auch den Puppet-Client an. Dessen Konfigurationsdatei in Listing 2 definiert eine Klasse »mojo« , die zuerst den Packagemanager-Index mit »apt-get update« aktualisiert. Die »package« -Anweisung in Zeile 8 zieht das CPAN-Modul Mojolicious herein, das in Debian-Derivaten als »libmojolicious-perl« -Paket vorliegt. Die »ensure« -Anweisung stellt sicher, dass das Paket installiert ist und löst »apt-get install« aus, falls es fehlt. Das ebenfalls benötigte Perl-Core-Paket bringt Ubuntu zum Glück bereits mit.

Die Anweisung »file« in Zeile 12 legt in der VM einen Link unter »/usr/bin/mymojo« an, der auf das gleichnamige Perl-Skript unter »/vagrant/mymojo« zeigt. Das Verzeichnis »/vagrant« bindet Vagrant praktischerweise an das Vagrant-Verzeichnis im Hostsystem. Deshalb kann der User in seinem Source-Control-Repository einfach Skripte einchecken, die dann in hochgefahrenen VMs erscheinen. Statt die virtuelle Maschine mit »reload« neu zu starten, um neue Puppet-Parameter auszuprobieren, darf der User während der Testphase im Gastsystem auch einfach das Kommando

puppet apply /vagrant/manifests/defaut.pp

aufrufen und Puppet damit bewegen, die virtuelle Maschine einzurichten.

Der Webserver

Listing 3 definiert einen simplen Webserver Marke Eigenbau, der auf dem CPAN-Modul Mojolicious::Lite aufbaut. Auf jeden eintrudelnden »GET« -Request antwortet er mit dem Namen des Users, der ihn hochgefahren hat. Die Funktion »getpwuid()« nimmt die effektive UID des Skripts »$>« entgegen und liefert in skalarem Kontext den Usernamen zurück. Die Methode »render()« schickt den ihr überreichten Text an den anfragenden Webclient.

Der Entwickler legt das Skript im Vagrant-Verzeichnis auf dem Hostsystem ab und startet dann in einer mit »vagrant ssh« neu geöffneten VM-Session die Applikation mit »/usr/bin/mymojo daemon« . Der Webserver in Listing 3 beantwortet daraufhin alle »GET« -Anfragen, indem er den Unix-User ausgibt, der das Skript gestartet hatte. In der Vagrant-Session ist dies »vagrant« :

$ vagrant ssh
vagrant@precise64:~$ curl http://localhost:3000
I am vagrant

Beachtet sein will auch, dass der Webserver sich an einen lokalen Port innerhalb der VM bindet, denn vom Hostsystem und dem angrenzenden Netzwerk aus ist er nicht erreichbar. Um dies zu erlauben, braucht Virtualbox die so genannten Guest Additions, die etwas mehr Installationsaufwand erfordern.

Listing 3

mymojo

01 #!/usr/bin/perl -w
02 use strict;
03 use Mojolicious::Lite;
04
05 get '/' => sub {
06   my $self = shift;
07
08   my $user = getpwuid( $> );
09
10   $self->render( text =>
11     "I am $user\n" );
12 };
13
14 app->start;

Einrichter können mehr

Einrichtungstools (Provision Tools) leisten weit mehr als hier gezeigt. Sie übernehmen mittels auf Community-Ebene ausgetauschter Module gängige Sysadmin-Aufgaben, wie den Webserver Apache mit SSL hochfahren und am Leben halten oder MySQL konfigurieren und starten. So braucht nicht jeder Sysadmin das Rad neu zu erfinden und klickt sich getestete und in der Produktion bewährte Bausteine zusammen.

Wer viele solcher Nodes in Serverfarmen verwaltet, überträgt die Verantwortung einem Masterserver, der Heerscharen von Endnodes verwaltet. Dabei helfen die Manualseiten von Puppet, Chef und dem ambitionierten Neuling Saltstack [6].

Installation

Um die Kombination aus Vagrant und Virtualbox auf den eigenen PC zu kriegen, holt sich der Benutzer zunächst von [3] das passende Virtualbox-Paket ab und installiert es gemäß den Instruktionen für die verwendete Linux-Distribution. Auch für das in Ruby geschriebene Vagrant stehen fertige Pakete für eine ganze Reihe gängiger Linuxe auf [2] bereit, die zu installieren ein Klacks ist. Sucht man dann auf Vagrantbox.es die URL für eine Vagrant-Box der gewünschten zu simulierenden Linux-Distribution heraus, führen die Schritte in Abbildung 4 – dort am Beispiel von Ubuntu Precise (32 Bit) – zum Ziel.

Die plattformübergreifende Definition von virtuellen Maschinen mit ebenfalls polyglotten Anweisungen für Einrichtungstools versetzt Entwickler in die Lage, ihre Testumgebungen auf Knopfdruck hochzufahren. Das Ganze basiert allein auf Informationen, die in der versionierten Sourcecode-Verwaltung stecken. Da man modifizierte Vagrant-Boxen ohne viel Aufwand wieder in neue Boxen eintüten kann, lässt sich ein fast fertiges Produkt auch schnell zum Kunden schicken, der es nach dem standardisierten Verfahren auf vielerlei Hostplattformen einfach ausprobiert.

Infos

  1. Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2013/05/Perl
  2. Vagrant: http://www.vagrantup.com
  3. Virtualbox: https://www.virtualbox.org/wiki/Downloads
  4. G. Wrobel, “Konfigurationsverwaltung mit Puppet”: Linux-Magazin 10/08, S. 70
  5. Chef: http://www.opscode.com/chef/
  6. Saltstack: http://saltstack.com

Der Autor

Michael Schilli arbeitet als Software-Engineer bei Yahoo in Sunnyvale, Kalifornien. In seiner seit 1997 laufenden Kolumne forscht er nach praktischen Anwendungen der Skriptsprache Perl. Unter mailto:mschilli@perlmeister.com beantwortet er gerne Fragen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 3 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben