Vagrant: ambienti di sviluppo riproducibili con un Vagrantfile

Vagrant 1.x (2012-2013) di Mitchell Hashimoto: wrapper su VirtualBox/VMware/AWS per ambienti di sviluppo virtualizzati configurabili con un Vagrantfile, provisioning integrato con Puppet/Chef/Ansible. Il seme di HashiCorp.

Open SourceWebR&D VagrantHashiCorpVirtualBoxDev EnvironmentRubyOpen Source

“It works on my machine”

Uno dei problemi operativi ricorrenti nello sviluppo software è l’assicurare che l’ambiente di sviluppo sia ripetibile tra i membri di un team e allineato con la produzione. La frustrazione storica — “funziona sulla mia macchina, non capisco perché non giri sulla tua” — nasce dalla combinazione di versioni diverse di compilatori, librerie, servizi di rete, sistemi operativi.

Vagrant — creato da Mitchell Hashimoto nel 2010, rilasciato in versione 1.0 nel marzo 2012 e attivamente sviluppato verso la 1.2 al momento di scrivere — risponde a questo problema con un’idea semplice: l’ambiente di sviluppo è una macchina virtuale riproducibile, descritta come codice.

L’architettura

Un progetto Vagrant ha un file Vagrantfile in Ruby DSL nella sua root:

Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/precise64"
    config.vm.network :private_network, ip: "192.168.33.10"
    config.vm.synced_folder ".", "/vagrant"

    config.vm.provision :shell, path: "setup.sh"
    # oppure: config.vm.provision :puppet do |puppet| ...
end

Con vagrant up da riga di comando, Vagrant:

  1. Scarica un box base (immagine VM preconfezionata) se non locale
  2. Provisiona una nuova VM con le caratteristiche dichiarate (CPU, RAM, rete, cartelle condivise)
  3. Esegue il provisioner — shell script, Puppet, Chef, Ansible, Salt — per configurarla
  4. Rende la VM disponibile via vagrant ssh, vagrant reload, vagrant halt, vagrant destroy

Provider e provisioner

Vagrant è volutamente astratto rispetto al backend di virtualizzazione:

  • Provider di default: VirtualBox (Oracle, gratuito e multi-piattaforma)
  • Provider commerciali: VMware Workstation/Fusion, Parallels
  • Provider cloud: AWS (plugin), DigitalOcean
  • Provider di docker: plugin successivi

E agnostico rispetto al configuration management:

  • Shell — scripting elementare
  • Puppet — integrato
  • Chef — integrato
  • Ansible — supportato (con requisito SSH)
  • Salt — supportato
  • Inline scripts per prototipi rapidi

Questa neutralità architetturale rende Vagrant il collante tra sviluppo e operations: un team può usare Puppet in produzione e Vagrant + Puppet in sviluppo, ottenendo coerenza.

Distribuzione dei box

Al 2013 la distribuzione dei box avviene in modo artigianale: box hostati su server HTTP pubblici, riferiti da URL. HashiCorp sta lavorando a un registry pubblico dedicato (anticipato come Vagrant Cloud) per ridurre la frammentazione.

Il rapporto con Docker

Docker debutta pubblicamente nel marzo 2013 — stesso periodo della crescita di Vagrant. I due strumenti non sono in competizione diretta al debutto: Vagrant fa VM, Docker fa container. La VM è più pesante ma più isolata; il container è più leggero ma richiede compatibilità di kernel con l’host.

Nei primi anni Vagrant e Docker convivono felicemente — Vagrant può provisionare una VM che poi esegue Docker. Successivamente, con l’aumentare della leggerezza di Docker Desktop e la maturità di Docker Compose, il modello “tutto in container” prevarrà per gli ambienti di sviluppo web; Vagrant manterrà la sua nicchia dove serve un’intera VM (es. progetti cross-platform che devono testare su kernel BSD/Windows, scenari che richiedono elevazione di privilegi, test di infrastrutture di rete).

HashiCorp

Il successo di Vagrant permette a Mitchell Hashimoto di fondare nel 2012 HashiCorp — azienda destinata a diventare una delle più rilevanti dell’infrastruttura cloud Open Source. Dopo Vagrant sono in arrivo Packer (2013, image building) e Serf (2013, service discovery); altri prodotti (Consul, Terraform, Vault, Nomad) sono in roadmap.

Il modello HashiCorp è open core progressivo: core Open Source, servizi e funzionalità enterprise a pagamento.

Adozione

Al 2013 Vagrant è già largamente adottato nei team di sviluppo web:

  • Agenzie digitali — per allineare ambienti tra sviluppatori diversi
  • Ruby/Rails community — ecosistema di origine
  • Python Django/Flask — setup environments
  • PHP WordPress/Drupal/Laravel — testing di multi-versione

Nel contesto italiano

Vagrant si diffonde rapidamente in Italia nei team agile di sviluppo software, dalle startup alle software house più strutturate, come soluzione pragmatica al problema “setup macchina nuova” che in precedenza richiedeva ore o giorni di installazione manuale.

Cosa resta

Il contributo di Vagrant è concettuale più che tecnico: normalizza l’idea di dev environment as code, pre-figurando ciò che strumenti successivi porteranno in forme più specializzate. Per molti sviluppatori, Vagrant è il primo contatto con l’idea che “l’ambiente di sviluppo è un artefatto software versionato”.


Riferimenti: Vagrant 1.x (2012-2013). Mitchell Hashimoto. HashiCorp (fondata 2012). Licenza MIT. Provider VirtualBox/VMware/AWS. Provisioner Shell/Puppet/Chef/Ansible/Salt.

Vuoi supporto? Sei sotto attacco? Stato dei servizi
Vuoi supporto? Sei sotto attacco? Stato dei servizi