Publicado em

Usando o Vagrant para criar laboratórios virtuais - Parte II

Autores
  • avatar
    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.​

  • 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;
    }
}
Depois de criados todos os arquivos, mova o terminal para o diretório web/ e execute o comando vagrant validate. Você deverá ver a mensagem Vagrantfile validated successfully. no seu terminal: dvps2-img1
Após isso, rode o comando 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. dvps2-img2

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 é:

  1. O Nginx subiu apenas na interface da rede interna (192.168.99.XX)
  2. As máquinas conseguem se comunicar internamente
  3. 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.