Vagrant met shell provisioning
Vagrant, Bash | February 03, 2015
Dit artikel is geschreven voor Intracto en verscheen voor het eerst op de Intracto blog op Februari 3, 2015.
Vagrant maakt het mogelijk om automatisch virtuele machines aan te maken, te configureren en reproduceren. Die virtuele machines kunnen van verschillende types zijn, zoals bijvoorbeeld VirtualBox.
Het grote voordeel van het werken met Vagrant is dat je je developmentomgeving identiek kan maken aan productie. Op deze manier kan een developer werken op een omgeving met dezelfde PHP-versie/MySQL/OS versie.. Als het project moeilijk op te zetten packages nodig heeft, worden deze nu automatisch geïnstalleerd en moet de developer zich hier geen zorgen over maken.
Hoe Intracto met Vagrant werkt
De sysadmins van Intracto voorzien de lege basis "boxen", daar gebruiken we VeeWee voor. Vagrant downloadt de box de eerste keer eerst van het netwerk en kent er IP-adres(sen), CPU's, memory etc. aan toe. Dit kan je zelf configureren in het bestand "Vagrantfile". Daarna start Vagrant de provisioning en kan je de box gebruiken:
Vagrant start de vm (virtual machine) zonder GUI (vb: VirtualBox), je kan ook dit configureren in de "Vagrantfile".
Drive mapping
In de "Vagrantfile" staat ook de VirtualBox drive mapping. De directory /vagrant in het guest-systeem is dezelfde als de directory waar je "Vagrantfile" zich op je host systeem bevindt. Zo kan je coderen op het host-systeem en is de code automatisch up-to-date in de guest. Deze mapping gebeurt voor elk besturingssysteem op een andere manier:
- NFS op Linux en Mac.
- Op Windows werkt dit via VirtualBox shared folders en is dit onwerkbaar traag. Voor Windows zijn er wel workarounds (rsync-auto, NFS for Windows, ...)
Het is dus duidelijk dat de drive mapping in Linux en Mac superieur is ;-)
Provisioning
Provisioning is het installeren van alle software (PHP / Apache / MySQL) in de box. Er bestaan enkele provisioning oplossingen (Puppet, Chef, Ansible). Deze zijn vooral interessant om meerdere productiesystemen mee te onderhouden, maar betekenen toch een beetje overkill voor Vagrant. Bovendien is er een leercurve en hebben die provisioners ook altijd hun dependencies en quirks.
Bij Intracto gebruiken we shell provisioning voor Vagrant. In de map "shell_provisioning" bevindt zich een script run.sh dat de dependencies zal installeren. Deze dependencies zijn shell scripts in de "module" folder en worden in volgorde uitgevoerd. Als er configuratie nodig is zal deze zich in de "config" folder bevinden.
Je zet de commando's die je normaal ook zou intypen om iets te installeren gewoon in een module shell script. Dit wordt dan uitgevoerd bij "vagrant up".
Wat zit er in?
Vagrant zit automatisch in al onze projecten en is altijd volledig geoptimaliseerd voor onze Drupal- en Symfonyprojecten. Er is dan ook steeds een basis LAMP stack aanwezig.
PhpMyAdmin is bereikbaar op /phpmyadmin, Roundcube webmail is bereikbaar op /roundcube. Alle mails die verstuurd worden op het systeem worden onderschept en in de Roundcube webmail afgeleverd. Zo kan je niet per ongeluk testmails naar echte klanten sturen.
We hebben een Intracto BitBucket repository waar je extra modules kan downloaden, zoals bijvoorbeeld Tomcat / Solr, IP tables, Memcache, Gearman, node.js, ...
Uitbreiden
Om te testen of de provisioning volledig goed werkt zal je een "vagrant destroy && vagrant up" moeten uitvoeren, we hebben namelijk geen updatefunctionaliteit. Dat is een beetje jammer maar eigenlijk ook gewenst. Een Vagrant box mag geen eigen leven leiden dus is het niet erg om deze eens opnieuw te bouwen. Bovendien duurt dat maar een paar minuutjes en ben je zeker dat een clean setup werkt.
Conclusie
Vagrant is een goed alternatief voor de klassieke WAMPP / XAMPP / MAMPP setups. Je kan snel automatisch een project opzetten zonder zelf packages en services te moeten configureren. Shell provisioning is eenvoudig, maar keep it simple, zeker if you ain't gonna need advanced features.