Conhecendo o Vagrant

Você conhece o Vagrant??

Você já precisou criar ambientes sem afetar a produtividade dos times de desenvolvimento? Já precisou reproduzir um ambiente no seu laptop sem gastar um centavo com nuvens públicas? Já sentiu a necessidade de reproduzir uma falha para investigar onde está o problema? Ótimo!! Neste post vamos falar de uma ferramenta que vai nos ajudar a fazer tudo isso e muito mais.

A ferramenta Vagrant, é um gerenciador máquinas virtuais, por meio de APIs ela interage com gerenciadores de VMs locais e provedores de nuvens públicas, ele utilizando uma linguagem de programação própria e comandos específicos, é possível criar e destruir máquinas virtuais, testar scripts de automação e provisionamento de configuração de ambientes. Para o nosso exemplo vamos utilizar o Vagrant e o VirtualBox como sistema de virtualização local.

Ai você me pergunta, mas Léo, por que você está falando de gerenciamento de máquinas virtuais se nós estamos na era do Docker, containers, Kubernetes? Meu caro Sysadmin, nós chegaremos nesses temas mais avançados, mas antes, precisamos passar por alguns temas importantes na formação de um sysadmin Jr. e este assunto vai ajudar no desenvolvimento de atividades nos posts futuros.

Mãos à obra então

Instalação do ambiente de testes

Os meus ambientes de testes são um Macbook OSX Versão 10.11.6 com 8GB de RAM e um Windows 10 com 16GB de RAM, os procedimentos oficiais de instalação do Vagrant podem ser encontrados em : para Linux, Windows e para MacOS.

☀ IMPORTANTE - Você também deve instalar o Oracle VM VirtualBox Extension Pack

 $ vagrant -v
  Vagrant 2.1.2
 $ vbox-img
  Oracle VM VirtualBox Disk Utility 5.2.22
  ( 2005-2018 Oracle Corporation
  All rights reserved.

Iniciando o Vagrant

O primeiro passo para interagir com o Vagrant é criar o arquivo Vagrantfile, dentro dele vão todas as instruções de

 $ mkdir infraascode ; cd infraascode
 $ vagrant init
 $ ls -las  

Esse comandos permitem criar o arquivo Vagrantfile, ele é um arquivo genérico com quase todas as opções possíveis de configuração que não serão necessárias nesse momento, mas é uma boa fonte de estudo, recomendo dar uma lida nessas opções. Para esse nosso primeiro teste vamos utilizar o Vagrantfile abaixo

Minha primeira virtual machine (VM) com Vagrant

Agora vamos criar nossa primeira máquina virtual utilizando o Vagrant, este exemplo é bem simples só para conhecermos a syntax de um script Vagrant. Com o editor de texto de sua preferência crie um arquivo chamado Vagrantfile, em seguida insira o conteúdo do exercício 01 e salve na raiz do seu projeto.

 1# -*- mode: ruby -*-
 2# vi: set ft=ruby :
 3
 4# Exercício 01
 5
 6Vagrant.configure("2") do |config|
 7
 8  hostname = "Infra-as-Code"
 9  config.vm.box = "minimal/trusty64"
10  config.vm.hostname = hostname
11  config.vm.box_url = "minimal/trusty64"
12  config.vm.boot_timeout = 3600
13  config.vm.network "private_network", type: "dhcp"
14
15  config.vm.provider :virtualbox do |v|
16   v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
17   v.customize ["modifyvm", :id, "--memory", 512]
18   v.customize ["modifyvm", :id, "--name", hostname ]
19  end
20
21end

Agora execute o seguinte comando e veja a mágica acontecer….

$ vagrant up

O que realmente acontece? O Vagrant irá baixar uma cópia da imagem do SO escolhido e fará uma cópia local, nessa primeira vez irá demorar um pouco mas nas seguintes você irá notar que será mais rápido. A partir dessa cópia inicia-se a comunicação com a API do VirtualBox passando os seguintes parâmetros:

Criar máquina sistema operacional Linux “minimal/trusty64” Com nome infra-as-code-01, Memória com 512 de RAM IP privado.

Agora execute o execute o comando abaixo e verifique se a máquina criada corresponde ao que foi especifica.

$vagrant ssh
 1Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.16.0-55-generic x86_64)
 2
 3 * Documentation: https://help.ubuntu.com/
 4Development Environment
 5Last login: Sat Aug 10 12:32:48 2019 from 10.0.2.2
 6[12:41:06 vagrant@Infra-as-Code:~] $ ls -las
 7total 36
 84 drwxr-xr-x 4 vagrant vagrant 4096 Dec 15 2015 .
 94 drwxr-xr-x 3 root  root  4096 Feb 21 2015 ..
