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

<span class=“n”>config</span><span class=“p”>.</span><span class=“nf”>vm</span><span class=“p”>.</span><span class=“nf”>provision</span> <span class=“s2”>“shell”</span><span class=“p”>,</span> <span class=“ss”>inline: </span><span class=“s2”>“echo hello world”</span><span class=“p”>,</span>
    <span class=“ss”>run: </span><span class=“s2”>“always”</span>

Je kan altijd in de box via SSH:

vagrant ssh

Belangrijk om te weten is de shared folder, /vagrant. Als je kijkt naar de inhoud van die directory via ls /vagrant dan zie je dat deze identiek is aan de directory waar je de init hebt gedaan. Met exit verlaat je de box.

Sommige mensen vinden het prettig om in de box te werken, dus met een IDE in een box waarbij de GUI aanstaat. Dat kan, maar persoonlijk werk ik altijd in de shared folder op mijn eigen PC. Alle wijzigingen worden direct met de box gedeeld en je kun via de port forwarding je resultaat makkelijk zien. In het eerdere voorbeeld zie je een website via localhost:8080.

Het Setup script

Je kan via bash je hele box aanpassen. Je moet soms alleen wel even weten hoe je dat het beste kunt doen. Zo moet je bijvoorbeeld soms feedback op vragen geven. Bij een apt-get update bijvoorbeeld, of een install, daar moet je een Y(es) geven. Dat kun je met de -y flag doen, die stond al in het eerdere voorbeeld.

apt-get install -y apache2

Zo kun je een extra ppa toevoegen, in dit geval voor Java, en vervolgens een update/upgrade doen:

add-apt-repository ppa:webupd8team/java
apt-get update
apt-get -y upgrade

Moet je andere feedback geven dan kun je dat via debconf doen. Oracle wil dat je de license accepteerd. De drie regels hieronder geven eerst twee opdrachten voor de debconf aan die via de derde opdracht naar voren komen.

echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections 
echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections
apt-get -y install oracle-java8-installer

Zo kun je ook een wachtwoord voor MySql setten:

debconf-set-selections <<< 'mysql-server mysql-server/root_password password CorrectHorseBatteryStaple'
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password CorrectHorseBatteryStaple'
apt-get -y install mysql-server

Bij webdevelopment maak je vaak gebruik van de /var/www directory. Deze kun je linken aan de /vagrant directory:

# schoonmaken
sudo rm -rf /var/www

# en symlink /var/www naar /vagrant
ln -s /vagrant /var/www

De standaard Apache conf staat hier al op gericht, dus als je een index pagina in de gedeelde map hebt staan dan zou je je website al kunnen zien op localhost:8080.

En als laatste; bij iedere wijziging, vergeet niet te provisionen:

vagrant reload --provision