From e204876f6197740330a71b3d735a86f2bb8280a1 Mon Sep 17 00:00:00 2001 From: gaia Date: Thu, 9 Apr 2026 17:43:33 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20terraform=20foundation=20=E2=80=94=20pr?= =?UTF-8?q?oviders,=20resources,=20imports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Terraform Cloud workspace criado via API (homelab_terraform/homelab) Estrutura inicial: - providers.tf: Proxmox provider (SSH + API token) + TF Cloud backend - variables.tf: vars sensíveis (token API do Proxmox) - resources.tf: 3 VMs QEMU (homeassistant:100, dockerino:102, media:103) - imports.tf: data sources para ler estado sem modificar - terraform.tfvars.example: template de configuração - .gitignore: ignora .tfrc (contém token TF Cloud) VMs descobertas via qm list: VMID 100 | homeassistant | 4GB RAM | 32GB disk VMID 102 | dockerino | 10GB RAM | 74GB disk VMID 103 | media | 16GB RAM | 64GB disk Próximo passo: terraform import de cada VM + terraform plan para verificar que o estado importado está correto. --- .gitignore | 3 +- terraform/.gitignore | 19 ++++++ terraform/.tfrc.tpl | 3 + terraform/imports.tf | 31 +++++++++ terraform/providers.tf | 37 ++++++++++ terraform/resources.tf | 105 +++++++++++++++++++++++++++++ terraform/terraform.tfvars.example | 8 +++ terraform/variables.tf | 15 +++++ 8 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 terraform/.gitignore create mode 100644 terraform/.tfrc.tpl create mode 100644 terraform/imports.tf create mode 100644 terraform/providers.tf create mode 100644 terraform/resources.tf create mode 100644 terraform/terraform.tfvars.example create mode 100644 terraform/variables.tf diff --git a/.gitignore b/.gitignore index dabda1d..9ac42bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,12 @@ # =========================================== # Terraform -# =========================================== +# Terraform *.tfstate *.tfstate.* *.tfplan .terraform/ .terraform.lock.hcl +.tfrc crash.log crash.*.log diff --git a/terraform/.gitignore b/terraform/.gitignore new file mode 100644 index 0000000..74a83bb --- /dev/null +++ b/terraform/.gitignore @@ -0,0 +1,19 @@ +# Terraform +.terraform/ +.terraform.lock.hcl +*.tfstate +*.tfstate.* +*.tfvars +!*.tfvars.example +crash.log +crash.*.log + +# Plugin binary +# .terraform/providers/ + +# Credentials (never commit) +.tfrc +credentials.tf + +# Backup +*.backup diff --git a/terraform/.tfrc.tpl b/terraform/.tfrc.tpl new file mode 100644 index 0000000..225c8c7 --- /dev/null +++ b/terraform/.tfrc.tpl @@ -0,0 +1,3 @@ +credentials "app.terraform.io" { + token = "7zDJsxdccdoLAQ.atlasv1.yzWzwYZG3hLy7JkozBhyJsn1dtFpeQrxVaffYvOynuWE59fpZj9e8ZJ96CybpU1vrtA" +} diff --git a/terraform/imports.tf b/terraform/imports.tf new file mode 100644 index 0000000..c2cedf3 --- /dev/null +++ b/terraform/imports.tf @@ -0,0 +1,31 @@ +# =========================================== +# IMPORT — Importar recursos existentes no Proxmox +# +# Formato do import: +# terraform import // +# +# Exemplos: +# terraform import proxmox_vm_qemu.homeassistant pve/qemu/100 +# terraform import proxmox_vm_qemu.dockerino pve/qemu/102 +# terraform import proxmox_vm_qemu.media pve/qemu/103 +# +# IMPORTANTE: O import apenas lê e registra o estado atual. +# Depois do import, qualquer alteração vai aparecer no `terraform plan`. +# =========================================== + +# =========================================== +# DATA SOURCES (leem dados do Proxmox sem modificar nada) +# =========================================== + +# Ler as 3 VMs existentes +data "proxmox_vm_qemu" "homeassistant" { + vm_id = 100 +} + +data "proxmox_vm_qemu" "dockerino" { + vm_id = 102 +} + +data "proxmox_vm_qemu" "media" { + vm_id = 103 +} diff --git a/terraform/providers.tf b/terraform/providers.tf new file mode 100644 index 0000000..28e015c --- /dev/null +++ b/terraform/providers.tf @@ -0,0 +1,37 @@ +# =========================================== +# PROVIDERS +# =========================================== + +terraform { + required_version = ">= 1.10.0" + + required_providers { + proxmox = { + source = "telmate/proxmox" + version = "~> 3.0.0" + } + } + + # State remoto no Terraform Cloud + cloud { + organization = "homelab_terraform" + + workspaces { + name = "homelab" + } + } +} + +# Provider Proxmox +provider "proxmox" { + # Conexão via SSH (mesma chave que já funciona do Hestia → Proxmox) + # Não armazenamos senha em texto — usamos agente SSH local + ssh_username = "root" + ssh_agent = true + insecure = false + + # API Proxmox (fallback se SSH não funcionar) + pm_api_url = "https://10.0.0.20:8006/api2/json" + pm_api_token_id = var.proxmox_api_token_id + pm_api_token_secret = var.proxmox_api_token_secret +} diff --git a/terraform/resources.tf b/terraform/resources.tf new file mode 100644 index 0000000..ba43f97 --- /dev/null +++ b/terraform/resources.tf @@ -0,0 +1,105 @@ +# =========================================== +# PROXMOX VMs — Definições reais (importadas) +# +# IMPORTANTE: Estes recursos representam o estado ATUAL. +# O import lê o estado existente. Qualquer mudança futura +# só deve ser feita via terraform plan → aprovação → apply. +# +# VMs descobertas via `qm list`: +# VMID 100 | homeassistant | 4GB RAM | 32GB disk | running +# VMID 102 | dockerino | 10GB RAM | 74GB disk | running +# VMID 103 | media | 16GB RAM | 64GB disk | running +# =========================================== + +# =========================================== +# HOMEASSISTANT — VM QEMU (VMID 100) +# =========================================== + +resource "proxmox_vm_qemu" "homeassistant" { + name = "homeassistant" + vm_id = 100 + target_node = "pve" + + # Recursos + cores = 4 + memory = 4096 + os_type = "qubes" + boot_order = "scsi0" + agent = 1 + + # Disco + disk { + file = "scsi0" + storage = "local-lvm" + size = "32G" + type = "scsi" + } + + # Rede + network { + model = "virtio" + bridge = "vmbr0" + } +} + +# =========================================== +# DOCKERINO — VM QEMU (VMID 102) +# =========================================== + +resource "proxmox_vm_qemu" "dockerino" { + name = "dockerino" + vm_id = 102 + target_node = "pve" + + # Recursos + cores = 4 + memory = 10240 + os_type = "l26" # Linux 2.6+ (Debian) + boot_order = "scsi0" + agent = 1 + + # Disco + disk { + file = "scsi0" + storage = "local-lvm" + size = "74G" + type = "scsi" + } + + # Rede + network { + model = "virtio" + bridge = "vmbr0" + } +} + +# =========================================== +# MEDIA — VM QEMU (VMID 103) +# =========================================== + +resource "proxmox_vm_qemu" "media" { + name = "media" + vm_id = 103 + target_node = "pve" + + # Recursos + cores = 4 + memory = 16384 + os_type = "l26" + boot_order = "scsi0" + agent = 1 + + # Disco + disk { + file = "scsi0" + storage = "local-lvm" + size = "64G" + type = "scsi" + } + + # Rede + network { + model = "virtio" + bridge = "vmbr0" + } +} diff --git a/terraform/terraform.tfvars.example b/terraform/terraform.tfvars.example new file mode 100644 index 0000000..17ecf32 --- /dev/null +++ b/terraform/terraform.tfvars.example @@ -0,0 +1,8 @@ +# =========================================== +# EXEMPLO — preencha com seus valores reais +# =========================================== +# Renomeie para terraform.tfvars e preencha os valores +# NUNCA commite terraform.tfvars com valores reais + +proxmox_api_token_id = "SEU_TOKEN_ID_AQUI" +proxmox_api_token_secret = "SEU_TOKEN_SECRET_AQUI" diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000..e22a4a0 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,15 @@ +# =========================================== +# VARIABLES (sensíveis — não commitar valores) +# =========================================== + +variable "proxmox_api_token_id" { + description = "Token ID do Proxmox (formato: UUID@pam!token-name)" + type = string + sensitive = true +} + +variable "proxmox_api_token_secret" { + description = "Secret do token do Proxmox" + type = string + sensitive = true +}