User Tools

Site Tools


wikiv2:tf_libvirt_one_vm

Tutorial Completo de Provisionamento de Máquinas Virtuais com Terraform e libvirt

Introdução

Bem-vindo ao nosso tutorial abrangente sobre o uso do Terraform em conjunto com o provedor libvirt para provisionar máquinas virtuais em ambientes de virtualização baseados em Linux. O Terraform é uma ferramenta poderosa e de código aberto para automatizar o gerenciamento de infraestrutura como código (IaC), enquanto o libvirt é uma biblioteca e um conjunto de ferramentas para interagir com virtualização no Linux.

Neste tutorial, exploraremos passo a passo como configurar e implantar máquinas virtuais utilizando o Terraform e o libvirt. Vamos abordar desde a instalação e configuração inicial até a criação de instâncias de VMs personalizadas com configurações específicas de CPU, memória, disco e rede. Ao longo do caminho, vamos explicar os conceitos fundamentais de infraestrutura como código, os benefícios da automação com o Terraform e como o libvirt se integra perfeitamente a essa abordagem.

Conteúdo do Tutorial

  1. Instalação e Configuração do Ambiente:
    1. Guia passo a passo para instalar o Terraform e o libvirt em um sistema Linux.
    2. Configuração inicial do ambiente de virtualização com o libvirt.
  1. Definição da Infraestrutura como Código:
    1. Explicação detalhada sobre a estrutura e sintaxe do arquivo de configuração do Terraform (`.tf`).
    2. Overview dos blocos de construção do Terraform, incluindo provedores, recursos e variáveis.
  1. Configuração de Volumes de Armazenamento:
    1. Como definir volumes de armazenamento para as máquinas virtuais.
    2. Uso de variáveis para configurar diferentes volumes com fontes, formatos e tamanhos variados.
  1. Criação de Discos Cloud-Init:
    1. Introdução ao uso do cloud-init para configurar instâncias de VM durante a inicialização.
    2. Como criar discos cloud-init personalizados com arquivos de configuração YAML.
  1. Provisionamento de Máquinas Virtuais:
    1. Passo a passo para definir e implantar instâncias de VMs usando o libvirt e o Terraform.
    2. Configuração de CPUs, memória, interfaces de rede e dispositivos de armazenamento para as VMs.
  1. Personalização Avançada de Máquinas Virtuais:
    1. Técnicas avançadas para configurar opções específicas do libvirt, como GPU passthrough, dispositivos USB e muito mais.
    2. Integração com outros provedores e recursos do Terraform para criação de infraestruturas mais complexas.
  1. Gerenciamento e Manutenção da Infraestrutura:
    1. Como atualizar e modificar a infraestrutura existente de forma segura e controlada.
    2. Estratégias para gerenciar estados do Terraform e lidar com mudanças em ambientes de produção.
  1. Boas Práticas e Considerações de Segurança:
    1. Melhores práticas para organização de código, reutilização de módulos e controle de versão.
    2. Dicas de segurança para proteger suas máquinas virtuais e garantir a conformidade com padrões de segurança.

Conclusão

Ao final deste tutorial, você estará familiarizado com os princípios fundamentais do Terraform e do libvirt, além de ter adquirido habilidades práticas para provisionar, configurar e gerenciar máquinas virtuais de forma eficiente e escalável. Esperamos que este guia o ajude a automatizar e simplificar a gestão da sua infraestrutura de virtualização, proporcionando maior flexibilidade, controle e agilidade no seu ambiente de TI.

Então, vamos começar nossa jornada rumo ao mundo emocionante da infraestrutura como código com o Terraform e o libvirt!

main.tf
# Define as variáveis de configuração para a VM
variable "vm_template" {
  description = "Mapa de configurações para a VM"
  type        = map(any)
  default     = {}
}
 
# Declaração do provedor e versão necessária
terraform {
  required_providers {
    libvirt = {
      source = "dmacvicar/libvirt"
    }
  }
}
 
# Provedor Libvirt com URI padrão
provider "libvirt" {
  uri = "qemu:///system"
}
 
