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