Whoops. Ein Produktlaunch und ein paar Tage fiese Erkältung später, und der letzte Beitrag hier ist schon drei Wochen vorbei. Sorry. :)
Nach dem eher allgemeinen Teil 1 und Teil 2 zu Chef nun endlich zum spannenden Teil: Wie nutzt man den Kram eigentlich?
Wie auch die Entwicklung einer Webapp startet diese Frage bei der Entwicklungsumgebung. In den meisten Projekten, in denen ich bislang meine Nase hatte, gab es meist einen von zwei Ansätzen für die Entwicklungsumgebung: Entweder gab es ein Image für eine Virtualisierungsumgebung, das herumkopiert worde, oder es wurde direkt auf der Host-Maschine ein mehr oder weniger klassischer LAMP-Stack installiert, konfiguriert, und damit entwickelt. Ein gern gesehener Gast hier war zum Beispiel XAMPP.
Mit Chef haben wir nun den Vorteil, dass das Setup der Server jederzeit gescripted reproduziert werden kann – und genau das nutzen wir auch für unsere Entwicklungsumgebung. Mit Vagrant kann vollautomatisch eine Instanz in Virtualbox initialisiert und installiert werden. Damit kann jederzeit mit drei Befehlen eine neue VM aufgesetzt werden, die im Setup und Konfiguration sehr ähnlich zur Live-Umgebung ist. Vagrant existiert für Linux, Windows, OSX und Solaris.
Vagrant ist sehr einfach zu installieren: Zunächst muss Virtualbox installiert werden. Virtualbox ist die eigentliche virtuelle Umgebung, in der der virtuelle Server später ausgeführt wird. Ebenfalls gebraucht wird ruby – aber ich gehe mal davon aus dass jeder Entwickler das sowieso auf seinem Server schon sauber konfiguriert hat ;) Anschliessend wird vagrant mit “gem install vagrant” installiert – alternativ kann vagrant auch mit Installationspaketen installiert werden, mehr dazu auf der Vagrant-Website.
Die Konfiguration der VM von Vagrant wird in einer Datei Vagrantfile festgelegt. Unsere Konfiguration bei Digital Pioneers sieht in etwa so aus:
Mit dieser Datei lässt sich eigentlich der Server auch schon direkt mit vagrant up starten und aufsetzen. Wichtig sind hier allerdings einige Pfade, die entsprechend angepasst werden müssen:
chef.cookbooks_path ist der Pfad zu den Chef-Cookbooks, die von Vagrant ausgeführt werden sollen. Ausserdem werden zwei Verzeichnisse mit der Host-Maschine geteilt: webdev ist relativ logisch: In diesem Mount befindet sich der Code der App, die wir entwickeln. aptcache ist dagegen ein “Hack” – die von Ubuntu heruntergeladenen Pakete werden dadurch auf der Host-Maschine gespeichert. Damit müssen bei einem zweiten Aufsetzen der Virtuellen Maschine nicht erneut alle Pakete heruntergeladen werden, sondern werden direkt aus dem Cache installiert. Bonustipp: In dem Verzeichnis muss sich das (leere) Verzeichnis “partial” befinden, sonst fällt apt auf die Nase.
Durch das Portforwarding kann dann mit einem Zugriff auf http://localhost:8080 der Webserver der virtuellen Maschine erreicht werden.
Vagrant ist relativ selbsterklärend, und auch gut erklärt – vor den ersten Schritten mit Vagrant lohnt es sich aber trotzdem, den “Getting started”-Teil der Doku von Vagrant querzulesen, da hier die wichtigsten Kommandos vorgestellt werden.
Im Entwicklungsalltag bei uns hat sich gezeigt, dass Vagrant zwar durchaus seine Ecken und Kanten hat: Insbesondere die Datei-Mounts, über die Daten zwischen Hostmaschine und der VM geteilt werden können ziemlich zickig sein. Auch fehlt beispielsweise ein sinnvolles Vagrant-Plugin, mit dem direkt von aussen verschiedene Shell-Kommandos in der VM ausgeführt werden können, wie etwa Unittests oder die Generierung von Sass-Assets.
Allerdings sind die Vorteile von Vagrant klar überwiegend: Mit Vagrant können wir mit wenigen Kommandos die Entwicklungsumgebung wieder auf den ursprünglichen Zustand zurücksetzen, das Setup der Entwicklungsumgebung und der produktiven Server wird parallel vorangetrieben, und die Einführung in ein neues Projekt ist sehr viel weniger aufwendig.
