Vagrant box Update: Vagrantfile

Auteur Twisted Bytes op 14 Februari 2017

De Twisted Bytes Vagrant box wordt inmiddels door een behoorlijk aantal personen en bedrijven gebruikt. Daar zijn we heel erg blij mee. We krijgen er ook feedback van terug. Dat zorgt ervoor dat we af en toe wat aanpassingen doen.

In de afgelopen maanden hebben we aanpassingen gedaan die meestal 1-op-1 gedeeld zijn met de gebruikers. Tijdens een congres in Ljubljana in Slovenië zijn een paar van die nieuwe features getoond. Al met al is het tijd om het algemeen bekend te maken.

We splitsen de update op in een aantal losse blogs. En dat zijn de volgende:

  • New Vagrantfile
  • Vagrant plugins
  • PHP versie switch
  • MySQL database backup en restore
  • Windows Installatie

Dit is de eerste van de serie.

Voor de meeste functionaliteit is het nodig om laatste versie van onze box te gebruiken. Ten tijde van het schrijven is dat 0.3.11. De blog over onze directory structuur is nog steeds relevant.

We hebben sinds onze vorige blog over Vagrant wat aanpassingen gedaan aan de Vagrantfile die we zelf gebruiken. Die is veranderd doordat we zelf meer en meer gebruik zijn gaan maken van Vagrant en vragen van gebruikers en klanten hadden.

Nieuwe Vagrantfile

Dit is onze nieuwe Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# -- config section
node_domain  = 'example.com'
node_name    = 'twistedbytes-site'.concat('.' + node_domain)
node_aliases = ['twistedbytes-site1', 'twistedbytes-site2'].map{|s| s.concat('.' + node_domain)}
# node_aliases = [].map{|s| s.concat('.' + node_domain)}
node_ip      = "192.168.50.100"
node_cpus    = 1
node_memory  = 1024
# -- end config section

Vagrant.configure(2) do |config|
    # -- hostmanager section
    # vagrant plugin install vagrant-hostmanager
    if Vagrant.has_plugin?("vagrant-hostmanager")
        config.hostmanager.enabled = true
        config.hostmanager.manage_host = true
        config.hostmanager.manage_guest = true
        config.hostmanager.ignore_private_ip = false
        config.hostmanager.include_offline = false
    end
    # -- end hostmanager section

    config.vm.define node_name do |node|
        # -- box setup
        node.vm.box = "twistedbytes/webserver"
        node.vm.hostname = node_name
        node.vm.provider "virtualbox" do |v|
            v.linked_clone = true if Gem::Version.new(::Vagrant::VERSION) > Gem::Version.new('1.8')
            v.name   = node_name
            v.memory = node_memory
            v.cpus   = node_cpus
        end

        if Vagrant.has_plugin?("vagrant-hostmanager")
            if !node_aliases.empty?
                node.hostmanager.aliases = node_aliases
            end
        end

        # -- box setup

        # -- network section
        node.vm.network "private_network", ip: node_ip
        # Create a forwarded port mapping which allows access to a specific port
        node.vm.network "forwarded_port", guest: 80,   host: 8080, host_ip: '127.0.0.1', auto_correct: true
        node.vm.network "forwarded_port", guest: 3306, host: 3306, host_ip: '127.0.0.1', auto_correct: true
        # for mailcatcher
        node.vm.network "forwarded_port", guest: 1080, host: 1080, host_ip: '127.0.0.1', auto_correct: true
        # -- end network section

        # -- synced folders section
        node.vm.synced_folder "docroot",          "/data/site/docroot",   create: true, owner: 'defaultsite', group: 'defaultsite'
        node.vm.synced_folder "config",           "/data/config",         create: true, owner: 'defaultsite', group: 'defaultsite'
        node.vm.synced_folder "other/logs",       "/data/logs",           create: true, owner: 'defaultsite', group: 'defaultsite'
        node.vm.synced_folder "other/private",    "/data/private",        create: true, owner: 'defaultsite', group: 'defaultsite'
        node.vm.synced_folder "other/pma-upload", "/opt/pma-upload-save", create: true, owner: 'nobody', group: 'nobody'
        # -- end synced folders section

        # -- provisioning section
        node.vm.provision "shell", run: 'always', inline: '/usr/local/bin/autorun.sh'

        # -- provisioning section

    end
