Que atire a primeira pedra quem nunca usou a desculpa “funciona na minha máquina”. Muitas vezes nem lembramos quais 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, com dependências bem específicas, um banco de dados diferente, ou pacotes que não parecem muito estáveis? Instalar tudo isso na sua máquina é sempre bastante arriscado, principalmente se você não vai mais usar tais dependências no futuro - o que acontece com certa frequência. 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 (traduzido como “Vagabundo”, porém no sentido de não ter casa fixa) gerencia a criação de ambientes de desenvolvimento, normalmente utilizando máquinas virtuais. Você pode usar ferramentas de automação para criar o servidor do jeito que 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 ambiente de desenvolvimento, 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.
Existem 2 “atores” que executam papéis distintos e muito importantes no Vagrant: o provedor (provider) e o provisionador (provisioner). O provedor é responsável por criar uma instância de um ambiente, geralmente uma máquina virtual, com um sistema operacional básico instalado. Para ter seu ambiente de desenvolvimento pronto, você precisará executar uma série de tarefas, como instalação de pacotes e configuração do sistema - isso tudo é feito pelo provisionador. O provisionador é responsável por configurar o ambiente de maneira automatizada, assim temos um ambiente de desenvolvimento totalmente reproduzível e portátil.
vagrant up
Para um setup básico, 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 na página do VirtualBox. Ambos estão disponíveis para os principais sistemas operacionais.
A primeira coisa que precisamos fazer é criar um arquivo Vagrantfile. O Vagrantfile é o arquivo de configuração do seu ambiente de desenvolvimento.
Abaixo, um exemplo de um Vagrantfile super básico:
Esse é o exemplo mais simples que mostra o processo completo, incluindo um provisionador. Estamos aqui usando a Vagrant Cloud para obtermos nossa box - dessa maneira não precisamos definir também a URL onde o arquivo .box está disponível. Esse é um recurso novo da versão 1.5 do Vagrant. Você pode descobrir outras boxes, com outros sistemas operacionais, na seção Discover da VagrantCloud. Neste exemplo, usamos a box atualmente mais popular do Vagrant - Ubuntu 12.04 64 bits.
Como vocês podem ver, usamos o provisionador Shell, passando um comando inline. Agora, vamos rodar esse ambiente - para isso, acesse a pasta onde o Vagrantfile está localizado, pelo terminal, e execute:
Você verá um output similar a este:
Note que, ao final do processo, o provisionador Shell é executado, e você verá o output “Hello World!”. Esse comando está sendo executado dentro da máquina virtual, a máquina Guest.
Por padrão, os provisionadores só são executados na primeira vez que você roda um vagrant up
, quando o ambiente é criado. Nas próximas vezes que você for usar o ambiente, ele já estará pronto, por isso o Vagrant não irá executar por padrão os provisionadores novamente - isso economiza bastante tempo no dia a dia. Mas há ocasiões em que precisamos executar os provisionadores novamente - principalmente quando estamos criando e ajustando os scripts de provisionamento.
Para executar novamente os provisionadores numa VM que já foi criada, mas está desligada, use vagrant up --provision
. Se a máquina já está ligada, você pode usar vagrant provision
para executar os provisionadores diretamente, ou vagrant reload --provision
para reiniciar a máquina e então executar os provisionadores.
Apesar de parecer a opção mais simples e fácil, Shell script não é a melhor forma de provisionar o seu ambiente de desenvolvimento. Existem ferramentas que foram criadas especificamente para a finalidade de automatizar tarefas em servidores, e elas possuem muitos recursos que você teria de implementar por conta própria caso estivesse preparando seu provisionamento com Shell script - como por exemplo a utilização de templates, comportamento idempotente, modularização, dentre outros.
O Vagrant suporta várias ferramentas de automação. As mais populares são: Puppet, Chef e Ansible, nesta ordem. Não existe uma ferramenta melhor que a outra, mas cada uma tem vantagens e características específicas que podem se adequar melhor para o que você pretende fazer; de uma maneira geral, tudo que pode ser feito em uma ferramenta poderá também ser implementado em outra, mas o nível de complexidade pode variar bastante entre elas.
Segue um resumo das principais diferenças entre as ferramentas de automações mais usadas como provisionadores do Vagrant, de maneira que você possa compará-las entre si e escolher aquela com a qual você se identifica mais.
Exemplo de definição de tarefas:
Repare que precisamos usar um require na instalação do pacote Nginx, para termos certeza de que a primeira tarefa, que roda apt-get update
, seja executada antes. Se não usarmos o require, não há nenhuma garantia sobre a ordem de execução das tarefas.
Exemplo de definição de tarefas:
Exemplo de definição de tarefas:
Para uma visão mais detalhada e prática sobre as diferenças entre estes três provisionadores, você pode checar este repositório no GitHub. Ele contém um exemplo prático de provisionamento de um servidor PHP com Nginx+PHP5-FPM, em Ansible, Puppet e Chef.
Para ter um ponto de partida prático e fácil, você também pode usar uma ferramenta web que gera provisionamentos de ambientes PHP. Temos duas ferramentas atualmente com essa finalidade:
O Phansible é um projeto open source criado por mim como uma alternativa ao já popular PuPHPet. Estamos trabalhando na implementação de novos recursos, e aceitamos contribuições :)
Se você quer conhecer mais recursos do Vagrant, incluindo as novidades lançadas nas últimas versões, fique de olho na versão em português do Vagrant Cookbook, prevista para lançamento no final de junho. Você pode baixar um preview gratuito aqui.
O Vagrant pode ajudar bastante no seu processo de desenvolvimento, especialmente em duas situações: quando você está trabalhando em um projeto com outros colaboradores, para evitar problemas na diferença dos ambientes de desenvolvimento usados; e quando seu projeto possui dependências que podem “bagunçar” o seu sistema operacional principal. Pessoalmente, só uso o Vagrant nessas duas situações, mas elas representam 80% dos projetos em que me envolvo. Quando tenho algo muito simples que não usa banco de dados, opto por usar um servidor web local, pois como minha máquina host é Ubuntu, não vejo a necessidade de criar um provisionamento para rodar um simples Nginx com PHP. Mesmo nesses casos, se o projeto possui colaboradores, já é uma razão para se fornecer um setup Vagrant.
A escolha do provisionador vai depender bastante do seu background como desenvolvedor e com o que você se sente mais confortável. Apesar de requerer a instalação de um software adicional, Ansible pra mim é o mais simples, e por isso o que mais uso atualmente. A syntaxe em YAML é bastante intuitiva. Mas se você precisa realizar tarefas complexas que exigem mais programação em seus scripts de provisionamento, Chef pode ser uma ótima solução - você pode usar praticamente qualquer coisa do Ruby dentro dos scripts. Puppet, por outro lado, é bastante popular por ser uma das primeiras ferramentas desse tipo, e por isso você pode encontrar mais recursos (tutoriais, módulos) em Puppet do que em outras ferramentas.