Virtualização de Ambientes - Uma introdução ao Vagrant - Parte 1

Atualmente no processo de desenvolvimento de software existem atividades que podem se tornar complexas ou mesmo serem complexas por natureza, e no meio dessas atividades temos a configuração de ambientes em um time de TI, essa é uma das tarefas em que mais perdemos tempo e esforço. Montar um ambiente de trabalho ou ambientes para desenvolvimento, QA ou produção é um processo repetível, propenso a erros e consequentemente mais tempo e esforço para consertar. Com isso em mente, precisamos entender quais os problemas isso acarreta mais a fundo.

Ser virtualizado ou aceitar os problemas de não ser?

WLW-TheMatrix_1210F-Red-Pill-Blue-Pill_21

Os problemas de não ser virtualizado

As tecnologias por trás de um projeto em TI tem se tornado cada vez mais complexa para atender as demandas e novos desafios. Antigamente tínhamos um web-server, um banco de dados e uma linguagem de programação, e o ambiente estava pronto para rodar o projeto. Agora temos uma grande quantidade de projetos  rodando com servers distribuídos, banco de dados poliglotas, tecnologias backend e frontend, load balancers, Restful API e etc.

Com isso, cada projeto tem seu catalogo de tecnologias que são determinadas com o objetivo de atender a exigência que o software necessita alcançar, como escalabilidade, performance, segurança, etc. Podemos notar quão complicado pode ser gerenciar ambientes para cuidar de vários projetos com tecnologias diferentes, e é preciso lembrar que normalmente trabalhamos em equipe, cada membro da equipe precisa do ambiente de cada projeto, que pode variar, e precisamos garantir que todos vão ter o mesmo ambiente para trabalhar, devemos garantir que todos vão ter a infraestrutura correta e devemos garantir que será rápido a configuração de um novo ambiente.

Esses fatores, tornam a manutenção da infraestrutura cada vez mais complicada se não houver automatização, fazer esse processo de forma manual é propenso a erros, custoso e uma grande perda de tempo. Imagine configurar múltiplos ambientes para novas equipes, e imagine que o número de pessoas aumente e o de projetos também, fazer de forma manual com certeza não é a melhor solução.

E a solução, cadê?

Virtualizar o ambiente é a solução para esse tipo de problema que se tornou comum atualmente. Ao invés de travar essa guerra para configurar um ambiente que possa contemplar todos os projetos, cada projeto vai ter seu próprio ambiente virtualizado, vai ter web servers dedicados, bancos de dados poliglotas, múltiplas linguagens de programação, load balancers e etc. Por ser um sistema virtualizado não existe a possibilidade de um ambiente causar impacto no ambiente de outro projeto. Automaticamente organizamos os projetos, documentamos o ambiente para cada projeto, utilizamos o ambiente exato que precisamos para o projeto, entre outras melhorias.

Quando fazemos a virtualização de um ambiente para um projeto podemos normalmente virtualizar o mesmo ambiente para desenvolvimento, QA, produção e etc. Independente da maquina física que for utilizada, a virtualização sempre terá sua configuração especifica, gerando o mesmo estado em qualquer maquina diferente, independente de sua configuração local, tanto de infra ou de sistema operacional.

Virtualizar os ambientes dos projetos de um time de TI é a solução para o problema de configuração, porém a configuração para fazer isso e gerenciar pode não ser tão simples assim. É necessário configurar cada ambiente para cada projeto, e com isso pode ser necessário conhecimento em administração de sistemas e, claro, é necessário ser simples inicializar e utilizar esses ambientes de uma forma rápida e ágil. Um sistema virtualizado por padrão não é nada portável, pois é uma imagem completa de um sistema operacional configurado. Temos alguns problemas, é necessário exportar esses sistemas virtualizado entre a equipe, o que é problemático, imagens de sistemas operacionais são grandes, e manter atualizados essas imagens para todos os membros da equipe é impraticável, sempre haverá atualização a ser feita, manutenção, adoção de novas tecnologias e etc. Ou seja, soluciona o primeiro problema, mas traz outros problemas por ainda ser um processo manual, não é a solução que precisamos.

Então vamos falar sobre a solução que precisamos, uma ferramenta que gerencia esses ambientes virtualizado para nós, automatize, provenha uma interface simples para se configurar e necessite simplesmente de um arquivo de texto para funcionar. É isso que estamos procurando como solução ideal, mas que ferramenta faz isso?

O Vagrant.

O que é o Vagrant?

