Vagrant Descomplicado: Um Guia Prático
A minha ideia é te ensinar a usar as principais funcionalidades do Vagrant em apenas um artigo, de forma simplificada e rápida. Você vai aprender o que é, para que serve, quais as suas funcionalidades e vai subir uma VM comigo no decorrer do artigo!
Tópicos
Introdução
O que é IaC?
IaC, ou Infraestrutura como Código, é uma abordagem na qual a infraestrutura de TI é gerenciada e provisionada usando código, em vez de configurações manuais. Sendo assim, facilita a automação e gestão ágil dos ambientes, chega de “na minha máquina funciona”.
O que é um Hypervisor?
Um hypervisor é um software ou firmware que permite a execução de máquinas virtuais (VMs) em um único hardware físico. Ele age como uma camada de virtualização entre o hardware físico do computador e os sistemas operacionais convidados, permitindo que vários sistemas operacionais compartilhem o mesmo hardware simultaneamente. Nós iremos utilizar VirtualBox para subir as nossas VMs com o Vagrant.
O que é uma VM (Virtual Machine)?
É um software que simula um ambiente de computador físico e permite a execução de sistemas operacionais e aplicativos como se estivessem em hardware físico real.
O que é o Vagrant?
É uma ferramenta de linha de comando utilizada para agilizar todo o WorkFlow de uma VM, também, controlar todo o LifeCycle da VM. Nós manipulamos um Hypervisor por meio de comandos Vagrant, ele traduz os comandos enviados para os comandos do Hypervisor utilizado. O Vagrant abstrai detalhes específicos do hypervisor, proporcionando uma abordagem consistente e portátil para configuração de ambientes. O uso de arquivos de configuração (Vagrantfiles) permite uma configuração fácil e rápida de ambientes.
Imagina que você subiu um ambiente de Dev com tudo, quer adicionar esse ambiente em um outro servidor ou enviar para uma pessoa? Compartilhe o VagrantFile.
Instalando o Ambiente
Você precisa apenas fazer o download e instalar. Depois, podemos avançar para os próximos tópicos.
Iniciando com uma Box
Uma Box é basicamente o sistema operacional que você vai virtualizar. Ou seja, uma Box é uma VM empacotada em um arquivo chamado Box. O Vagrant tem uma comunidade onde as pessoas compartilham as suas Boxes, chamada Vagrant Cloud. Mas você também pode criar uma Box própria.
Imagine que no seu ambiente você utiliza o SQL Server, Power BI e outras ferramentas. Com o Vagrant, você poderia baixar uma Box com apenas o sistema operacional Windows, instalar o que você precisa e, depois, fechar uma Box sua. Assim, você iria compartilhar uma Box pronta para os ambientes ou compartilhar com a comunidade!
Comandos:
Vamos imaginar que você quer baixar o Box do windows no seu servidor
1
vagrant box add gusztavvargadr/windows-server-2019-standard
Baixou algumas Boxes? Vamos lista-las
1
vagrant box list
Listar opções de comando do vagrant box (Você pode usar o -h para todos os comandos)
1
2
3
vagrant box -h (Geral)
vagrant box list -h (Específico)
Quer verificar se existe alguma Box desatualizada no seu servidor?
1
2
3
vagrant box outdated (No próprio diretório)
vagrant box outdated -- global (Vai verificar todas que tenho no servidor)
Quer remover a que está desatualizada?
1
vagrant box prune (Vai remover todas as desatualizadas)
Ou… atualizar as mesmas sem danificar?
1
vagrant box update
Caso você queira remover apenas uma Box específica.
1
vagrant box remove vm/name
Esses são os comandos principais para você utilizar e baixar uma Box, vou deixar o meu cmd como exemplo:
Gerenciando uma Box
O VagrantFile é a magia do Vagrant, do que adianta ter uma VM se você não consegue manipular a mesma? Bom, isso acabou…
O VagrantFIle é o local em que adicionaremos/modificaremos todas as configurações necessárias para subir a nossa VM. Você pode configurar opções de rede, hardware e até mesmo Shell Scripts para automatizar instalações.
Criando um VagrantFile
Essa é a etapa que interessa, é aqui que vamos iniciar a primeira etapa com o Vagrant.
Comandos:
Para criar um VagrantFile, utilize o comando no seu repositório:
1
vagrant init vm/name
Ele vai verificar se a Box já foi instalada (Instalamos com o vagrant box add) Se ela não estiver sido instalada, ele irá instalar.
Esse é um exemplo do VagrantFile criado (Ele vem cheio de comentários, eu removi e deixei só o que importa nesse primeiro momento):
1
2
3
4
5
6
7
8
Vagrant.configure("2") do |config|
config.vm.box = "peru/windows-server-2019-standard-x64-eval" # Box utilizada
config.vm.provider "virtualbox" do |vb| # Hypervisor utilizado
vb.memory = "1024" # Memória disponibilizada
vb.cpus = 10 # Configuração de CPUs
vb.name = "Article Test 01" # Nome da VM no Hypervisor
end
end
Pronta para subir a mesma? Só rodar o seguinte comando no diretório:
1
vagrant up
E aguardar…
Mas em poucos instantes, sua VM está no ar!
Comandos para Manipular uma VM
Vou listar alguns dos comandos principais que você precisa saber para manipular a sua VM no ar.
Comandos:
Verificar o Status da VM
1
vagrant status
Desligar a VM
1
vagrant halt
Subir a VM (Se existir - Liga/Se não - Cria)
1
vagrant up
Suspende a VM
1
vagrant suspend
Reiniciar a VM
1
vagrant reload
Destruir ou Remover a VM
1
vagrant destroy (y/n?)
Configurando Redes, Hostname e Liberando Porta na VM
Para configurar as redes, nós temos duas opções: NAT ou BRIDGE.
NAT - É uma tecnologia usada para compartilhar uma conexão de internet com vários dispositivos em uma rede local. O roteador recebe um endereço IP público da internet e atribui um endereço privado a cada dispositivo na rede local. Assim, o roteador traduz os endereços IPs privados para os público, permitindo que dispositivos na rede acessem a internet.
BRIDGE - É uma tecnologia utilizada para conectar duas ou mais redes locais em uma única rede. Uma ponte (Bridge) é um dispositivo que conecta duas redes e permite que os dispositivos em uma rede se conectem aos dispositivos de outra rede, como se estivessem na mesma rede.
No meu exemplo, eu vou escolher o NAT.
Exemplos: Conexão NAT - DHCP.
1
2
3
4
5
6
Vagrant.configure("2") do |config|
config.vm.network "private_network", type: "dhcp"
config.vm.box = "peru/windows-server-2019-standard-x64-eval" # Box utilizada
end
Conexão NAT - IP Fixo
1
2
3
4
5
Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "192.168.25.10"
config.vm.box = "peru/windows-server-2019-standard-x64-eval" # Box utilizada
end
Após definirmos o tipo da rede, podemos fornecer um exemplo de porta.
Suponha que a máquina virtual (VM) que você está iniciando seja responsável por um servidor SQL, e que seja necessário estabelecer uma conexão com o SQL Server. Para realizar isso, é necessário liberar a porta associada ao SQL Server - por padrão é a 1433.
1
2
3
4
5
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 1433, host: 1433
config.vm.box = "peru/windows-server-2019-standard-x64-eval" # Box utilizada
end
guest: 1433
: Especifica que a porta no ambiente da máquina virtual (o “convidado”) é a 1433.host: 1433
: Indica que a porta no ambiente do host (a máquina física que está executando a VM) é também 1433.
O Hostname é a última etapa que quero abordar neste capítulo, com ele vamos especificar um nome para a conexão em nossa rede local. Por exemplo, nós criamos a nossa rede em NAT, para conectar na máquina remotamente, precisaremos nos conectar pelo IP. O problema disso é: nosso IP não é fixo!
Quando utilizamos o hostname, isso não é necessário. Podemos nos conectar pelo hostname!
1
2
3
4
5
6
Vagrant.configure("2") do |config|
config.vm.box = "peru/windows-server-2019-standard-x64-eval" # Box utilizada
config.vm.hostname = "VMEXARTICLE"
end
Assim ficou o nosso VagrantFile após os aprendizados deste capítulo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Vagrant.configure("2") do |config|
config.vm.box = "peru/windows-server-2019-standard-x64-eval"
config.vm.network "forwarded_port", guest: 1433, host: 1433
config.vm.network "private_network", type: "dhcp"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 10
vb.name = "Article Test 01" # Nome da VM no Hypervisor
end
config.vm.hostname = "VMEXARTICLE"
end
Você pode reiniciar a VM para aplicar as alterações. Para testar o hostname, faça um PING VMEXARTICLE.
Scripts Shell para Automatizar Tarefas
Isso sem sombra de dúvidas é o que mais amo no Vagrant, você pode rodar Scripts Shell (Ou Bash Scripts se for Linux), de forma totalmente automatizada.
Nesse exemplo eu vou liberar o Firewall da máquina, você pode fazer de duas maneiras.
Especificando o comando direto no VagrantFile
1
2
3
config.vm.provision "shell", inline: <<-SHELL
netsh advfirewall set allprofiles state off
SHELL
Especificando um path para o comando (Ele precisa estar no mesmo diretório do VagrantFile)
1
config.vm.provision "shell", path: "disable_firewall.ps1"
Quero que você dê uma pausa aqui e pense… quantas coisas é possível fazer com essa automatização?
Caso a sua máquina tenha subido, não é necessário reiniciar para que os scripts Shell rodem. Você pode realizar o seguinte comando:
1
vagrant provision
Ele vai identificar qual parte no VagrantFile possue o “config.vm.provision” e rodar todos. Segue exemplo:
VagrantFile final:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Vagrant.configure("2") do |config|
config.vm.box = "peru/windows-server-2019-standard-x64-eval"
config.vm.network "forwarded_port", guest: 1433, host: 14330
config.vm.network "private_network", type: "dhcp"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 10
vb.name = "Article Test 01"
end
config.vm.hostname = "VMEXARTICLE"
config.vm.provision "shell", inline: <<-SHELL
netsh advfirewall set allprofiles state off
SHELL
end
Simples, não? ;)
Criando uma BOX
Imagine esse cenário agora: Você instalou tudo que era necessário para o ambiente do projeto e deseja escalar o mesmo para o servidor de produção.
O que podemos fazer? Nós podemos fechar a NOSSA Box - vamos empacotar a Box em um arquivo .box
Exemplo:
Criando o arquivo .box da nossa VM
1
vagrant package --output article_test.box
vagrant package
: é o comando, você pode adicionar o -h para ver as outras opções do mesmo--output
: Complemento do comando para exportar a Boxarticle_test.box
: Nome dado para a nossa Box
Após criar o arquivo .box, você precisa adicionar ela em sua lista de Boxes. Igual fizemos no primeiro exemplo, quando puxamos a nossa VM do Vagrant Cloud. Porém, agora vamos buscar localmente!
Adicionando a nossa Box na lista de Boxes
1
vagrant box add --name article-test article_test.box
vagrant box add
: Comando para criar a Box-- name article-test
: Nome que você vai dar para a Boxarticle_test.box
: Nome que foi dado para o arquivo .Box
Pronto! Você tem uma infra como código agora…
Se te interessou, pesquise mais sobre o assunto, o Vagrant tem muito mais a oferecer. Garanto que não vai se arrepender!
Obrigado por ler até aqui!