====== 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!
# 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
#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
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"
}