Vagrant 101 - montando seu ambiente de desenvolvimento portátil, parte 1

Written by Erika Heidi on Monday February 16, 2015 - Permalink -

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.

comments powered by Disqus