Tools

Sul mio computer funziona

Lettura 8 minuti

Frase che almeno una volta abbiamo detto o sentito dire. E se il codice è lo stesso, i dati pure, rimane solo un colpevole: l’ambiente su cui gira il nostro magento escludendo

almeno per ora l’immancabile errore umano. Chi usa nginx, chi usa apache, chi usa una versione, chi un’altra, per non parlare delle differenze tra il nostro ambiente in locale, in staging e produzione perché le persone coinvolte hanno competenze diverse e compiti diversi. Ovviamente non consideriamo il caso in cui…

E arriva nel tuo team un nuovo membro che non conosce le tecnologie che vengono abitualmente usate e dev’essere in grado velocemente di poter sviluppare e dare il suo contributo. E vogliamo parlare di quel progetto di cui non sei l’artefice e che hai ereditato come punizione divina che gira ancora su una versione di Magento che non è mai stata aggiornata in produzione?

Tutti questi esempi pongono il seguente problema: come replicare un progetto senza dover per forza avere una macchina dedicata per ogni istanza del progetto e possibilmente con il minimo dello sforzo per tutti i membri del team?

Una risposta abbastanza semplice la fornisce Vagrant mettendo a disposizione gli strumenti necessari per gestire con pochi semplici comandi le ormai famose macchine virtuali. Basta pensare che, una volta installato Vagrant sulla propria macchina, è possibile per chiunque con un solo commando accendere una qualsiasi macchina fornita e quindi usarla per il proprio progetto. Non solo: la stessa macchina può essere condivisa tra tutti i membri del team che lavorano sullo stesso progetto evitando cosi il famoso “_ma sulla mia macchina funziona_”.

Un altro punto importante è la facilità di creare/distruggere una macchina gestita con Vagrant permettendo cosi di creare tanti ambienti diversi, sperimentare con tecnologie nuove, il tutto senza contaminare il proprio ambiente locale.

Su Vagrant troviamo disponibili i file di installazione sia per sistemi Mac, Windows, Debian e CentOS  https://www.vagrantup.com/downloads.html

Spesso per i progetti più comuni troviamo disponibili delle macchine già configurate con tutto il necessario, un esempio è http://www.magestead.com/  ma si possono trovare tantissime altre Vagrant Box. E quando vogliamo anche solo fare un giro di prova delle varie tecnologie senza investire troppo tempo sono una buona soluzione.

Quindi per iniziare a sfruttare Vagrant dobbiamo ricercare la macchina virtuale che ci serve per il nostro famoso progetto ereditato come punizione divina e ipotizziamo sia una macchina virtuale Ubuntu 14.0 LTS 32-bit. Per ottenere una macchina virtuale abbiamo a disposizione vari provider ma quello che andremo ad utilizzare nel nostro esempio è VirtualBox quindi assicurarsi di aver installato l’ultima versione e per avere una migliore integrazione Virtualbox Guest Additions.

A questo punto, dentro la cartella dove vogliamo posizionare la nostra macchina virtuale, eseguire il seguente comando:

vagrant init ubuntu/trusty32

In risposta dovreste ricevere il seguente messaggio:

A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information about using Vagrant.

e all’interno della cartella in cui avete lanciato il comando troverete un file nominato Vagrantfile, scritto usando la sintassi di ruby con essenzialmente 2 istruzioni:

Vagrant.configure(2) do |config| -> indica a vagrant la version di Vagrant con cui stiamo lavorando

config.vm.box = “ubuntu/trusty”; -> indica la macchina virtuale che andremo usare.

A questo punto manca l’ultimo comando e avremo una macchina virtuale operativa:

vagrant up

Per accedere tramite un terminale alla vostra macchina virtuale basta eseguire:

vagrant ssh

Quindi, come anticipato, con 2 comandi abbiamo la nostra macchina virtuale su cui montare il nostro progetto. La macchina virtuale viene anche chiamata macchina guest in relazione alla nostra macchina chiamata host. A questo punto dentro la macchina guest è disponibile la cartella vagrant all’interno della quale è possibile condividere i file tra host e guest e vedrete presente appunto il file Vagrantfile. Tutti i file contenuti nella cartella dove avete eseguito il comando vagrant up saranno visibili all’interno della macchina virtuale e anche dopo averla distrutta rimarranno intatti sulla vostra macchina locale.

Però una macchina del genere è praticamente inutile per il nostro progetto Magento, ci manca tutto l’ambiente AMP quindi come faccio a creare la macchina che desidero? Ma sopratutto vogliamo sicuramente avere l’accesso via browser alla macchina quindi come si fa ad ottenerlo?

Se andiamo a leggere le parti commentate del nostro Vagrantfile troviamo diverse spunti su come procedere oltre che ovviamente nell’ampia documentazione a riguardo.

Se andiamo a togliere il commento sulla riga config.vm.network “forwarded_port”, guest: 80, host: 8080 e ricarichiamo la configurazione di vagrant con il commando vagrant reload attiviamo quello che viene chiamato port forwading e si traduce nell’accesso alla porta 80 della macchina virtuale sulla porta 8080 del host. E se per caso tale porta è occupata sulla nostra macchina con l’opzione auto_correct: true vagrant gestirà per noi l’assegnazione automatica ad una porta libera. Per controllare che tutto funziona correttamente basta il seguente comando:

telnet localhost 8080

E se tutto funziona ci risponderà cosi:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

Ok, abbiamo visto come avere file condivisi, abbiamo visto come comunicare con il guest ma ci manca ancora la parte più importante e cioè l’ambiente necessario per far girare il nostro progetto magento che ipotizziamo sia un semplice ambiente LAMP. E qui ci viene in aiuto un’altra parte del nostro file di configurazione :

