Vagrant: Turbine suas VMs e ambientes de desenvolvimento – DevOps Parte 1

Em DevOps, Sistemas operacionais por Jonathan Maia

Se você não conhece, DevOps é uma mistura de cultura, práticas e ferramentas que visam diminuir as barreiras entre times de Desenvolvimento (Dev) e Operações (Ops), entregando valor continuamente para as áreas de negócio e maximizando a utilização dos recursos de TI. Olha a definição da Amazon:

O DevOps é a combinação de filosofias culturais, práticas e ferramentas que aumentam a capacidade de uma empresa de distribuir aplicativos e serviços em alta velocidade: otimizando e aperfeiçoando produtos em um ritmo mais rápido do que o das empresas que usam processos tradicionais de desenvolvimento de software e gerenciamento de infraestrutura. Essa velocidade permite que as empresas atendam melhor aos seus clientes e compitam de modo mais eficaz no mercado.

As ferramentas de automação são um dos pilares dos ambientes DevOps, e hoje, vamos começar pelo Vagrant, que facilita o gerenciamento de máquinas virtual e ambientes de desenvolvimento completamente replicáveis.

Este artigo inicia uma série de postagens sobre as ferramentas que são rotineiramente utilizadas em ambientes DevOps.

Nos próximos artigos, vamos abordar o Packer, Puppet, Docker, até chegar em um ambiente de desenvolvimento totalmente replicável e versionável (em um Git ou SVN da vida), integrando tudo com uma IDE e um servidor web ou servidor de aplicação. Embora não seja estritamente necessário o uso do Vagrant para a montagem desse ambiente, você compreenderá nas próximas postagens porque decidi utilizá-lo.

Virtualização

A virtualização é uma tecnologia bastante disseminada no mundo da TI: em um sistema hospedeiro (host), temos a possibilidade de executar diversos sistemas operacionais convidados (guests) através do Hypervisor, que abstrai os recursos do host e fornece-os aos guests.

Dá uma olhada na figura a seguir:

Fonte: Docker.com

Observe que na camada mais baixa temos a infraestrutura do hospedeiro. Logo acima do hospedeiro, vem o hypervisor e então as diversas máquinas virtuais (com seus sistemas operacionais completos, bibliotecas, aplicações, etc). Quando chegarmos no artigo sobre Docker, você entenderá que existe uma forma de aproveitar melhor todos esses recursos duplicados (por isso o danado do Docker faz tanto sucesso).

Entre as ferramentas de virtualização mais famosas, podemos citar o VMware, VirtualBox, Xen e o QEMU.

Supondo que estou em um Windows e quero executar um Ubuntu, o “passo a passo” mais tradicional para a disponibilização de uma máquina virtual seria:

  • Instalar um software de virtualização (como exemplo VirtualBox) no Windows;
  • Baixar uma imagem do Ubuntu;
  • Executar o VirtualBox;
  • Criar uma nova máquina virtual;
  • Montar a imagem do Ubuntu na máquina virtual para instalação;
  • Realizar a instalação completa do Ubuntu;
VirtualBox - Ubuntu

Criação de uma máquina virtual no VirtualBox

Trabalheira, né ? Esse processo completo pode levar um tempo considerável.

Para piorar, suponha que você fez todos os passos acima, mas esqueceu de fazer um snapshot (salvar o estado) ou de exportar uma appliance (um arquivo completo da máquina que pode ser importado em outros locais) da sua máquina redondinha. Daí, alguns dias depois, sem querer, você fez alguns passos que bagunçaram o Ubuntu. Como voltar ao estado redondinho sem um snapshot ou sem uma appliance ?

Senta e Chora

Senta e chora! Vai ter que montar a máquina novamente: processo doloroso.

Pois é, já pensou se você tivesse como subir uma máquina virtual do Ubuntu sem ter que instalá-lo do zero?

Vagrant

Em essência, o Vagrant (open source, licença MIT) permite a criação e o gerenciamento de máquinas virtuais e imagens (chamadas de box). As boxes são como “modelos” para a criação das máquinas virtuais.

