Que atire a primeira pedra quem nunca usou a desculpa “funciona na minha máquina”. Muitas vezes nem lembramos que pacotes temos instalados no nosso ambiente de desenvolvimento, é bastante comum que tudo funcione perfeito na nossa máquina e quando fazemos deploy, BOOM…

E quando surge um projeto novo, que vai usar bibliotecas super específicas ? Não bate um frio na barriga ao sair instalando um monte de coisas que você provavelmente não vai usar no futuro? Sem contar projetos legados, usando versões antigas do PHP – um simples pequeno bugfix pode se tornar uma dor de cabeça enorme.

O Vagrant surgiu para dar um basta a esses problemas. Vagrant (ou “Vagabundo”, mas no sentido de não ter casa fixa) gerencia a criação de máquinas virtuais para ambientes de desenvolvimento. Você pode usar ferramentas de automação para criar o servidor do jeitinho que você quiser, definindo tudo em arquivos que irão fazer parte da árvore do seu projeto. Dessa maneira, qualquer pessoa que clonar o seu repositório poderá rodar uma instância desse servidor, que será exatamente igual para todo mundo, reduzindo ao máximo os problemas que surgem por causa das diferenças entre sistemas operacionais e configurações de sistema. Projetos Open Source vêm popularizando cada vez mais o Vagrant, porque fica bem mais fácil para outras pessoas contribuirem: com apenas um comando – vagrant up  – o projeto estará rodando e pronto para ser trabalhado.

Terminologia do Vagrant

Vagrantfile – arquivo que contém as definições para criar a máquina virtual Box – Uma Box (caixa) é um pacote que contém o esqueleto da sua máquina. É basicamente uma imagem de sistema operacional, mas pode já conter pacotes instalados / outras configurações Host Machine – a máquina que irá rodar o Vagrant e levantar o servidor definido através dos arquivos de configuração Guest Machine – o servidor que foi levantado pelo Vagrant, a máquina virtual que irá rodar o seu projeto Provider – software de virtualização que irá levantar as máquinas virtuais. O padrão é VirtualBox, por ser gratuito e Open Source, mas existem outras opções como Vmware Provisioner – software de automação que irá preparar a sua máquina, instalando pacotes e executando tarefas. As opções mais comuns são: Shell Script, Puppet, Chef, Ansible.

Comandos

vagrant ssh  – faz login na máquina virtual, não precisa de login ou senha

vagrant up  – faz o boot na máquina virtual e executa os provisioners definidos

vagrant reload  – reinicia a máquina virtual. Útil principalmente quando há mudanças no Vagrantfile

vagrant provision  – roda apenas os provisioners, sem reiniciar a máquina. Útil após fazer pequenas modificações no provisionamento

vagrant destroy  – destrói a máquina virtual. Use quando quiser começar do zero com um vagrant up vagrant halt  – “desliga” a máquina, equivalente a um shutdown

vagrant suspend  – suspende a execução da máquina virtual salvando seu estado (ideal para o dia-a-dia quando desenvolvendo)

vagrant resume  – retoma uma máquina virtual previamente suspensa

Instalação

Você precisará instalar o Vagrant e o VirtualBox em sua máquina. A melhor maneira de fazer isso é buscar os pacotes mais atualizados diretamente na página do Vagrant e do VirtualBox. Antes de baixar o VirtualBox, verifique a versão compatível com o Vagrant, essa informação está disponível na documentação do VirtualBox Provider. Nesta data, a versão do VirtualBox compatível com o Vagrant mais novo (1.3.5) é a 4.2.x . Baixe e instale os dois pacotes e você estará pronto para começar seus experimentos com Vagrant.

Definindo sua máquina virtual – Vagrantfile

O Vagrantfile usa Ruby, mas é bem simples como vocês podem ver no exemplo abaixo. Basicamente definições de variáveis:

Vagrant.configure(“2”) do |config|

config.vm.box = “precise64”
config.vm.box_url = “http://files.vagrantup.com/precise64.box”

config.vm.network :private_network, ip: “192.168.33.101”
config.vm.synced_folder “./”, “/vagrant”, id: “vagrant-root”
config.vm.provision “shell”, inline: “echo hello”

end

Detalhando as opções:

  • config.vm.box – identificador da “box” que você irá usar. A box fica compartilhada no seu sistema, podendo ser usada por múltiplos Vagrantfiles
  • config.vm.box_url – url da “box” . Nesse caso, Ubuntu 12.04(precise pangolin)  64bits. Aqui você encontra uma lista com várias boxes: http://www.vagrantbox.es/
  • config.vm.network – define como será a rede da máquina, nesse caso ela terá o ip privado 192.168.33.101
  • config.vm.synced_folder – define que o diretório atual ficará compartilhado entre a máquina HOST e a máquina GUEST, e estará localizado em /vagrant  na máquina GUEST
  • config.vm.provision – define a utilização de um provisioner, nesse caso shell . Isso irá simplesmente imprimir um “hello” na fase de provisioning da máquina virtual.

Nota sobre vagrantbox.es : apesar de oferecer uma extensa lista de boxes com diferentes especificações, preste atenção porque a maioria das boxes listadas nesse site não é fornecida pelo Vagrant (não oficiais). Nunca se sabe o que pode estar lá dentro, e o pior é que muitas vezes elas nem estão acessíveis, gerando erro na hora de subir a máquina virtual pela primeira vez. Sempre dê preferência às boxes que estão hospedadas no domínio files.vagrantup.com, elas são fornecidas pelo próprio Vagrant. Salve esse Vagrantfile na raiz do seu projeto, e inicie a máquina com

vagrant up

Na primeira vez que você rodar essa máquina, o Vagrant vai fazer o download e importar a box definida no seu sistema, caso já não tenha sido importada antes. Isso pode levar alguns minutos. O output esperado:

➜ vagrant-lab git:(master) ✗ vagrant up
Bringing machine ‘default’ up with ‘virtualbox’ provider…
[default] Clearing any previously set forwarded ports…
[default] Fixed port collision for 22 => 2222. Now on port 2200.
[default] Creating shared folders metadata…
[default] Clearing any previously set network interfaces…
[default] Preparing network interfaces based on configuration…
[default] Forwarding ports…
[default] — 22 => 2200 (adapter 1)
[default] Booting VM…
GuestAdditions 4.2.18 running — OK.
[default] Waiting for machine to boot. This may take a few minutes…
[default] Machine booted and ready!
[default] Configuring and enabling network interfaces…
[default] Mounting shared folders…
[default] — /vagrant
[default] Running provisioner: shell…
[default] Running: inline script
stdin: is not a tty
hello

Note que esse Vagrantfile está simplificado, e só estamos rodando um shell provisioner pra testar (a última linha – “hello”). Num caso real, estaremos usando um provisioner mais complexo para automatizar a instalação de pacotes e configuração do nosso servidor. No próximo post irei falar sobre Provisioners e como colocar tudo isso junto para criar seu ambiente portátil de desenvolvimento PHP.