Bis in die letzte Konsequenz angewendet bedeutet Infrastructure as Code, dass man in der Lage ist, die eigene Umgebung aus dem Regelwerk, Computing-Resourcen und einem Backup wieder in genau den Zustand zu überführen, den sie haben soll. Und dies soll nicht nur für die Grundkonfiguration einer Maschine gelten, sondern auch für angebotene Dienste. Im Umkehrschluss bedeutet dies aber natürlich auch, dass man bei der Entwicklung des eigenen Puppet- oder Chef-Regelwerks eine möglichst realistische Grundlage für die Entwicklung verwenden sollte - also am besten “auf der leeren Wiese” anfangen. Die Technik im Jahr 2013 macht uns das ganze recht einfach, in dem sie uns diverse Virtualisierungstechniken abietet, mit denen wir jederzeit neue Server erzeugen und dann für die Entwicklung von Code verwenden können.

Eine Lösung, die sich hier besonders hervor tut, ist Vagrant. Dieses Tool spielt für uns das Frontend zu diversen Virtualisierungstechniken, u.a. VirtualBox, vMware und LXC. Was es so gut macht ist seine Fähigkeit, den Code-Gedanken einen Schritt weiter zu führen als andere Lösungen das tun: Bei Vagrant ist bereits die Erstellung von neuen virtuellen Maschinen programmatisch gelöst, inklusive deren Konfiguration mit Portforwarding, initialem Provisioning mittels Puppet oder Chef sowie der Fähigkeit, Dateien zwischen der VM und dem Gastsystem auszutauschen. Damit das ganze funktioniert, benötigt man mindestes zwei Dinge:

  1. Das Vagrantfile. Dieses beschreibt, wie die virtuellen Maschinen aussehen sollen, also z.B. die Anzahl und Art der Netzwerkkarten, den Typ der verwendeten CM-Software etc.
  2. Ein Image der zu verwendenen virtuellen Maschine(n).

Diese Abbilder der Maschinen werden auch als base boxes bezeichnet. Ihr Erstellung ist ausführlich dokumentiert, kann allerdings ein recht zeitaufwändiger Prozess sein. Doch auch hierfür gibt es eine automatisierte Lösung, nämlich Veewee. Dieses Tool ist in der Lage, für diverse Virtualisierungs-Provider automatisiert Images zu erstellen, welche dann z.B. eben auch mit Vagrant weiter verwendet werden können. Unter Debian verfügt man, wenn man mehr oder weniger bei der derzeit stabilen Distribution “wheezy” bleiben will, zwar leider nicht über die neueste Version von Vagrant und auch nicht über eine bereits paketierte Version von Veewee, allerdings sind dies IMHO keine allzu großen Einschränkungen: Die mitgelieferte Vagrant-Version funktioniert mit der ebenfalls mitgelieferten Version von VirtualBox einwandfrei, und wer die “Verunreinigung” des eigenen Systems mit Ruby-Gems etc. im Laufe der Installation von Veewee fürchtet, der kann es so halten wie ich und für die Installation z.B. mittels debootstrap eine chroot-Umgebung aufbauen.

ie Installation von Veewee ist relativ einfach:

1
2
3
apt-get install ruby ruby-dev build-essential libxslt1-dev libxml2-dev libzip-ruby1.9.1 zlib1g-dev
gem install fog
gem install veewee

Dummerweise liefert einem das nicht die aktuellste Version von Veewee (da sind die wheezy-Dependencies einfach schon zu alt), was aber kein wirklicher Beinbruch ist, denn alles was wir benötigen, sind aktualisierte Maschinen-Definitionen, und für die reicht es aus, sich Upstream zu klonen und alle Veewee-Aufrufe aus diesem Verzeichnis heraus auszuführen:

1
2
git clone https://github.com/jedi4ever/veewee
cd veewee

Nun kann man sich, vollkommen automatisiert, z.B. Images für das jeweils aktuellste CentOS 6 sowie Debian/wheezy bauen lassen und diese danach in eine Vagrant-Base-Box überführen:

1
2
3
4
5
6
7
8
9
veewee vbox define 'wheezy64' 'Debian-7.1.0-amd64-netboot'
veewee vbox build 'wheezy64'
veewee vbox halt wheezy64
vagrant package --base wheezy64 --output wheezy64.box

veewee vbox define 'centos6-64' 'CentOS-6.4-x86_64-minimal'
veewee vbox build 'centos6-64'
veewee vbox halt centos6-64
vagrant package --base centos6-64 --output centos6-64.box

Danach liegen die .box-Dateien im veewee-Verzeichnis. Eine Liste der verfügbaren Definitionen erhält man mit dem Kommando veewee vbox templates (und hier sieht man dann auch einen Unterschied, je nachdem, ob man im geklonten Upstream-Verzeichnis ist oder nicht). Der Zusatz “minimal” bzw. “netinstall/netboot” bezieht sich auf das verwendete Installations-Image. Wer sich das ganze übrigens nicht selber antun will findet Boxen, aktuell von heute, für CentOS und wheezy hier.

Ich verabschiede mich zu den Klängen von Liszt, Rhapsodie über ein Thema von Paganini, Op. 43. Euch ein schönes Wochenende.