Pular para o conteúdo principal

🏗️ Criando uma VM com Terraform

O Terraform é uma ferramenta de Infraestrutura como Código (IaC — Infrastructure as Code) desenvolvida pela HashiCorp. Com ele, você descreve toda a sua infraestrutura em arquivos de configuração declarativos, permitindo provisionar, modificar e destruir recursos de forma automatizada, versionável e reproduzível.

Ao utilizar o Terraform com a plataforma Nuvion, você obtém benefícios como:

  • 🔁 Reprodutibilidade — recrie ambientes idênticos com um único comando
  • 📋 Versionamento — controle mudanças na infraestrutura com Git
  • Agilidade — provisione múltiplos recursos em paralelo de forma automática
  • 🔍 Auditabilidade — todo o estado da infraestrutura fica registrado em código
📦 Pré-requisito

Antes de começar, certifique-se de que o Terraform está instalado na sua máquina. Você pode baixá-lo em https://developer.hashicorp.com/terraform/downloads.

Verifique a instalação com:

terraform -version

🔑 Passo 1 — Gerando as credenciais OpenStack

O provider utilizado é o OpenStack, que possui compatibilidade nativa com a plataforma Nuvion. Para que o Terraform possa se autenticar e gerenciar recursos, é necessário gerar credenciais de aplicação (Application Credentials).

Acesse sua conta e navegue até My Account > OpenStack Credentials.

Tela de acesso ao menu My Account com opção OpenStack Credentials na plataforma Nuvion


Clique em Generate Credentials para iniciar a criação das credenciais de acesso.

Botão Generate Credentials na tela de OpenStack Credentials


Preencha o formulário com as informações necessárias:

CampoDescrição
NomeIdentificador amigável para a credencial
ProjetoProjeto ao qual a credencial estará vinculada
RegiãoRegião de atuação da credencial
Data de expiraçãoDeixe em branco para que a credencial nunca expire
DescriçãoCampo opcional para descrever o uso da credencial

Formulário de criação de credenciais OpenStack com campos Nome, Projeto, Região, Expiração e Descrição


Após gerar, salve imediatamente os seguintes dados — eles serão utilizados na configuração do Terraform:

  • 🔗 Server URL — endpoint de autenticação da API OpenStack
  • 🪪 Credentials ID — identificador único da credencial
  • 🔐 Credentials Secret — segredo associado à credencial
⚠️ Atenção ao salvar as credenciais

O Credentials Secret é exibido apenas uma vez. Caso não seja salvo neste momento, será necessário gerar um novo par de credenciais.

Tela com os dados gerados: Server URL, Credentials ID e Credentials Secret


📁 Passo 2 — Estrutura dos arquivos de configuração

A configuração básica do Terraform é dividida em três arquivos principais. Essa separação é uma boa prática que facilita a manutenção, o versionamento e o reuso das configurações.

.
├── provider.tf # Configuração do provider OpenStack
├── terraform.tfvars # Valores das variáveis (credenciais e endpoints)
├── 00-variables.tf # Declaração das variáveis utilizadas
├── ssh-keypair.tf # Gerenciamento do par de chaves SSH via Terraform
└── instance.tf # Definição da VM e dos recursos associados

📄 provider.tf

Define a versão mínima do Terraform e configura o provider OpenStack, informando as credenciais e a região por meio de variáveis.

terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.53.0"
}
}
}

provider "openstack" {
application_credential_id = var.application_credential_id
application_credential_secret = var.application_credential_secret
auth_url = var.os_auth_url
region = var.os_region
}

📄 terraform.tfvars

Arquivo onde os valores reais das variáveis são definidos. Substitua os campos entre < > pelos dados obtidos ao gerar as credenciais OpenStack.

application_credential_id     = "<credentials-id>"
application_credential_secret = "<credentials-secret>"
os_auth_url = "https://cmp.console.saveincloud.io/openstack/2"
os_region = "RegionOne"
🔒 Segurança do terraform.tfvars

Este arquivo contém informações sensíveis. Adicione-o ao .gitignore do seu repositório para evitar que as credenciais sejam expostas acidentalmente em sistemas de controle de versão.

# .gitignore
terraform.tfvars
*.tfstate
*.tfstate.backup
.terraform/

📄 00-variables.tf

Declara as variáveis utilizadas pelo provider, sem atribuir valores — eles são lidos do terraform.tfvars em tempo de execução.

variable "application_credential_id" {}
variable "application_credential_secret" {}
variable "os_auth_url" {}
variable "os_region" {}

🔑 Passo 3 — Gerenciando o par de chaves SSH com ssh-keypair.tf

O arquivo ssh-keypair.tf permite que o par de chaves SSH utilizado para acesso à VM seja gerenciado diretamente pelo Terraform, centralizando toda a infraestrutura em código e eliminando a necessidade de cadastrar a chave manualmente na plataforma.

resource "openstack_compute_keypair_v2" "<ssh-keypair-resource-id>" {
name = "<name>"
public_key = "<chave-publica>"
}

📖 Descrição dos campos

CampoDescrição
<ssh-keypair-resource-id>Identificador lógico do recurso no Terraform (ex.: keypair_nuvion)
nameNome do par de chaves que será exibido na plataforma Nuvion (ex.: minha-chave-terraform)
public_keyConteúdo da sua chave pública (ex.: ssh-ed25519 AAAA...) — o mesmo valor cadastrado manualmente em SSH Keys na plataforma
💡 Obtendo o valor da chave pública