# Recurso para o volume do sistema operacional
resource "libvirt_volume" "os_image" {
  name   = var.vm_template["os_image_name"]
  pool   = var.vm_template["storage_pool"]
  source = var.vm_template["os_image_url"]
  format = "qcow2"
}
 
# Recurso para o volume de dados
resource "libvirt_volume" "os_datas" {
  name           = var.vm_template["os_datas_name"]
  base_volume_id = libvirt_volume.os_image.id
  pool           = var.vm_template["storage_pool"]
  size           = var.vm_template["disksize"] * 1024 * 1024 * 1024
}
 
# Dados do usuário para o CloudInit
data "template_file" "user_data" {
  template = file(var.vm_template["cloud_init_file"])
}
 
# Recurso para o disco de inicialização do CloudInit
resource "libvirt_cloudinit_disk" "cloudinit" {
  name       = "cloudinit.iso"
  user_data  = data.template_file.user_data.rendered
  pool       = var.vm_template["storage_pool"]
}
 
# Recurso para a máquina virtual
resource "libvirt_domain" "domain" {
  name   = var.vm_template["name"]
  memory = var.vm_template["memory"]
  vcpu   = var.vm_template["cpu"]
 
  cpu {
    mode = "host-passthrough"
  }
 
  # Associa o CloudInit à máquina virtual
  cloudinit = libvirt_cloudinit_disk.cloudinit.id
 
  network_interface {
    network_name   = var.vm_template["network_name"]
    wait_for_lease = true
  }
 
  # Configura consoles
  console {
    type        = "pty"
    target_port = "0"
    target_type = "serial"
  }
 
  console {
    type        = "pty"
    target_type = "virtio"
    target_port = "1"
  }
 
  # Configura o disco da VM
  disk {
    volume_id = libvirt_volume.os_datas.id
  }
 
  # Configuração do gráfico
  graphics {
    type        = "spice"
    listen_type = "address"
    autoport    = true
  }
}
 
# Output do endereço IP da máquina virtual
output "ip" {
  value = libvirt_domain.domain.network_interface[0].addresses[0]
}
ubuntu-cloud-init.yml
#ubuntu-cloud-init.yml 
#cloud-config
 
## Modifying root password
chpasswd:
  list: |
    root:root
  expire: False
 
## Enable direct root access
disable_root: false
 
## Allow ssh password authentication
ssh_pwauth: true
 
## Setup users and ssh keys
users:
  - name: gke-suporte
    gecos: GKE Suporte
    groups: users, admin
    shell: /bin/bash
    sudo: ALL=(ALL) NOPASSWD:ALL
    lock_passwd: true
    ssh_authorized_keys:
      - ${file("~/.ssh/id_ed25519.pub")}
  - name: eks-suporte
    gecos: EKS Suporte
    groups: users, admin
    shell: /bin/bash
    sudo: ALL=(ALL) NOPASSWD:ALL
    lock_passwd: true
    ssh_authorized_keys:
      - ${file("~/.ssh/id_ed25519.pub")}
  - name: eks-projeto
    gecos: EKS Projeto
    groups: users, admin
    shell: /bin/bash
    sudo: ALL=(ALL) NOPASSWD:ALL
    lock_passwd: true
    ssh_authorized_keys:
      - ${file("~/.ssh/id_ed25519.pub")}
  - name: root
    ssh_authorized_keys:
      - ${file("~/.ssh/id_ed25519.pub")}
 
## Install packages
package_update: true
package_upgrade: true
packages:
  - qemu-guest-agent
  - vm
  - git
  - python
terraform.tfvars
#terraform.tfvars 
vm_template = {
  name            = "ubuntu"
  cpu             = 2
  memory          = 2048
  disksize        = 32
  storage_pool    = "default"
  os_image_name   = "ubuntu_image.qcow2"
  os_datas_name   = "ubuntu_datas.qcow2"
  network_name    = "default"
  cloud_init_file = "ubuntu-cloud-init.yml"
  os_image_url    = "/var/lib/libvirt/templates/jammy-server-cloudimg-amd64.img"
}
wikiv2/tf_libvirt_one_vm.txt · Last modified: by 127.0.0.1