end

Wat direct opvalt is dat hij groter is dan de oude. De reden is extra functionaliteit waarmee het gebruik van de box en eventueel meerdere boxen parallel gebruiken eenvoudiger gaat. Door het gebruik van de nieuwe “linked_clone” feature van Vagrant 1.8+ is er minder schijfruimte nodig wanneer een box meerdere keren gebruikt wordt en nieuwe worden sneller gemaakt. We lopen door de config heen om het uit te leggen.

Configuratie

Het eerste onderdeel is de configuratie. Dit is normaal gesproken het enige dat aangepast moet worden om de file voor een project te gaan gebruiken. Dit is de configuratie van de box:

  • Domein naam
  • Hostnaam
  • Eventuele aliassen voor de hostnaam
  • Het IP
  • Aantal CPU’s
  • Aantal MB geheugen

Hier zijn 3 opties die niet aanwezig waren in de oude configuratie. De domeinnaam, hostnaam en eventuele aliases. Door deze opties wordt het mogelijk om de box een hostnaam te geven. Daardoor is hij duidelijker terug te vinden in de grafische interface van Virtualbox en als de “hostmanager” vagrant plugin is geïnstalleerd kan de box via http://hostnaam.domeinnaam/ benaderd worden in plaats van via http://localhost:8080/. De installatie van de extra plugins wordt in blogpost X uitgelegd.

De IP optie set het IP van de box. Let op dat je bij meerdere actieve boxen deze per box anders instelt. Eenvoudigste is gewoon een nummer boven het huidige gebruiken. Dus 192.168.50.100 wordt dan 192.168.50.101. Dit IP nummer moet wel in de 192.168.50.XXX range zitten omdat de PHP xdebug daar vanuit gaat.

De cpus en memory opties geven de box meer cpu en geheugen.

De rest van het bestand bestaat uit de “bekende” configuratie die gebruik maakt van de eerder genoemde variabelen.

Box setup

De eerste sectie is het definiëren van de basis informatie van deze box. Hier worden de eerder genoemde variabelen gebruikt om de box te configureren.

De mogelijkheden die een bepaalde versie van Vagrant of de hostmanager plugin nodig hebben worden zijn optioneel gemaakt.

Hostmanager

De stukken “hostmanager section” stelt de host en de box in om via een hostname bij de box te kunnen. Meer info in Blogpost X.

Network

Het stuk “network section” configureert het IP en een aantal poort-mappings naar de localhost. De forwarded_port staan er nog in ivm sommige mensen die nog gebruiken, maar doordat de box nu ook bereikbaar is via een hostname is het eenvoudiger om die te gebruiken in plaats de localhost links. Bijvoorbeeld: http://twistedbytes-site.example.com:1080/ voor de mailcatcher.

Synced folders

Het stuk synced folders is de definitie van locale mappen die in de box gebruikt kunnen worden.

  • Docroot is de docroot van de site. Eventueel kan daar site -> /data/site gebruikt worden met een docroot directory in de site. Dan kun je ook bestanden die buiten de docroot staan in de box gebruiken. Voor Laravel is dit nodig.
  • Config is een nieuwe directory. Deze wordt gebruikt om configuratie van de box voor dit project in op te kunnen slaan. Een voorbeeld is de versie van PHP. In een volgende blog gaan we daar verder op in.
  • Other/logs is voor de logs van de webserver en php
  • Other/private is voor private data en voor wat functies. Hier is ook wat aan aangepast. Ook dat wordt in een volgend blog uitgelegd.
  • Other/pma-upload is voor het laden en wegschrijven van database dumps via phpMyAdmin
Tags: , ,