Unnikked - Esperienze personali in campo informatico

Come gestire macchine virtuali tramite Vagrant

Ho parlato spesso del concetto di macchina virtuale nel mio blog, arrivando a fornire delle istruzioni piuttosto dettagliate su come creare un ambiente virtuale adatto per lo sviluppo.

Spesse queste azioni sono macchinose, ripetitive e sopratutto prendono molto tempo. Per tale motivo il mio interesse si è spostato verso Vagrant.

Vagrant è stato progettato per facilitare la creazione e la configurazione di ambienti di sviluppo virtuali.

Può essere visto come una interfaccia generale intorno ai più noti software di virtualizzazione come VirtualBox, KVM, VMWare e di gestione di configurazione come Ansible, Chef, Salt o Puppet.

In questo articolo mostrerò come installare su una comune distribuzione linux Ubuntu questo software e il primo approccio all’utilizzo.

Installazione VirtualBox

Come già detto nell’introduzione Vagrant è in grado di interagire con i noti software di virtualizzazione, in questo caso ho preferito utilizzare VirtualBox poiché al momento ho più familiarità con questo software e Vagrant si integra perfettamente senza ulteriori configurazioni.

Per installare VirtualBox basta digitare dalla linea di comando:

sudo apt-get install virtualbox virtualbox-guest-additions-iso

Installazione di Vagrant

Per installare Vagrant consiglio di scaricare manualmente l’ultima versione dalla pagina principale del sito web del progetto e di installarlo manualmente.

wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.deb
sudo dpkg --install vagrant_1.7.2_x86_64.deb

Vagrant Box

Alla base di Vagrant vi è il concetto di Box, una sorta di scatola che contiene il sistema operativo principale utilizzato dal software per creare nuove istanze. E’ possibile usufruire di una lista di box già preparati tramite il sito vagrantbox.es.

Per aggiungere una nuova box è necessario utilizzare il comando:

vagrant box add nome url

Configurazione di un nuovo ambiente virtuale

Per configurare un nuovo ambiente virtuale basterà digitare tramite la riga dei comandi:

vagrant init ubuntu/trusty64

Che aggiungerà una box (se non aggiunta tramite il comando precedente) e configurerà un nuovo ambiente virtuale.

Per immagini preconfigurate è possibile consultare anche questa lista.

Dopo aver eseguito questo comando verrà creato un file di configurazione chiamato VagrantFile che avrà come contenuto (commenti esclusi):

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
end

Il file di configurazione è scritto in Ruby, ma non è necessario conoscere questo linguaggio di programmazione per poter configurare ogni istanza.

Per avviare la macchina virtuale è necessario utilizzare il comando:

vagrant up

Vagrant si occupa della creazione delle chiavi per l’accessso ssh alla macchina virtuale, non è necessario conoscere alcuna password, per accedere alla istanza basterà digitare:

vagrant ssh

Per spegnere la macchina virtuale è necessario digitare:

vagrant halt

.

Alcune configurazioni

Di seguito riporto alcune configurazioni che preferisco utilizzare insieme a Vagrant.

Network

Di solito preferisco esporre la macchina virtuale nella mia rete privata LAN piuttosto che utilizzare una configurazione NAT per rendermi più semplice il testing di applicazioni su vari dispositivi senza troppe configurazioni.

Preferisco anche assegnare un indirizzo IP specifico in modo tale da poterlo legare manualmente ad un dominio fittizio tramite il file <a href="guida-file-hosts-in-linux" title="Guida al file hosts in Linux" target="_blank">/etc/hosts</a>.

Per ottenere questo risultato basta inserire nel file di configurazione questa istruzione:

config.vm.network "public_network", ip: "192.168.0.201"

Dove ovviamente l’indirizzo IP dipende in base alla vostra specifica configurazione, se si ha a disposizione un router domestico che fornisce il servizio DHCP questa istruzione funzionerà correttamente.

La prima volta che si esegue vagrant up verrà chiesto quale interfaccia di rete usare (riferita alla macchina host):

==> default: Available bridged network interfaces:
1) wlan0
2) eth0
==> default: When choosing an interface, it is usually the one that is
==> default: being used to connect to the internet.
    default: Which interface should the network bridge to? 1

Nel mio caso ho scelto 1 poiché il mio portatile è collegato tramite Wi-Fi al router domestico.

Per essere sicuri che la configurazione produca l’effetto desiderato, dopo aver effettuato l’accesso tramite vagrant ssh, usando ipconfig è possibile visualizzare l’indirizzo di rete assegnato all’interfaccia:

eth1      Link encap:Ethernet  HWaddr 08:00:27:06:91:5c  
          inet addr:192.168.0.201  Bcast:192.168.0.255  Mask:255.255.255.0

Per rendere la scelta della interfaccia di rete della macchina host è possibile definire l’interfaccia di rete di default tramite il VagrantFile:

config.vm.network "public_network", bridge: 'en1: Wi-Fi (AirPort)'

La stringa che identifica l’interfaccia di rete desiderata deve corrispondere esattamente il nome dell’interfaccia disponibile. Se non viene trovata, Vagrant chiederà di utilizzare una interfaccia di rete da una lista.

Condivisione file

Preferisco assegnare una cartella condivisa per rendere più semplice il trasferimento dei file verso la macchina virtuale (Di solito uso sshfs o scp).

La seguente istruzione comporta l’effetto descritto:

config.vm.synced_folder ".", "/vagrant"

In questo modo la cartella in cui è presente il file di configurazione VagrantFile sarà auto-montato nel file system dell’istanza presso /vagrant.

Per maggiori informazioni vi consiglio di consultare la documentazione ufficiale.

Conclusioni

La tecnologia fa passi da gigante di giorno in giorno, le macchine virtuali unita alla potenza di calcolo odierna ci permette di creare infrastrutture complesse in modo sicuro ed efficiente. Conoscere gli strumenti adatti è fondamentale per poter lavorare e imparare in modo produttivo.