Unnikked - Esperienze personali in campo informatico

Vagrant – Shell Provisioning

Il modo più semplice per preparare una base box è usare un file di scripting per l’interprete dei comandi che verrà eseguito sulla macchina virtuale. Ciò consente di non imparare tool specifici come Pupper, Ansible o simili.

Si parte da un Vagrantfile così strutturato:

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

	config.vm.network :forwarded_port, guest: 80, host: 8931, auto_correct: true
	config.vm.synced_folder "./", "/var/www", create: true, group: "www-data", owner: "www-data"

	config.vm.provider "virtualbox" do |v|
		v.name = "Shell Provisioning Tutorial"
		v.customize ["modifyvm", :id, "--memory", "1024"]
	end

end

E’ necessario specificare la tipologia di provisioning, che nel nostro caso si chiama shell. Per specificarlo:

config.vm.provision "shell" do |s|
    s.path "provision/setup.sh"
end

Vagrant mette a disposizione due tipologie di shell provisioning, inlinea (inline) e esterno (external), cioè permette di eseguire comandi direttamente specificati nel Vagrantfile oppure da una sorgente esterna, anche un URL.

In questo caso useremo il file provision/setup.sh. Creiamo il file setup.sh ed iniziamo a scrivere il seguente contenuto:

#!/bin/bash
 
echo "Provisioning virtual machine..."

Eseguendo il comando vagrant up verrà mostrato Provisioning virtual machine… sullo schermo.

Bisogna notare che Vagrant preparerà la macchina virtuale solo al primo avvio, per rieseguire il file di provisioning bisogna utilizzare il parametro --provision sia per vagrant up --provision che per vagrant reload --provision.

La preparazione verrà rieseguita anche dopo aver distrutto e ricostruito una macchina virtuale tramite vagrant destroy e vagrant up.

Per mostrare un caso d’uso di shell provisioning andremo a preparare uno script che installerà un ambiente LEMP al primo avvio.

Installazione dei pacchetti di base

Iniziamo con l’installare alcuni pacchetti di base, sempre nel file provision/setup.sh:

echo "Installing Git"
apt-get install git -y > /dev/null
 
echo "Installing Nginx"
apt-get install nginx -y > /dev/null

Installazione di PHP

L’installazione di PHP ed alcuni pacchetti di base:

echo "Installing PHP"
apt-get install php5-common php5-dev php5-cli php5-fpm -y > /dev/null
 
echo "Installing PHP extensions"
apt-get install curl php5-curl php5-gd php5-mcrypt php5-mysql -y > /dev/null

Installazione MySQL

L’installazione di MySQL presenta alcune difficoltà, è necessario interagire durante l’installazione per fornire la password di root.

Tuttavia Vagrant deve automatizzare l’installazione e in qualche modo bisogna trovare una soluzione per fornire la password automaticamente.

Per questo scenario andremo ad installare uno strumento chiamato debconf-utils:

apt-get install debconf-utils -y > /dev/null

Ora possiamo usare questa utility per indicare al processo di installazione di MySQL di non mostrare il dialogo per l’inserimento della password ma di accettarla tramite la riga di comando:

debconf-set-selections <<< "mysql-server mysql-server/root_password password 1234"
 
debconf-set-selections <<< "mysql-server mysql-server/root_password_again password 1234"

Nei due comandi 1234 è la password che verrà utilizzata per l’utente root.

Possiamo ora procedere con l’installazione di MySQL senza ottenere il dialogo per l’inserimento della password.

apt-get install mysql-server -y > /dev/null

Note

  • L’output di ogni comando è stato rediretto su > /dev/null. In questo modo ogni messaggio prodotto dal processo di provisioning verrà soppresso.
  • Quando si installa una applicazione usando il comando apt-get install vi verrà chiesto la conferma, usando il parametro -y si indicherà al processo di installare il programma senza chiedere tale conferma.

Configurare Nginx

Ora che abbiamo installato i pacchetti necessari per l’ambiente di sviluppo PHP, è necessario anche configurare Nginx per servire i file di progetto.

Il modo più semplice è quello di creare un file nella cartella sincronizzata e usarla come file di configurazione per Nginx.

Creiamo un file chiamato nginx_vhost nella cartella provision/config, il percorso del file sarà ovviamente provision/config/nginx_vhost.

Questo file conterrà una configurazione di base per un virtual host:

server {
    listen 80;
    server_name localhost;
     
    root /var/www/src/;
    index index.php index.html;
     
    # Important for VirtualBox
    sendfile off;
     
    location / {
        try_files $uri $uri/ =404;
    }
     
    location ~* \.php {
        include fastcgi_params;
         
        fastcgi_pass unix:/var/run/php5-fpm.sock;
         
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_cache off;
        fastcgi_index index.php;
    }
}

Bisogna inserire queste linee di codice nel file setup.sh per configurare Nginx ed abilitare il virtual host:

echo "Configuring Nginx"
cp /var/www/provision/config/nginx_vhost /etc/nginx/sites-available/nginx_vhost > /dev/null
 
ln -s /etc/nginx/sites-available/nginx_vhost /etc/nginx/sites-enabled/
 
rm -rf /etc/nginx/sites-available/default

service nginx restart > /dev/null

Il virtual host creato punta alla cartella /var/www/src/. Creiamo questa cartella e creiamo anche un file index.php con contenuto:

<?php echo "Hello World!"; ?>

La struttura della cartella finale dovrebbe somigliare a:

vagrant shell provision folder structure

Dopo aver eseguito vagrant up si dovrebbe essere in grado di accedere la pagina visitando localhost:8931 nel browser.