terraform { required_providers { libvirt = { source = "dmacvicar/libvirt" } } } provider "libvirt" { uri = "qemu:///system" } variable "vms" { type = list(map(any)) } resource "libvirt_network" "ansible" { name = "ansible" mode = "nat" addresses = ["10.3.4.0/24"] autostart = true dhcp { enabled = false } dns { enabled = true } } 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" } 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 // GB para bytes } data "template_file" "user_data_deb" { for_each = { for vm in var.vms : vm.name => vm if lookup(vm, "user_data_deb", null) != null } template = file("${path.module}/${each.value.user_data_deb}") vars = { hostname = each.value.hostname } } data "template_file" "user_data_rhel" { for_each = { for vm in var.vms : vm.name => vm if lookup(vm, "user_data_rhel", null) != null } template = file("${path.module}/${each.value.user_data_rhel}") vars = { hostname = each.value.hostname } } data "template_file" "network_config_deb" { for_each = { for vm in var.vms : vm.name => vm if lookup(vm, "network_config_deb", null) != null } template = file("${path.module}/${each.value.network_config_deb}") vars = { network_ip = each.value.network_ip } } data "template_file" "network_config_rhel" { for_each = { for vm in var.vms : vm.name => vm if lookup(vm, "network_config_rhel", null) != null } template = file("${path.module}/${each.value.network_config_rhel}") vars = { network_ip = each.value.network_ip } } resource "libvirt_cloudinit_disk" "cloudinit_deb" { for_each = { for vm in var.vms : vm.name => vm if lookup(vm, "user_data_deb", null) != null } name = "${each.key}_cloudinit.iso" user_data = data.template_file.user_data_deb[each.key].rendered network_config = data.template_file.network_config_deb[each.key].rendered pool = each.value.storage_pool } resource "libvirt_cloudinit_disk" "cloudinit_rhel" { for_each = { for vm in var.vms : vm.name => vm if lookup(vm, "user_data_rhel", null) != null } name = "${each.key}_cloudinit.iso" user_data = data.template_file.user_data_rhel[each.key].rendered network_config = data.template_file.network_config_rhel[each.key].rendered pool = each.value.storage_pool } locals { cloudinit_disks = { for vm in var.vms : vm.name => ( lookup(vm, "user_data_deb", null) != null ? libvirt_cloudinit_disk.cloudinit_deb[vm.name].id : libvirt_cloudinit_disk.cloudinit_rhel[vm.name].id ) } } 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 = local.cloudinit_disks[each.key] network_interface { network_name = each.value.network_name } disk { volume_id = libvirt_volume.os_datas[each.key].id } console { type = "pty" target_type = "virtio" target_port = "1" } graphics { type = "spice" listen_type = "address" autoport = true } }