È abbastanza facile configurare Apache su un singolo sistema. Diventa un po' più interessante se si hanno più vhost nella configurazione. Diventa ancora più divertente quando si ha una configurazione complessa che include il proxy, la riscrittura degli URL e qualche sostituzione del testo.
Ma comunque, nulla che un amministratore di sistema esperto non possa gestire con un po' di attenzione.
Fino a quando, beh, devi farlo di nuovo.
È qui che entrano in gioco strumenti come Chef e Puppet. Entrambi gli strumenti consentono di dichiarare e definire l'aspetto dei sistemi e come devono essere configurati. Entrambi sono potenti e vengono utilizzati attivamente per configurare qualsiasi cosa, dalle postazioni di sviluppo workstation alle grandi distribuzioni di centinaia di migliaia di macchine.
Proprio come il software, è comunque necessario costruire e testare la configurazione che si sta costruendo. Le tue opzioni per farlo vanno dal molto costoso (acquistare uno o più server), al moderatamente costoso (eseguire alcune istanze su EC2) al molto, molto economico. L'opzione molto, molto economica sarebbe quella di costruire e testare le tue ricette su macchina(e) virtuale(i) in esecuzione sul tuo sistema. È qui che entra in gioco Vagrant.
Vagrant è un wrapper attorno alla piattaforma di virtualizzazione desktop VirtualBox di Oracle. La configurazione di Vagrant ruota attorno a pochi semplici concetti. Hai un file di configurazione chiamato Vagrantfile
alla radice del progetto. Quel file contiene una configurazione di base come la base box da utilizzare per il progetto e quali porte esporre al sistema host. E altrettanto importante, può descrivere come approvvigionare la macchina virtuale in modo che soddisfi le esigenze del tuo progetto. Sebbene Vagrant supporti sia Puppet che Chef, ho scelto di utilizzare Chef-Solo per approvvigionare questo progetto.
Iniziare con Vagrant è semplice. Il primo passaggio è semplicemente installare il gem vagrant
. Proprio come qualsiasi altro progetto Ruby, ho scelto di installare vagrant
e alcuni altri gem tramite Bundler. Ecco il Gemfile
risultante:
source 'https://rubygems.org'
gem 'vagrant'
gem 'librarian'
L'esecuzione di bundle install
ha installato i gem necessari nella directory del progetto. Un rapido rbenv rehash
ha reso disponibile l'eseguibile vagrant per la mia shell.
Il passaggio successivo è stato impostare la configurazione di Vagrant più basilare. Ho eseguito vagrant init
e poi ho modificato il Vagrantfile risultante per renderlo così:
Vagrant::Config.run do |config|
# Ogni ambiente virtuale Vagrant richiede una box su cui costruire.
config.vm.box = "ubuntu-precise-64"
# L'url da cui verrà recuperata la box 'config.vm.box' se
# non esiste già sul sistema dell'utente.
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end
Questo raggiunge 2 cose. In primo luogo, dichiara il nome della box che stiamo costruendo e dove trovare quella box. Un rapido vagrant up
scaricherà inizialmente la box di base, la importerà nel progetto e avvierà la VM. Ci vuole un po' di tempo per scaricare la box, ma viene memorizzata nella cache sul sistema in modo da non doverla scaricare di nuovo. Puoi anche riutilizzare la stessa box di base se scegli di farlo in altri progetti. Chiamare vagrant halt
ferma la VM e chiamare vagrant destroy
, beh, distrugge la VM stessa.
Non abbiamo ancora fatto molto per approvvigionare la nostra VM, però. Il passaggio successivo è dirle a Vagrant come fare.
Librarian è un altro bel gem sulla linea di Bundler e CocoaPods che ti consente di dichiarare quali ricette Chef stai utilizzando. Nel nostro caso, una copia ridotta del Cheffile
del progetto appare così:
#!/usr/bin/env ruby
#^syntax detection
site 'http://community.opscode.com/api/v1'
cookbook 'apt'
cookbook 'apache2', '>= 1.0.0'
cookbook 'rbenv', :git => 'git://github.com/fnichol/chef-rbenv.git', :ref => 'v0.7.2'
cookbook 'ruby_build'
cookbook 'openssh', :git => 'git://github.com/fnichol/chef-openssh.git'
cookbook 'git'
cookbook 'build-essential'
cookbook 'vim'
cookbook 'user'
cookbook 'sudo'
Il più grande vantaggio è che non è necessario fornire i cookbook nei tuoi progetti. L'esecuzione di librarian-chef install
scaricherà i cookbook e li installerà nella directory cookbooks
. Questo ha anche generato un Cheffile.lock
per documentare quale versione dei cookbook è stata installata.
A quel punto ero in grado di dire a Vagrant di utilizzare Chef-Solo per approvvigionare la box aggiornando il Vagrantfile
:
Vagrant::Config.run do |config|
# Ogni ambiente virtuale Vagrant richiede una box su cui costruire.
config.vm.box = "ubuntu-precise-64"
# L'url da cui verrà recuperata la box 'config.vm.box' se
# non esiste già sul sistema dell'utente.
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
# Abilita il provisioning con chef solo, specificando un percorso dei cookbook, ruoli
# percors