Vagrant

Vagrant is een box configuratie, een computer setup, aangestuurd door een enkel bestand, de Vagrantfile. In andere woorden, een Vagrantfile bevat de eigenschappen van een machine, en Vagrant zorgt voor de installatie van die (virtuele) machine met zijn eigenschappen. Hierdoor kun je makkelijk setup’s delen, en zodoende allemaal in identieke omgevingen werken.

Maar hoe simpel het ook klinkt, er gaat altijd iets mis. Dus deze blog, om de stappen even door te lopen.

Installeer Virtualbox en Vagrant als dit nog niet gebeurd is. Zoek daarna een box uit op de [Vagrant website][1]. Die kun je starten via init, bijvoorbeeld een Ubuntu 16.04, die versie noemen ze xenial.

vagrant init ubuntu/xenial64

Wat Vagrant nu doet is de box downloaden en opstarten. De plek waar je de init uitvoerd is normaal gesproken in de root van een git project. De Vagrantfile deel je. En wat je ziet op deze locatie is een net aangemaakte Vagrantfile, dit is het configuratiebestand dat we naar wens aan gaan passen.

De plek waar je de init hebt gedaan is ook de gedeelde locatie of de shared folder. Deze plek zie je in de machine onder /vagrant. Ik kom hier zo nog even op terug.

Eerst wat aanpassingen om de omgeving geschikt te maken. Aanpassingen doe je in de config, en de eerste configuratie, de box, heeft Vagrant al voor je neergezet:

Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/xenial64"
    # etc
end

Wat ik vaak doe is port forwarding, waarbij je eigen PC de host is, en de Vagrant box de guest.

# web draait op 80
config.vm.network "forwarded_port", guest: 80, host: 8080
# eventueel extra poorten
config.vm.network "forwarded_port", guest: 8080, host: 8082

De IP van de box kun je vastzetten:

config.vm.network "private_network", ip: "192.168.33.10"

En je kunt aanpassingen specifiek op de provider – in dit geval Virtualbox – doen:

config.vm.provider "virtualbox" do |vb|
    # Wil je een GUI? Dan true, anders heb je alleen SSH
    # vb.gui = true
    # Hoeveel geheugen
    vb.memory = "1024"
end

Nu kun je de machine nog verder bijwerken. Software installeren bijvoorbeeld, zodat je zeker weet dat iedereen op dezelfde versies van alle tools werkt. Als je weet hoe je deployment omgeving eruit ziet kun je dat hier namaken.

Je kan de commands doorgeven via een extern script:

config.vm.provision :shell, :path => ".provisioning/setup.sh"

Dat setup.sh bestand ziet er dan bijvoorbeeld zo uit:

#!/usr/bin/env bash
apt-get update
apt-get install -y apache2

Of via inline script zoals bijvoorbeeld:

config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y apache2
SHELL

Voor ik verder ga met wat provisioning tips, eerst even de standaard commando’s voor Vagrant:

Opstarten, afsluiten en herstarten van de box doe je via:

vagrant up
vagrant halt
vagrant reload

Opnieuw opstarten met nieuwe provisioning, voor als er wijzigingen in de Vagrantfile zijn geweest:

vagrant reload --provision

Als er scripts of commando’s zijn die bij iedere up of reload uitgevoerd moeten worden dan kan je dit aangeven met de run always parameter: