Google+ Followers

Wednesday, September 10, 2014

Vagrant e você, tudo a ver

Uma das coisas mais legais que aprendi nos últimos meses foi adicionar Vagrant no meu dia-a-dia de desenvolvimento.
Hoje os meus primeiros passos para começar um projeto [green field] são:
mkdir
git init
vagrant init ubuntu/trusty64

 O que é?

Camadas
Vagrant é uma camada que facilita, MUITO, a interação com máquinas virtuais. Ele funciona falando diretamente com o seu gerenciador de máquina virtual (comumente chamados de Hypervisor). Com vagrant você consegue subir uma máquina virtual sem nem abrir o Virtual Box, por exemplo.

Providers

Para o Vagrant o Virtual Box é um provider.
Virtual box é o provider padrão do Vagrant, ou seja, para subir uma VM virtual box com vagrant você não precisa fazer nada. Para subir uma VM VMWare você precisa instalar um plugin.

Requisitos

Como você pode imaginar tem um hypervisor instalado é um dos pré-prequisitos para usar vagrant na sua máquina.

Benefícios

Essa parte é interessante...
Existe uma variedade de tecnologias que eu uso atualmente. A saber:
  • Octave, Python e R para os projetos de Big Data e Machine Learning
  • [Ruby|Python], ImageMagik e [Postgres|MySQL] para projetos [RoR no heroku|django]
  • Java + [Tomcat|JBoss|Jetty] para projetos Java
  • Imagine outra tech stack que possa sugir aqui...
 Eu tenho apenas um computador para desenvolver. Se eu fosse instalar todos os softwares necessários diretamente no meu laptop, tenho certeza que eu teria problemas de compatibilidade, além da lentidão que meu ambiente ia ficar (imagine ter um postgres e mysql rodando na minha maquina o tempo todo).
Com Vagrant o que eu faço é criar uma máquina virtual para cada projeto e nessa máquina instalo os softwares necessários para minha app rodar, mantendo diretamente no meu laptop apenas código fonte e editor.
Por exemplo, para uma aplicação java eu deixo o maven, tomcat e banco de dados rodando dentro da VM enquanto no meu laptop ficaria apenas o eclipse.
Em projetos Ruby on Rails eu instalo Image Magik, editor, RVM e PostgreSQL na VM, deixando apenas o código fonte no meu laptop.

Vagrantfile

A maneira mais simples de iniciar o uso de vagrant em um novo projeto é executar o comando:
vagrant init
Esse comando vai criar um arquivo chamado Vagrantfile no seu diretório atual, é através desse arquivo que você configura como o vagrant deve te prover a máquina virtual.

Como configurar os ambientes

Algo muito legal no Vagrant é que ele já entende as principais ferramentas para provisionamento automático de ambiente. Então se você conhece Puppet, Chef, Ansible ou o recente adicionado Docker, você pode criar receitas/scripts/manifestos com a configuração que você deseja que seja aplicada na sua máquina virtual e o Vagrant vai aplicar a configuração quando ele criar a máquina virtual pela primeira vez (ou quando você quiser que ele re-aplique a configuração de provisionamento). Eu não vou entrar fundo no assunto de provisionamento automático de ambiente nesse post por que esse assunto é extenso mas, se quiser dar uma olhada em algo pode ver esse meu repositório no github que tem monta uma máquina virtual vagrant com OpenERP (algo bem complexo IMHO): https://github.com/rogeralmeida/sample-openerp-vagrant-setup

Acesso a máquina virtual

Tendo uma máquina virtual configurada, você pode acessá-la facilmente via ssh (com o comando vagrant ssh). Se você tiver a máquina virtual rodando, após executar o comando vagrant ssh você cairá no prompt da máquina virtual.
Além disso você pode configurar, para o vagrant fazer ssh port forward entre sua máquina virtual e seu host. Com isso você pode, por exemplo, subir uma aplicação na porta 3000 dentro da VM e acessar essa mesma aplicação pelo brownser do seu laptop através do endereço http://localhost:3000.
Você pode também mapear uma porta da VM para uma porta diferente no seu laptop. Ex: 3000->666

Enviando dados para a máquina virtual

O pulo do gato é, assim que você sobe uma máquina virtual vagrant, se você acessá-la via ssh e mudar para o diretório /vagrant você ira ver os arquivos que estavam no seu diretório do projeto no seu laptop.
Vagrant possui um conceito de pasta compartilhada, ou seja, pastas que existem no seu host que devem ser compartilhadas com sua máquina virtual.
Esse é o truque para conseguir desenvolver aplicações com linguagem script como Ruby e Python, no mundo java esse é o segredo para compartilhar o .m2/, por exemplo.

Considerações finais

Já tem um tempo que eu virei fan de Vagrant, e acho que todo desenvolvedor do Brasil deveria pelo menos brincar um pouco com Vagrant.
Tem várias outras coisas legai de vagrant, como por exemplo rodar direto na AWS ou subir um cluster de máquinas virtuais diretamente no seu laptop.
Se quiser ver algo de alguém que manja muito disso, dá uma olhada no post do bruninho sobre vagrant+puppet.