O valor de public_key é o conteúdo do arquivo .pub gerado pelo ssh-keygen ou PuTTYgen. Para exibi-lo no terminal, utilize:

cat ~/.ssh/id_ed25519.pub

Copie a saída completa, incluindo o prefixo ssh-ed25519 e o comentário ao final.

🔗 Referenciando o keypair na instância

Após declarar o recurso openstack_compute_keypair_v2, referencie-o no instance.tf pelo atributo name do recurso criado:

key_pair = openstack_compute_keypair_v2.<ssh-keypair-resource-id>.name

Isso garante que o Terraform aplique as dependências na ordem correta — criando o keypair antes de provisionar a VM.


🖥️ Passo 4 — Definindo a VM com instance.tf

O arquivo instance.tf declara todos os recursos necessários para provisionar a máquina virtual: a imagem do sistema operacional, o volume de armazenamento e a instância de computação em si.

# -------------------------------------------------------
# 1. Busca a imagem do sistema operacional mais recente
# -------------------------------------------------------
data "openstack_images_image_v2" "<data-resource-id>" {
name = "<nome-da-imagem>"
most_recent = true
}

# -------------------------------------------------------
# 2. Cria o volume de armazenamento (disco da VM)
# -------------------------------------------------------
resource "openstack_blockstorage_volume_v3" "<volume-resource-id>" {
name = "<nome-do-volume>"
size = <tamanho-do-volume>
image_id = data.openstack_images_image_v2.<data-resource-id>.id
}

# -------------------------------------------------------
# 3. Provisiona a instância de computação (VM)
# -------------------------------------------------------
resource "openstack_compute_instance_v2" "<compute-resource-id>" {
name = "<nome-vm>"
flavor_name = "<flavor>"
key_pair = openstack_compute_keypair_v2.<ssh-keypair-resource-id>.name
security_groups = ["default"]

network {
name = "<nome-da-rede>"
}

block_device {
uuid = openstack_blockstorage_volume_v3.<volume-resource-id>.id
source_type = "volume"
destination_type = "volume"
boot_index = 0
delete_on_termination = true
}
}

📖 Descrição dos campos

data "openstack_images_image_v2"

CampoDescrição
<data-resource-id>Identificador lógico do recurso dentro do Terraform (ex.: ubuntu_22)
nameNome exato da imagem disponível na plataforma (ex.: Ubuntu 22.04)
most_recentQuando true, seleciona a versão mais recente da imagem caso haja múltiplas correspondências

resource "openstack_blockstorage_volume_v3"

CampoDescrição
<volume-resource-id>Identificador lógico do volume no Terraform (ex.: vm_boot_volume)
nameNome do volume que será exibido na plataforma
sizeTamanho do volume em GB (ex.: 50)
image_idReferência à imagem obtida pelo bloco data acima

resource "openstack_compute_instance_v2"

CampoDescrição
<compute-resource-id>Identificador lógico da instância no Terraform (ex.: minha_vm)
nameNome da VM exibido na plataforma
flavor_nameTipo de instância que define CPU, RAM e recursos (ex.: m1.small)
key_pairReferência ao par de chaves SSH criado pelo recurso openstack_compute_keypair_v2
security_groupsLista de grupos de segurança aplicados à instância
network.nameNome da rede à qual a VM será conectada
block_device.uuidReferência ao volume criado anteriormente
block_device.source_typeOrigem do dispositivo de boot — volume indica um volume em bloco
block_device.destination_typeDestino do dispositivo — volume para armazenamento persistente
block_device.boot_indexOrdem de boot — 0 indica o disco principal
block_device.delete_on_terminationQuando true, o volume é excluído junto com a VM ao destruir o recurso

🚀 Passo 4 — Executando o Terraform

Com todos os arquivos configurados, execute os comandos a seguir no diretório do projeto:

# Inicializa o projeto e baixa o provider OpenStack
terraform init

# Exibe um plano detalhado de todos os recursos que serão criados
terraform plan

# Aplica as configurações e provisiona os recursos na plataforma
terraform apply
💡 Confirmação do apply

O comando terraform apply solicitará uma confirmação antes de criar os recursos. Digite yes para prosseguir. Utilize a flag -auto-approve para ambientes de CI/CD onde a confirmação manual não é desejada.


✅ Resumo do fluxo

1. Gerar credenciais OpenStack na plataforma Nuvion

2. Criar os arquivos provider.tf, terraform.tfvars e 00-variables.tf

3. Declarar o par de chaves SSH no arquivo ssh-keypair.tf

4. Definir os recursos da VM no arquivo instance.tf

5. Executar terraform init → terraform plan → terraform apply

6. VM provisionada e disponível na plataforma! 🎉

🛡️ Boas práticas com Terraform
  • Utilize workspaces para separar ambientes de desenvolvimento, homologação e produção.
  • Armazene o state remotamente (ex.: em um bucket S3 ou no Terraform Cloud) para trabalho em equipe.
  • Nunca commite o terraform.tfvars com credenciais em repositórios públicos.
  • Use o terraform plan sempre antes do apply para revisar as mudanças que serão aplicadas.
  • Versione seus módulos para garantir estabilidade ao longo do tempo.

🧠 Dúvidas?

Entre em contato com o suporte técnico e envie sua dúvida que estaremos à disposição para te ajudar!

Documentação oficial do Terraform