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.
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"
}