# Vagrant (software)

Vagrant è un gestore di macchine virtuali open source; funziona con molti software di tipo hypervisor, denominati providers, tra cui VirtualBox, VMware e KVM.
Vagrant, insieme a Docker è uno dei principali software per il deployment portatile di ambienti di sviluppo di applicazioni.
Grazie a Vagrant infatti è possibile costruire delle macchine virtuali che utilizzano le stesse configurazioni e possono essere create, modificate e cancellate con facilità.

## Storia

Vagrant nasce nel 2010 come progetto personale del giovane Mitchell Hashimoto. Nell'ottobre del 2010 la società Engine Hard Ha, famosa azienda nello sviluppo di applicazioni Ruby, decide di sponsorizzare il creatore. Esattamente 2 anni dopo esce la prima versione stabile di Vagrant, la versione 1.0, ottenendo molto successo. Inizialmente Vagrant era utilizzabile solamente attraverso Virtual Box, ma grazie alla creazione della società HashiCorp, fondata dallo stesso Hashimoto per lo sviluppo unico del suo progetto, adesso può essere utilizzato anche con altri software di virtualizzazione, quali VMware e KVM. Vagrant è open-source e HashiCorp propone corsi di formazione e interventi di manutenzione per aziende private e pubbliche.
Vagrant nella versione 1.6 si lega ai container di Docker e permette di essere eseguito a sua volta in un ambiente completamente virtualizzato.
Nel 2013 viene pubblicato dal creatore Mitchell un libro sul funzionamento di Vagrant, dal titolo: Vagrant: Up and Running: Create and Manage Virtualized Development Environments pubblicato da O'Reilly Media.

## Architettura

Vagrant permette la creazione e la configurazione di una macchina virtuale attraverso delle API open source messe a disposizione da sistemi di virtualizzazione.
I componenti di Vagrant sono:
* Providers
* Box
* Provisioning
1) I providers sono i software nei quali è possibile creare una macchina virtuale; si occupano quindi della spartizione della memoria RAM, dello scheduling dei processi e della gestione della memoria di massa. Il più utilizzato da Vagrant è VirtualBox.
2) I box sono delle immagini di macchine virtuali già configurate con determinati sistemi operativi. Essendo Vagrant open source è possibile creare, modificare e rendere pubblici i box. Questa è sicuramente una delle componenti maggiormente utilizzate dagli sviluppatori in quanto permette di evitare il processo lento e macchinoso di installazione dei vari servizi e del sistema operativo stesso.
3) Il provisioning è la possibilità di rendere un box eseguibile e modificabile da un singolo file; si tratta di una potenzialità importante, in quanto consente di evitare l'utilizzo di strutture di file complicate per la condivisione dei progetti.
Attraverso un file di configurazione denominato "Vagrantfile" è possibile creare o modificare un box. In esso sono contenute tutte le configurazioni del box stesso, inclusa l'immagine da utilizzare, le specifiche hardware, file e cartelle condivise e indirizzi d'uscita e d'entrata.
Esempio di un Vagrantfile (senza estensione):
Eseguire questo Vagrantfile comporta la creazione di una macchina virtuale, l'installazione di un sistema operativo di tipo Debian 8, la configurazione e l'installazione di tutti i software e i server necessari per avere un ambiente web completo (PHP, Nginx, NodeJS, Apache...).

## Particolarità

Vagrant, a differenza di altri software per la gestione di container, utilizza dei providers. Ciò ne peggiora la velocità di esecuzione e le prestazioni generali. Software alternativi, per esempio Docker, sono svincolati dall'utilizzo di provider e garantiscono prestazioni notevolmente superiori, ma permettono l'esecuzione di ambienti solo linux e non BSD, Windows e macOS.
Un altro aspetto significativo da considerare riguarda la sicurezza. Vagrant gestisce e crea macchine virtuali, quindi macchine con una netta separazione delle risorse, permettendo una maggiore sicurezza nell'esecuzione, a differenza dei container, che utilizzano molte risorse comuni con la macchina che li ospita.