# 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] }