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;

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! 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
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
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 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?
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
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.

Olá, sou Jonathan Maia, marido, pai, apaixonado por tecnologia, gestão e produtividade. Ocupo o cargo de Secretário de Tecnologia da Informação e Comunicação do Tribunal Regional do Trabalho do Ceará (TRT7) desde 2021, onde ingressei como servidor público federal (analista de TIC) no ano de 2010. Fui diretor da Divisão de Sistemas de TIC do TRT7 entre 2018 e 2020 e também tenho experiência prévia na Dataprev, Serpro e Ponto de Presença da Rede Nacional de Ensino e Pesquisa (RNP) no Ceará.
Graduado em ciências da computação pela Universidade Federal do Ceará e especialista em gerenciamento de projetos de TIC pela Universidade do Sul de Santa Catarina. Detentor das certificações em gestão e inovação: Project Management Professional © (PMP), Professional Scrum Master II © (PSM II), Professional Scrum Master I © (PSM I), Professional Scrum Product Owner I © (PSPO I), Kanban Management Professional © (KMP II), Certified Lean Inception Facilitator® (CLF), ISO 31000:2018 Risk Management Professional © e Project Thinking Essentials.
Desenvolvedor Full Stack, possuo experiência em diversas arquiteturas / plataformas de desenvolvimento. Já tive experiências profissionais em redes metropolitanas de alta velocidade (GigaFOR/RNP), business intelligence, desenvolvimento de sistemas, gestão de projetos e produtos, governança, etc. Experiência em dezenas de projetos com abordagens de gestão ágeis, híbridas e tradicionais, incluindo projeto com menção honrosa no Prêmio de Excelência em Governo Eletrônico (e-Gov).
Com dezenas de turmas de capacitação, oficinas ou palestras ministradas nas temáticas de gestão ágil, gestão de projetos, tecnologia, inovação e produtividade nas seguintes instituições: Conselho Superior da Justiça do Trabalho (CSJT), Tribunal de Justiça do Distrito Federal e Territórios (TJDFT), Tribunais Regionais do Trabalho do Ceará (TRT7), Pará e Amapá (TRT8), Sergipe (TRT20), Rio Grande do Norte (TRT21), Tribunais Regionais Eleitorais do Ceará (TRE-CE), Mato Grosso do Sul (TRE-MS) e da Bahia (TRE-BA), Justiça Federal em Sergipe (JF-SE), Justiça Federal no Ceará (JF-CE), Companhia Siderúrgica do Pecém (CSP), Instituto Federal do Ceará (IF-CE), Instituto Federal do Rio Grande do Norte (IF-RN), Banco do Nordeste do Brasil (BNB), Gagliardi (Mobil), Udemy, Companhia Cearense de Gás (CEGÁS), Agile Trends Gov, Project Management Institute (PMI-CE), Cagece, Faculdade Estácio e Associação de Gerenciamento de Projetos do Mato Grosso do Sul (AGPMS).
Comments
Pingback: Docker e containers: Fundamentos - DevOps Parte 6 - Eu na TI