Vagrant é uma ferramenta poderosa para gerenciamento e suporte de ambientes virtualizado. Ao invés de rodar todos os projetos localmente, tendo que tratar vários problemas com a dificuldade de configurar um sistema operacional inteiro pra isso, será possível rodar um ambiente virtual totalmente dedicado para cada projeto de forma automatizada.

Com uma linha de comando de fácil manuseio, o Vagrant provê simplicidade ao configurar os ambientes, e também pode de forma fácil interagir com o próprio sistema operacional local da maquina, existe o ganho de compartilhar a workspace local do projeto em um ambiente virtualizado, o código pode ficar local na máquina e pode utilizar tudo configurado no ambiente virtualizado.

O que não é o Vagrant!

  • O Vagrant não é uma ferramenta de provisionamento de software!

De forma básica, o Vagrant irá inicializar a máquina virtual e chamar a ferramenta de provisionamento para configurar o sistema virtualizado, esse é o passo mais automatizado que buscamos para a Virtualização de Ambientes, e é lá que vamos chegar!

  • O Vagrant não é o Docker!

Ou vice-versa, são duas ferramentas diferentes, que podem trabalhar juntas. Essa duvida é gerada pela similaridade de conceito entre elas. O conceito é tratar o ambiente de software como código, esse código deve ser versionado e compartilhado entre a equipe que o utiliza, porém, a finalidade com que cada ferramenta usa o ambiente como código é o que diferencia uma da outra.

Temos um ótimo post no blog que explica de forma consistente como funciona essa diferença, para entender melhor, veja: Docker – Perguntas Frequentes.

E tudo isso funciona...

Com o Vagrant utilizando providers para a virtualização do sistema, por padrão utiliza o Vitual Box, porém, pode utilizar o VMWare, AWS, etc. A configuração inteira é feita com um simples arquivo em texto puro, o Vagrantfile. O Vagrantfile é um arquivo de configuração para a Virtual Machine ser criada, ele define as configurações de hardware de cada box. E o arquivo de provisionamento para configuração que define como cada maquina com o Vagrant será configurada(Shell Scripts, Ansible Playbooks, Chef Cookbooks ou Puppet Manifests) em arquivos de texto. Isso no fim significa como será possível compartilhar essas configurações com todos os membros da equipe pelo sistema de controle de versão.

A curva de aprendizado para realizar esse procedimento é pequena, existem inúmeros Vagrantfile pré-configurados com provisionadores que podem ser a solução para o ambiente, ou necessitar de apenas poucas mudanças. Montar isso pode ser questão de alguns minutos, claro, não levando em conta o tempo de download dos softwares.

Por isso dizemos que ele é um gerenciador, o único trabalho que o Vagrant faz de fato é fazer o download do box, que não é nada mais que o sistema virtualizado e a configuração do hardware. O resto é delegado para as outras ferramentas, a virtualização é feita pelo provider e a instalação e configuração dos softwares é feita pelo provisionador.

Alguns benefícios:

  • Seu ambiente de desenvolvimento pode emular o de produção, ou qualquer outro;
  • Cada projeto é separado em seu próprio ambiente virtualizado, então problemas vindo com configuração serão resolvidos de vez;
  • “Funciona na minha maquina” como resposta para algum bug é uma coisa do passado;
  • É possível fazer uma avaliação dentro da equipe sobre a forma como os ambientes estão configurados, para verificar como pode ser melhorado;
  • Ferramentas de provisionamento como o Puppet, Chef e Ansible permitem que você guarde a configuração em uma forma padrão, que pode ser usada para atualizar os ambientes;
  • A dor de cabeça de passar código que você escreveu localmente com seu ambiente virtualizado é resolvida com pastas sincronizadas pelo Vagrant;
  • Compartilhar todos os ambientes configurados com a equipe de desenvolvimento;
  • Novos membros de equipe podem rodar tudo com apenas um comando e em alguns minutos, utilizando git clone && vagrant up.

Conclusão

Concluímos que é enorme a necessidade de automatizar processos que são complicados e trabalhosos, e demandam muito tempo. Esses processos podem ser e devem ser feitos de forma automatizada, a produtividade da equipe cresce quando automatizamos processos que são repetíveis e manuais. É importante salientar que somente o conceito de virtualizar ambientes não resolve o problema por completo, precisamos de uma ferramenta que implemente esse conceito, automatize e gerencie, por isso a introdução ao Vagrant, e também uma breve explicação sobre.

Em um próximo artigo, vamos colocar a mão na massa e entender como utilizar o Vagrant. Nada melhor do que além de solucionar o problema, seja fácil também de manusear, e é isso o que ele propõe, solução e praticidade.