104 -rw------- 1 vagrant vagrant  60 Aug 10 12:38 .bash_history
114 -rw-r--r-- 1 vagrant vagrant 220 Feb 21 2015 .bash_logout
124 -rw-r--r-- 1 vagrant vagrant 2273 Feb 21 2015 .bashrc
134 drwx------ 2 vagrant vagrant 4096 Feb 21 2015 .cache
144 -rw-r--r-- 1 vagrant vagrant 675 Feb 21 2015 .profile
150 -rw-rw-r-- 1 vagrant vagrant  0 Feb 21 2015 .selected_editor
164 drwx------ 2 vagrant vagrant 4096 Aug 10 12:11 .ssh
174 -rw------- 1 vagrant vagrant 906 Dec 15 2015 .viminfo

Parabéns!!! Temos a nossa primeira VM rodando e criada como infra as code!!! Se foi tão fácil assim criar… vamos destruir então e fazer o Exercício 02 execute o seguinte ….

$ vagrant destroy -f

Foi bem fácil criar e destruir uma máquina virtual, e é essa a filosofia mesmo, poder criar repetidas vezes a mesma VM utilizando infraestrutura como código. Para um analista de infraestrutura validar suas configurações e testa-las antes de jogar em nos ambientes de desenvolvimento aumenta e muito a qualidade do seu trabalho.

Vamos incrementar o nosso código no Exercício 02

Aproveitando o mesmo arquivo Vagrantfile já criado, adicione novas regras de rede para fazermos repasse de algumas portas. As novas regras irão mapear a porta 2240 para o serviço SSHD e mapear a porta 8040 para a porta 80 a VM.

 1# -*- mode: ruby -*-
 2# vi: set ft=ruby :
 3
 4# Exercício 02
 5
 6Vagrant.configure("2") do |config|
 7
 8  hostname = "Infra-as-Code"
 9  config.vm.box = "minimal/trusty64"
10  config.vm.hostname = hostname
11  config.vm.box_url = "minimal/trusty64"
12  config.vm.boot_timeout = 3600
13  config.vm.network "private_network", type: "dhcp"
14  # < Exercício 02 > 
15  config.vm.network :forwarded_port, id:"IaC regra 01", guest:22, host: 2240 , guest_ip: '10.0.2.15' , host_ip: '127.0.0.1', auto_correct: true
16  config.vm.network :forwarded_port, id:"IaC regra 02", guest:80, host: 8040 , guest_ip: '10.0.2.15' , host_ip: '127.0.0.1', auto_correct: true
17  # </ Exercício 02 > 
18  config.vm.provider :virtualbox do |v|
19   v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
20   v.customize ["modifyvm", :id, "--memory", 512]
21   v.customize ["modifyvm", :id, "--name", hostname ]
22  end
23
24end

Execute um novo comando do Vagrant para carregar o novo código de configuração sem destruir a VM criada.

$ vagrant reload

Ao fim desse comando podemos validar o repasse de portas executando um ssh para localhost na porta 2240 , conforme descrito na regra “Iac regra 01”.

ssh vagrant@localhost -p 2240
 1ssh vagrant@localhost -p 2240
 2vagrant@localhost's password:
 3Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.16.0-55-generic x86_64)
 4
 5 * Documentation: https://help.ubuntu.com/
 6Development Environment
 7Last login: Sat Aug 10 12:41:06 2019 from 10.0.2.2
 8[13:31:05 vagrant@Infra-as-Code:~] $ ls
 9[13:31:07 vagrant@Infra-as-Code:~] $ ls -las
10total 36
114 drwxr-xr-x 4 vagrant vagrant 4096 Dec 15 2015 .
124 drwxr-xr-x 3 root  root  4096 Feb 21 2015 ..
134 -rw------- 1 vagrant vagrant  81 Aug 10 12:55 .bash_history
144 -rw-r--r-- 1 vagrant vagrant 220 Feb 21 2015 .bash_logout
154 -rw-r--r-- 1 vagrant vagrant 2273 Feb 21 2015 .bashrc
164 drwx------ 2 vagrant vagrant 4096 Feb 21 2015 .cache
174 -rw-r--r-- 1 vagrant vagrant 675 Feb 21 2015 .profile
180 -rw-rw-r-- 1 vagrant vagrant  0 Feb 21 2015 .selected_editor
194 drwx------ 2 vagrant vagrant 4096 Aug 10 12:11 .ssh
204 -rw------- 1 vagrant vagrant 906 Dec 15 2015 .viminfo

Os comandos apresentados são comandos básicos, mas, para um contato inicial com o Vagrant são bem importantes e já fazem você sair brincando com alguma coisa. Certamente o Vagrant muito mais poderoso do que mostramos aqui, nos posts seguintes vamos mostrar comandos mais avançados.

Todos os códigos deste post estão em disponíveis em https://github.com/leoml/blog-infraascode/tree/master/posts/Conhecendo-o-Vagrant


Eu adoraria ouvir suas outras histórias e situações semelhantes ao que acabei de escrever neste post, você pode me encontrar em @infraascode_br ou linkedin.com/in/leonardoml/ .

Te convido a ver os outros posts do blog Infra-as-Code garanto que tem coisas legais lá!!


--- --- IMPORTANTE --- ---
As opiniões aqui expressas são pessoais e de responsabilidade única e exclusiva do autor, elas não refletem necessariamente a posição das empresas que eu trabalho(ei) e/ou presto(ei) serviço.