- Publicado em
Usando o Vagrant para criar laboratórios virtuais - Parte II
- Autores
- Nome
- Felipe Padilha
Índice
Introdução
Neste artigo, vamos montar um laboratório local utilizando Vagrant para provisionar três servidores Nginx, cada um servindo uma página HTML simples que exibe seu próprio hostname. Além disso, configuraremos um quarto servidor Nginx atuando como proxy reverso, encaminhando requisições para os servidores backend com base no hostname solicitado.
Link para o tutorial em vídeo
- Teórico
Estrutura do Laboratório
Diretórios
A estrutura de diretórios será a seguinte:
dvps1-vagrant-webproxy/
├── proxy/
│ ├── Vagrantfile
│ └── files/
│ └── default.conf
├── web/
├── Vagrantfile
└── files/
├── app01.conf
├── app02.conf
└── app03.conf
E você também pode acessar o repositório do código final.
Diagrama
+----------------+
| Cliente |
| (Host Local) |
+-------+--------+
|
v public_network
+-------+--------+
| 192.168.10.100 |
| Proxy |
| 192.168.99.100 |
+-------+--------+
|
v private_network
+---------------------+-------------------+
| | |
v v v
+--------------+ +--------------+ +--------------+
| app01 | | app02 | | app03 |
| 192.168.99.11| | 192.168.99.12| | 192.168.99.13|
+--------------+ +--------------+ +--------------+
Vagrantfiles - Web
Ao criar nosso Vagrantfile para este laboratório, precisamos fazer uso de alguns recursos que ainda não vimos seu funcionamento, que são os loops. Por meio dos loops é possível criar mais uma máquina, com as mesmas definições, de forma automática e sem precisar criar mais de um arquivo de definição.
Vagrant.configure("2") do |config|
(1..3).each do |i|
config.vm.define "app#{i}" do |app|
app.vm.box = "bento/ubuntu-24.04"
app.vm.hostname = "app#{i}"
app.vm.network "private_network",
ip: "192.168.56.1#{i}"
app.vm.network "private_network",
ip: "192.168.99.1#{i}",
virtualbox__intnet: true,
virtualbox__intnet: "rede-proxy"
app.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 2
vb.name = "app#{i}"
end
app.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
mkdir -p /var/www/app
echo "<h1>app0#{i}.felipepadilha.com.br</h1>" > /var/www/app/index.html
cp /vagrant/files/app0#{i}.conf /etc/nginx/sites-available/app.conf
ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
systemctl restart nginx
SHELL
end
end
end
E para cada aplicativo criamos a sua configuração de Nginx respectiva: App01
server {
listen 80;
server_name app01.felipepadilha.com.br;
location / {
root /var/www/app;
index index.html;
}
}
App02
server {
listen 80;
server_name app02.felipepadilha.com.br;
location / {
root /var/www/app;
index index.html;
}
}
App03
server {
listen 80;
server_name app03.felipepadilha.com.br;
location / {
root /var/www/app;
index index.html;
}
}
web/
e execute o comando vagrant validate
. Você deverá ver a mensagem Vagrantfile validated successfully. no seu terminal: 
vagrant up
para provisionar as três máquinas. Lembrando que se for a primeira vez usando essa box (bento/ubuntu-24.04) o Vagrant irá baixá-la da internet, o que pode levar alguns minutos dependendo da sua conexão de internet. 
Vagrantfiles - Proxy
E como só vamos ter um único proxy, não precisamos criar um loop, apenas garantir que ele irá subir com as configurações corretas do nginx. Seu arquivo de Vagrantfile será:
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-24.04"
config.vm.hostname = "proxy"
config.vm.network "public_network",
ip: "192.168.10.100"
config.vm.network "private_network",
ip: "192.168.99.100",
virtualbox__intnet: true,
virtualbox__intnet: "rede-proxy"
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
cp /vagrant/files/default.conf /etc/nginx/sites-available/default
systemctl restart nginx
SHELL
end
Não esqueça de alterar o public_network para um endereço IP da sua rede.
E o arquivo de configuração será mantido o mais simples possível, apenas definindo cada diretiva de server_name apontada para seu respectivo webserver:
server {
listen 80;
server_name app01.felipepadilha.com.br;
location / {
proxy_pass http://192.168.99.11;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name app02.felipepadilha.com.br;
location / {
proxy_pass http://192.168.99.12;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name app03.felipepadilha.com.br;
location / {
proxy_pass http://192.168.99.13;
proxy_set_header Host $host;
}
}
Verificando o laboratório
Após as máquinas provisionadas é possível realizar o acesso ssh delas através do comando vagrant ssh appX
(quando definimos mais de uma máquina em um arquivo, precisamos especificar qual desejamos acessar) ou vagrant ssh
no diretório do proxy. Precisamos verificar é se as configurações subiram corretamente, o que esperamos é:
- O Nginx subiu apenas na interface da rede interna (192.168.99.XX)
- As máquinas conseguem se comunicar internamente
- As páginas Web são acessíveis através dos nomes DNS, apontando para suas respectivas máquinas.
E para não ter que criar uma entrada A no meu servidor DNS do domínio felipepadilha.com.br apontando APP para o endereço IP do meu proxy, eu vou editar diretamente o arquivo de hosts do Windows e adicionar as três entradas:
# C:\Windows\System32\drivers\etc
192.168.10.100 app01.felipepadilha.com.br
192.168.10.100 app02.felipepadilha.com.br
192.168.10.100 app03.felipepadilha.com.br
No diretório dos servidores web, execute: vagrant ssh app1
, vagrant ssh app2
, vagrant ssh app3
. Valide através dos seguintes comandos:
ss -nlt
ping -c1 192.168.99.11
ping -c1 192.168.99.12
ping -c1 192.168.99.13
ping -c1 192.168.99.100
E também acessar os respectivos endereços DNS: app01.felipepadilha.com.br, app02.felipepadilha.com.br, app03.felipepadilha.com.br.