config.vm.provision "shell", inline: <<-SHELL
 sudo apt-get update
 sudo apt-get install -y apache2
 SHELL

Di per se è abbastanza intuitivo, e cioè esegue in shell i comandi necessari per installare Apache con un’opzione importante e cioè -y per evitare la richiesta di conferma da parte dell’utente senza la quale rimarrebbe bloccato in attesa di input. Chiaramente la nostra installazione richiede più comandi quindi l’opzione migliore è usare uno script. Vagrant offre varie modalità per quello che viene chiamato provisioning e cioè uno script o serie di comandi che verranno eseguiti al momento della creazione della nostra macchina. Potrebbe venire la domanda: perché non farlo direttamente da dentro la macchina virtuale? La risposta è che possiamo farlo ma verrebbe a mancare un fattore cruciale e cioè la possibilità di riprodurre la macchina anche per gli altri membri del team o su altri server. Infatti una volta configurato lo script che va a creare la macchina desiderata, basta condividere il Vagrantfile e lo script di provisioning affinché anche il nostro collega abbia la stessa identica macchina.

Quindi prima di tutto aggiungiamo config.vm.provision “shell”, path: “script.sh” al nostro Vagrantfile e andiamo a scrivere dentro il nostro script.sh tutti i comandi necessari il nostro ambiente LAMP.

#!/usr/bin/env bash
# Update Apt
apt-get update
 
# Install Apache &amp;amp;amp;amp; PHP
apt-get install -y apache2
apt-get install -y php5
apt-get install -y libapache2-mod-php5
apt-get install -y php5-mysqlnd php5-curl php5-xdebug php5-gd php5-intl php-pear php5-imap php5-mcrypt php5-sqlite php5-xmlrpc php5-xsl php-soap
 
php5enmod mcrypt
 
# Delete default apache web dir and symlink mounted vagrant dir from host machine
rm -rf /var/www/html
mkdir /vagrant
ln -fs /vagrant /var/www/html
 
# Replace contents of default Apache vhost
VHOST=$(cat <<EOF
<VirtualHost *:80>
 DocumentRoot "/var/www/html"
 ServerName localhost
 <Directory "/var/www/html">
 AllowOverride All
 </Directory>
</VirtualHost>
EOF
)
 
echo "$VHOST" > /etc/apache2/sites-enabled/000-default.conf
 
a2enmod rewrite
service apache2 restart
 
# Mysql
# Ignore the post install questions
export DEBIAN_FRONTEND=noninteractive
# Install MySQL quietly
apt-get -q -y install mysql-server-5.5

In questo modo abbiamo creato la nostra macchina LAMP e se visitiamo localhost:8080 dal nostro browser vedremo la root del webserver appena installato sulla macchina virtuale. Possiamo fare molto di più e cioè integrare completamente il nostro progetto Magento aggiungendo l’import del database e il dominio da usare. Per fare l’import basta passare il nome del file come parametro del nostro script e lasciare il dump del database sulla root che sappiamo essere visibile; analogo discorso vale per il dominio. A questo dentro il nostro Vagrantfile aggiungiamo :

# -*- mode: ruby -*-
# vi: set ft=ruby :
 
DB_DUMP_FILENAME = "DB_DUMP_FILENAME.sql"
config.vm.provision "shell", path: "script.sh" :args => [DB_DUMP_FILENAME]

e nel nostro script.sh aggiungiamo l’import del db

if [ -f /var/www/html/$DB_DUMP_FILENAME ]; then
 echo 'Importing database dump'
 mysql -u magentouser -ppassword magentodb < /var/www/html/$DB_DUMP_FILENAME
fi

E per finire ci manca solo l’aggiunta del dominio a cui rispondere. Per quest’operazione arriviamo alla nostra versione finale:

# -*- mode: ruby -*-
# vi: set ft=ruby :
 
SITE_URL = "vagrant.local"
DB_DUMP_FILENAME = "DB_DUMP_FILENAME.sql"
IP_ADDRESS = "10.11.11.13"
 
Vagrant.configure(2) do |config|
 
 config.vm.box = "ubuntu/trusty32"
 config.vm.hostname = SITE_URL
 config.vm.network :private_network, ip: IP_ADDRESS
 config.vm.provision "shell", path: "script.sh", :args => [SITE_URL, DB_DUMP_FILENAME]
end

Come vediamo è stato sostituito al port forwarding l’assegnazione di un IP privato alla macchina virtuale. Se aggiungiamo al nostro etc/hosts con 10.11.11.13 vagrant.local e modifichiamo il virtualhost col il dominio passato la macchina virtuale ci risponderà secondo la nostra configurazione.
Le possibilità di manipolare le macchine virtuali con Vagrant sono molto ampie e una volta trovata la giusta soluzione, abbiamo una processo di sviluppo più stabile e omogeneo all’interno del team per i singoli progetti migliorando cosi la qualità del nostro lavoro.
Chiaramente non è la soluzione ultima e perfetta e ha come contro l’uso cospicuo delle risorse del proprio pc tale da rendere possibile l’esecuzione in parallelo solo di un numero limitato di macchine.
In tale direzione va un altro sistema di virtualizzazione che andremo ad approfondire in un prossimo articolo: Docker.
Presenta dei vantaggi che sino ad oggi non potevano essere sfruttati a pieno su piattaforme Mac e Windows. Ma è recente la notizia dell’uscita della versione beta della soluzione dedicata proprio a tali piattaforme.

Stay tuned!

Articolo scritto da

Back-end dev | Firenze/Rotterdam