Sistema automatizado para provisionamento de máquinas virtuais através de tickets de solicitação com aprovação e expiração automática.
O Lab Virtual é uma solução completa que permite aos usuários solicitarem recursos computacionais (CPU, RAM, espaço em disco e tempo de disponibilidade) através de um frontend web. Após aprovação, o sistema automaticamente provisiona máquinas virtuais usando Terraform e Proxmox.
Frontend → API (Oracle APEX) → Banco de Dados → VM Core (Scheduler) → Terraform → Proxmox VE
# Habilitar virtualização aninhada
./VBoxManage modifyvm Proxmox --nested-hw-virt on
Configurar placa de rede em modo bridge para acesso via navegador
É uma máquina virtual criada no proxmox. Essa VM Core serve de base para as automações. Os scripts de criação/destruição de vms e envio de emails estão rodando nessa vm.
# Atualizar sistema e instalar dependências
apt-get update
apt install libguestfs-tools -y
# Download da imagem Ubuntu Cloud
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
# Instalar qemu-guest-agent na imagem
virt-customize --add noble-server-cloudimg-amd64.img --install qemu-guest-agent
# Criar VM template
qm create 9001 --name ubuntu-2404-cloud-init --numa 0 --ostype l26 --cpu cputype=host --cores 2 --sockets 2 --memory 2048 --net0 virtio,bridge=vmbr0
# Importar disco para storage
qm importdisk 9001 /tmp/noble-server-cloudimg-amd64.img local-lvm
# Configurar storage
qm set 9001 --scsihw virtio-scsi-pci --scsi0 local-lvm:9001:vm-9001-disk-0
# Configurar Cloud-init
qm set 9001 --ide2 local-lvm:cloudinit
# Definir disco de boot
qm set 9001 --boot c --bootdisk scsi0
# Configurar console serial
qm set 9001 --serial0 socket --vga serial0
# Habilitar guest agent
qm set 9001 --agent enabled=1
# Expandir disco (opcional)
qm disk resize 9001 scsi0 +4G
# Verificar informações da CPU (cores disponíveis)
cat /proc/cpuinfo
# Para VMs em VirtualBox, configurar CPU
qm set 100 --cpu=kvm64
Seguir as instruções oficiais: https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli
Para utilizar o terraform é aconselhavel gerar um token de api no proxmox, este tutorial define os passo para gerar: https://www.youtube.com/watch?v=1kFBk0ePtxo
As seguintes permissões devem ser habilitadas para o token:
Consultar o padrão no repositório - Terraform Templates: Configurações de infraestrutura (pilati06/terraform)
Deve-se clonar esse repositório na máquina core.
Consultar os scripts de automação no repositório:
Também deve ser clonado na máquina core.
# Editar crontab
crontab -e
# Verificar tickets aprovados a cada 5 minutos
*/5 * * * * /root/vm-scheduler/generate-vm-info.sh 2>&1 | ts "%Y-%m-%d %H:%M:%S" >> /root/logs/$(date +%Y-%m-%d).log
# Enviar emails com credenciais a cada 5 minutos
*/5 * * * * /root/vm-scheduler/sendmails-vm.sh 2>&1 | ts "%H:%M:%S" >> /root/logs/$(date +%Y-%m-%d)-mail.log
# Limpeza de logs antigos (diário às 2h)
0 2 * * * find /root/logs -type f -mtime +90 -name "*.log" -exec rm -f {} \;
#cloud-config
package_update: true
package_upgrade: true
packages:
- docker.io
- docker-compose
users:
- name: ubuntu
shell: /bin/bash
sudo: ['ALL=(ALL) NOPASSWD:ALL']
ssh_pwauth: true
chpasswd:
list: |
ubuntu:${password}
expire: true
runcmd:
- sed -i 's/^PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
- systemctl restart ssh
- systemctl enable docker
- systemctl start docker
- usermod -aG docker ubuntu
#cloud-config
users:
- name: ubuntu
shell: /bin/bash
sudo: ['ALL=(ALL) NOPASSWD:ALL']
ssh_pwauth: true
chpasswd:
list: |
ubuntu:${password}
expire: true
runcmd:
- sed -i 's/^PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
- systemctl restart ssh
# Gerar chaves SSH para Terraform
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_proxmox -C "terraform@proxmox"
# Copiar chave pública para Proxmox
ssh-copy-id -i ~/.ssh/id_rsa_proxmox.pub root@PROXMOX_IP
Exemplo de resposta:
{
"items": [
{
"id": 25,
"ano": 2025,
"memoria": 1,
"disco": 4,
"nucleos": 1,
"tempo_uso": 2,
"descricao": "teste",
"res_incl": "USER",
"dat_incl": "2025-07-30T00:00:00Z",
"dat_fim": "2025-08-01T18:31:25Z",
"task_id": "69704933938847278031",
"orientador": null,
"memoria_calc": 1024,
"docker": 0
}
]
}
Campo | Descrição | Tipo |
---|---|---|
id |
ID único do ticket | Integer |
ano |
Ano de criação | Integer |
memoria |
Memória solicitada (GB) | Integer |
disco |
Espaço em disco (GB) | Integer |
nucleos |
Número de CPUs | Integer |
tempo_uso |
Tempo de uso (dias) | Integer |
memoria_calc |
Memória calculada (MB) | Integer |
docker |
Flag para suporte Docker | Integer (0/1) |
dat_incl |
Data de criação | ISO DateTime |
dat_fim |
Data de expiração | ISO DateTime |
Método | Endpoint | Descrição |
---|---|---|
GET | /labvirtual/tasks/approved |
Buscar tickets aprovados |
POST | /labvirtual/sendmail |
Atualizar status da VM |
Enviar post com o seguinte corpo:
{
"vmname": "NOME_VM",
"password": "PRIMEIRA_SENHA_SEGURA",
"ipvm": "IP_MAQUINA",
"user": "USER"
}
lab-virtual/
├── terraform/
│ ├── main.tf
│ ├── variables.tf
│ └── terraform.tfvars
│ └── cloudinit-config-files
│ ├── cloudinit-docker.yaml.tmpl
│ └── cloudinit.yaml.tmpl
├── vm-scheduler/
│ ├── generate-vm-info.sh
│ └── sendmails-vm.sh
├── logs/
│ └── [Arquivos de log]
Este projeto faz parte de um ecossistema maior com os seguintes repositórios:
Para diferentes necessidades, considere os seguintes providers:
# HTTPie para requisições HTTP
sudo apt install httpie
# moreutils para timestamp nos logs
sudo apt install moreutils
# jq para parsing JSON
sudo apt install jq
Os logs são armazenados em /root/logs/
com limpeza automática de arquivos com mais de 90 dias.