Dev env as code: Vagrant up

Quem trabalha com muitas tecnologias em diferentes projetos, ou mantém diversos projetos para plataformas diferentes com certeza já passou por isso: Como manter diversos ambientes de desenvolvimento na mesma maquina? Ou mesmo como reconstruir “aquele” projeto mais antigo? Para isso e para o clássico do garoto novo na empresa ter que configurar um ambiente novo ou quando você mesmo troca de maquina, temos o Vagrant!

Vagrant é uma camada de abstração para o ambiente de desenvolvimento. Ele permite definir o ambiente de dev do projeto através de um arquivo de configuração, o Vagrantfile, que passa a ser parte do código da aplicação, logo entrando para o controle de versão, distribuição e tudo mais. A partir desse arquivo o vagrant é capaz de criar uma maquina virtual com todo o ambiente pronto.

Algumas vantagens de usar essa abordagem:

  • Ambiente faz parte do código do projeto
  • Ambiente fica documentado
  • Portabilidade (mesma VM no linux, windows e mac)
  • Maior proximidade do ambiente de produção/homologação
  • Maior isolamento entre os ambientes de diversos projetos
  • Testar projetos distribuídos

Meus dois principais use-cases foram para permitir a quem entrar novo no time ter o ambiente pronto rapidamente, e de manter os ambientes isolados (tenho apps em php, clojure, ruby 1.9, ruby 2.1, etc…) sem afetar uma a outra.

Para usar o vagrant é simples:

Primeiro instale um virtualizador (como o virtualbox) e o vagrant no seu sistema.

Em seguida, no projeto, rode o comando “vagrant init”, ele vai criar um arquivo Vagrantfile de exemplo com comentários sobre como configurar sua maquina virtual. Tendo um Vagrantfile no projeto basta executar o “Vagrant up” para subir e configurar a maquina virtual. Com a maquina no ar você pode então executar “vagrant ssh” para ter acesso a ela e ir a pasta /vagrant, a qual é compartilhada com o projeto em si.

Resumindo:

$ vagrant init # cria um vagrantfile
$ vagrant up # inicia uma maquina virtual
$ vagrant ssh # acessa a maquina virtual
$ vagrant halt # desliga a maquina virtual

Algumas configurações importantes:

Deve-se definir a máquina base usando, por exemplo:

config.vm.box = "ubuntu/trusty32"

Além disso você pode buscar no vagrant cloud por várias máquinas já prontas, pode ser que a você precisa já esteja lá.

Usando a diretiva de rede no Vagrantfile a maquina virtual fica disponível nesse IP, assim como ganha uma rede interna para todas as vms poderem se acessar:

config.vm.network "private_network", ip: "192.168.10.10"

O mais importante do vagrant é a capacidade de provisionamento do ambiente, ou seja, instalar e configurar as dependências da sua aplicação de forma simples e automatizada, usando as ferramentas mais comuns de devops:

Pode até combinar eles, exemplo:

config.vm.provision "puppet" do |puppet|
 puppet.manifests_path = "manifests"
 puppet.manifest_file = "default.pp"
end

config.vm.provision "shell", :inline "apt-get install apache2 php5"
config.vm.provision "shell", :path "config.sh"

Temos também alguns plugins interessantes.

Concluindo, com um Vagrantfile no projeto você garante que o ambiente desse projeto está a um “vagrant up” de distância. Embora o tempo para instalar e configurar a maquina inicialmente demore um pouco (afinal está configurando uma maquina totalmente nova), o isolamento e a certeza de ter um ambiente uniforme valem a pena.

Em um próximo texto faço também alguns exemplos de configurações para os ambientes mais comuns.