Como exemplo, existe uma box do Vagrant chamada ubuntu/trusty64 (diga-se de passagem, imagem oficial,  disponibilizada pelo time do Ubuntu), que nos permite criar uma ou várias máquinas virtuais do Ubuntu Server 14.04 LTS, sem ter que passar por todo aquele processo de instalação do sistema operacional. Basta indicar ao Vagrant que ele deve subir uma máquina virtual baseada nessa imagem e ele já vai te dar a máquina rodando em poucos minutos (o Vagrant baixa a box e sobe a VM).

Você pode buscar pelas boxes disponíveis aqui. Observe que tem de tudo:  Debian, Ubuntu, CentOs, OracleLinux, … Várias imagens são disponibilizadas pelas próprias equipes das distribuições Linux, dando uma maior confiança para utilização.

Pesquisa de boxes disponíveis para Vagrant

Pesquisa de boxes disponíveis para Vagrant

Você pode, inclusive, construir sua própria box personalizada com o Packer e disponibilizar para outros usuários na página acima. É bem simples e você pode até mesmo converter uma appliance do VirtualBox em uma box do Vagrant. Também é possível manter suas boxes em um ambiente local (ex: em um Apache na sua rede corporativa) e só apontar para a URL da box.

O mais legal é que o Vagrant trabalha com vários providers, que são as ferramentas que realmente fazem a virtualização, assim, podemos mandar o Vagrant subir uma máquina virtual que na verdade está sendo executada pelo VirtualBox, pelo VMWare ou até mesmo na AWS. Nos exemplos abaixo, usaremos o VirtualBox como provider (é o provider padrão do Vagrant).

Instalação

Como você pode ver na página de instalação do Vagrant, ele está disponível para Windows, Linux e Mac Os, ou seja, é possível recriar seus ambientes em praticamente qualquer lugar.

Para utilizar o Vagrant com o VirtualBox como provider, temos que instalar as duas ferramentas.  Você pode baixar os instaladores diretamente nos sites ou utilizar gerenciadores de pacotes.

Vou instalá-las utilizando o gerenciador de pacotes para Windows Chocolatey, que abordei recentemente aqui no Blog:

D:\> choco install virtualbox
D:\> choco install vagrant

Nas últimas pesquisa do Stack Overflow, o Windows ainda é o sistema operacional mais utilizado pelos desenvolvedores, por isso, vamos utilizá-lo aqui (no Linux e MacOS os passos são idênticos).

Vagrantfile

Agora, com VirtualBox e Vagrant instalados, vamos criar nosso primeiro Vagrantfile.

O Vagrantfile é um arquivo que mantem todas as configurações da sua máquina virtual:

  • Box utilizada;
  • Redirecionamento de portas entre convidado e hospedeiro;
  • Configurações de rede;
  • Compartilhamento de arquivos e de diretórios entre convidado e hospedeiro;
  • Passos para provisionamento (instalar pacotes e configurar todos serviços e componentes necessários para seu ambiente – veremos em breve).

Para criar um Vagrantfile para a box ubuntu/trusty64, utilize o comando:

D:\git\devops\01_vagrant_ubuntu_apache> vagrant init ubuntu/trusty64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Observe que um arquivo Vagrantfile foi criado no diretório onde você executou o comando. Em essência, ele possui o conteúdo:

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
end

Ou seja, config.vm.box indica a box que será utilizada pela VM.

Observe que uma das coisas mais interessantes do Vagrantfile é a possibilidade de versioná-lo em um Git ou SVN. Veremos que no Puppet e no Docker também podemos versionar os arquivos de configuração, assim, podemos tratar nossa infra como código (Infra as Code) e versioná-la junto aos códigos das nossas aplicações. Legal, né?

Para subir a VM, na pasta onde está o Vagrantfile, utilize o vagrant up:

