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.

Vagrant Cloud

Nel 2014 HashiCorp lancerà Vagrant Cloud (oggi parte di HashiCorp Cloud Platform) come registry pubblico per i box — l’equivalente funzionale di DockerHub per Vagrant. Al 2013 il distributions avviene in modo più artigianale (box hostati su server HTTP pubblici, riferiti da URL).

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 che diventerà una delle più rilevanti dell’infrastruttura cloud open source. Dopo Vagrant arrivano Packer (2013, image building), Serf (2013, service discovery), Consul (2014, service mesh), Terraform (2014, IaC), Vault (2015, secrets), Nomad (2015, orchestration).

Il modello HashiCorp è open core progressivo: core open source, servizi e funzionalità enterprise a pagamento. Il modello regge bene fino al 2023, quando il passaggio di Terraform (e poi altri prodotti) a BSL genererà una reazione comunitaria e nascerà OpenTofu.

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 Docker Compose, devcontainers VS Code, Nix Shell porteranno in forme più specializzate. Per molti sviluppatori, Vagrant è stato 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. Box registry (Vagrant Cloud, 2014).

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