main.tf # Provedor necessário para interagir com o Libvirt terraform { required_providers { libvirt = { source = "dmacvicar/libvirt" } } } # URI para conectar ao Libvirt provider "libvirt" { #uri = "qemu:///system" uri = "qemu+ssh://gean@192.168.0.250/system" } resource "libvirt_network" "kube_net" { name = "kube_net" mode = "nat" addresses = ["10.1.2.0/24"] autostart = true dhcp { enabled = false } } variable "vms" { type = list(object({ name = string # Nome da VM cpu = number # Número de CPUs memory = number # Quantidade de memória (MB) disksize = number # Tamanho do disco (GB) storage_pool = string # Pool de armazenamento os_image_name = string # Nome da imagem do sistema operacional os_datas_name = string # Nome dos dados do sistema operacional network_name = string # Nome da rede user_data = string # Caminho para o arquivo de configuração de inicialização em nuvem network_config = string # Caminho para o arquivo de configuração de rede os_image_url = string # URL da imagem do sistema operacional })) } # Recurso para criar volumes de imagens do sistema operacional resource "libvirt_volume" "os_image" { for_each = { for vm in var.vms : vm.name => vm } name = each.value.os_image_name pool = each.value.storage_pool source = each.value.os_image_url format = "qcow2" } # Recurso para criar volumes de dados do sistema operacional baseados nas imagens resource "libvirt_volume" "os_datas" { for_each = { for vm in var.vms : vm.name => vm } name = each.value.os_datas_name base_volume_id = libvirt_volume.os_image[each.key].id pool = each.value.storage_pool size = each.value.disksize * 1024 * 1024 * 1024 } # Recurso para carregar arquivos de configuração de inicialização em nuvem data "template_file" "user_data" { for_each = { for vm in var.vms : vm.name => vm } template = file(each.value.user_data) } # Recurso para carregar arquivos de configuração de rede data "template_file" "network_config" { for_each = { for vm in var.vms : vm.name => vm } template = file(each.value.network_config) } # Recurso para criar discos de inicialização em nuvem resource "libvirt_cloudinit_disk" "cloudinit" { for_each = { for vm in var.vms : vm.name => vm } name = "cloudinit_${each.key}.iso" user_data = data.template_file.user_data[each.key].rendered network_config = data.template_file.network_config[each.key].rendered pool = each.value.storage_pool } # Recurso para criar as instâncias de máquinas virtuais resource "libvirt_domain" "domain" { for_each = { for vm in var.vms : vm.name => vm } name = each.value.name memory = each.value.memory vcpu = each.value.cpu cpu { mode = "host-passthrough" } cloudinit = libvirt_cloudinit_disk.cloudinit[each.key].id network_interface { network_name = each.value.network_name } console { type = "pty" target_port = "0" target_type = "serial" } console { type = "pty" target_type = "virtio" target_port = "1" } disk { volume_id = libvirt_volume.os_datas[each.key].id } graphics { type = "spice" listen_type = "address" autoport = true } }