Com o vagrant up, o Vagrant baixa a box (caso ainda não tenha sido baixada anteriormente) e sobe a máquina virtual baseada na box. Dependendo da sua conexão, em uns 5 a 10 minutinhos já está tudo pronto.

Comandos

Para conectar na máquina, utilize o comando vagrant ssh:

D:\git\devops\01_vagrant_ubuntu_apache> vagrant ssh
vagrant@vagrant-ubuntu-trusty-64:~$ uname -a
Linux vagrant-ubuntu-trusty-64 3.13.0-128-generic #177-Ubuntu SMP Tue Aug 8 11:40:23 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Observe que você acessa a máquina com o usuário vagrant, que tem permissão para executar sudo.

Dá uma olhada na lista de comandos do Vagrant:

Compartilhamento de arquivos e mapeamento de portas

Na pasta onde está o Vagrantfile, ainda no Windows, crie um arquivo de exemplo chamado index.html com o conteúdo:

<html>
  <h1>Hello World!</h1>
</html>

Agora, na máquina virtual, liste o conteúdo da pasta /vagrant :

vagrant@vagrant-ubuntu-trusty-64:~$ ls /vagrant
index.html  Vagrantfile
vagrant@vagrant-ubuntu-trusty-64:~$ cat /vagrant/index.html
<html>
  <h1>Hello World!</h1>
</html>
vagrant@vagrant-ubuntu-trusty-64:~$

Sacou ? O Vagrant já cria um compartilhamento da pasta onde está o Vagrantfile para o caminho /vagrant .
Vamos brincar um pouco com compartilhamentos e redirecionamento de portas.

Na VM, vamos atualizar o apt-get e instalar o Apache:

vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get update
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get install apache2

Agora, no Vagrantfile, mapearemos a porta 80 do convidado (VM) para a 8080 do hospedeiro (host Windows).

Basta descomentar a seguinte linha no Vagrantfile:

config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

Salve o Vagrantfile, saia da VM com um exit e faça um reload no Vagrant (ele vai reiniciar a máquina virtual e ler o novo Vagrantfile):

vagrant@vagrant-ubuntu-trusty-64:~$ exit
logout
Connection to 127.0.0.1 closed.
D:\git\devops\01_vagrant_ubuntu_apache> vagrant reload

Espere a máquina reiniciar e, no Windows, acesse em seu navegador a URL: http://localhost:8080 . Tcharammm:

 

Apache rodando na VM

Apache rodando na VM

Show de bola! Agora, para fechar com chave de ouro, vamos compartilhar nosso html na pasta dos htmls do apache.

Vamos criar na mesma pasta do Vagrantfile uma pasta chamada html e mover nosso index.html para lá. Agora, no Vagrantfile, adicione:

config.vm.synced_folder "./html", "/var/www/html"

A linha acima sincroniza a pasta html do nosso Windows no caminho /var/www/html do Ubuntu, exatamente o caminho onde o Apache busca pelos htmls.

Faça um novo vagrant reload e quando a máquina reiniciar acesse novamente http://localhost:8080 a partir do Windows. Agora, vemos nosso Hello World!:

Hello World no Aoache da máquina virtual!

Hello World no Apache da máquina virtual!

Beleza, já vimos como escolher uma box, como redirecionar portas e como compartilhar diretórios.

E se eu matar essa máquina virtual, Jonathan? O que acontece ? Você vai perder seu apache. Instalamos o Apache na mão após fazer o vagrant up. E agora ?

Provisionamento

Ao subir a máquina virtual a partir de uma box, é possível indicar ao Vagrant para executar scripts ou ferramentas para o provisionamento do ambiente virtualizado. Mas o que é provisionamento ?

Provisionamento é a disponibilização de todos pacotes, arquivos, configurações e serviços necessários para sua máquina virtual, ou seja, é o passo que vai deixar sua máquina virtual devidamente configurada para a finalidade desejada.

Assim, no nosso exemplo anterior, um dos passos que o provisioner (ferramenta para qual o Vagrant delega o provisionamento) precisaria cuidar é o da instalação do Apache no nosso ambiente. Olha a lista de provisioners que o Vagrant suporta: Shell, Ansible, Chef, Docker, Puppet e Salt. Dá pra provisionar a máquina com a ferramenta que mais lhe agrada.

Agora, vamos adicionar no nosso Vagrantfile a seguinte diretiva, que utiliza como provisioner o próprio Shell (uma das maneiras mais simples de realizar o provisionamento da máquina):

config.vm.provision "shell", inline: <<-SHELL
  apt-get update
  apt-get install -y apache2
SHELL

Nos próximos artigos, vamos utilizar o Puppet (uma ferramenta de gerenciamento de configuração bem mais robusta para provisionamento) como provisioner.

Para você ver tudo funcionando do zero, vamos fazer um vagrant destroy (destroi a máquina virtual completamente, diferente do halt, que apenas desliga a máquina) e depois um vagrant up.

Viu que o Vagrant, logo após subir a máquina, executou o script Shell de provisionamento ? Agora acessa lá localhost:8080. O que apareceu?

Apache rodando na VM

Hey, cade meu Hello World ? Vamos entender o que aconteceu:

  • Vagrant compartilhou seu index.html no /var/www/html
  • Quando o provisioner Shell instalou o Apache ele também criou um index.html no caminho /var/www/html/index.html
  • Olhe o conteúdo do index.html no seu Windows. Você perdeu o conteúdo anterior e agora ele é a página padrão do Apache.

Para evitar esse problema, podemos mudar nosso index.html para outro nome ou mudar o Vagrantfile para:

config.vm.synced_folder "./html", "/var/www/html/hello"

Faça um vagrant reload e edite o index.html para a segunda versão:

<html>
  <h1>Hello World 2!</h1>
</html>

Acesse http://localhost:8080/hello/ e então:

Nova versão do Hello World

Nova versão do Hello World

Para ver a versão final, acesse o projeto devops no meu Github. Vou ficar colocando todos os códigos nesse projeto para referência.

Conclusão

Depois dessas brincadeiras com o Vagrant, podemos extrair alguns dos benefícios ao utilizá-lo:

  • Possibilidade de subir uma máquina virtual sem a necessidade de instalar o sistema operacional do zero;
  • Possibilidade de versionamento do Vagrantfile (trato minha infra como código);
  • Passar um ambiente para outra pessoa resume-se a passar o Vagrantfile, ou seja, seu ambiente será totalmente replicável em alguns minutos sem maiores complicações;
  • A utilização do Vagrant com as ferramentas de provisionamento permite replicar em nossos ambientes de desenvolvimento os ambientes reais de homologação e produção;

E Jonathan, quando passarmos a utilizar o Docker, ainda precisamos virtualizar nosso ambiente de desenvolvimento ? Não necessariamente, mas na minha humilde opinião: se sua máquina de desenvolvimento não é idêntica às suas homologações e produções (NUNCA É), virtualizar o SO que executará o docker server (de maneira idêntica aos seus ambientes produtivos) diminui ainda mais a possibilidade de usar a velha frase: funcionava na minha máquina!

Espero que você tenha gostado: fique atento nas próximas postagens!

Próximos artigos:

Vagrant: Crie sua própria box e disponibilize-a na Vagrant Cloud – DevOps Parte 2

Gerenciamento de configuração e automação de servidores – DevOps Parte 3

Puppet: Instalação e fundamentos – DevOps Parte 4

Puppet: Subindo seus primeiros serviços e o Docker – DevOps Parte 5

Docker e containers: Fundamentos – DevOps Parte 6

Agradeço se você puder curtir e compartilhar esse artigo em suas redes sociais.

Curta nossas páginas nas redes sociais para acompanhar novas postagens.

Em breve, mais conteúdos de qualidade para você aqui no Blog Eu na TI, o seu Blog sobre Tecnologia da Informação.

Um forte abraço e até mais.

 

Comentários

  1. Pingback: Docker e containers: Fundamentos - DevOps Parte 6 - Eu na TI

Deixe uma resposta