# See: # https://github.com/sk4zuzu/vm-pool/blob/master/terraform/redhat/nodes/domain.tf # SEE: https://github.com/SUSE/ha-sap-terraform-deployments/blob/master/libvirt/modules/hana_node/main.tf#L21 #variable "tenant_networks" { # type = any # default = {} #} # Variables # ===================== variable "name" { description = "Instance name" type = string } variable "domain" { description = "Instance domain" type = string default = "" } variable "number" { description = "Number of instances" type = number default = 1 } # variable "prefix" { description = "String to prefix each instances" type = string default = "" } variable "name_fqdn" { description = "Define instance name with fqdn" type = bool default = false } variable "name_prefix" { description = "Define instance name with project prefix" type = bool default = true } variable "instance_pool" { description = "Volume pool for instance disks" type = string default = "default" } variable "disk_gb" { description = "Size in gb of the root disk" type = number default = 2 } # variable "flavor" { description = "Instance flavor" type = string default = "x-small" } variable "memory" { description = "Instance memory" type = string default = "2048" } variable "vcpu" { description = "Number of vcpu" type = number default = 2 } variable "images" { description = "Available OS images" type = any default = {} } variable "os" { description = "Instance os" type = string default = "cirros_0.5" } variable "image_base_pool" { description = "Default image pool" type = string default = "default" } variable "image_base_file" { description = "Image base file in the image_pool" type = string default = "TEST__ MISSING" } variable "disks" { description = "Ephemeral disks list" type = list default = [] } variable "volumes" { description = "Persistant volume list" type = list default = [] } variable "networks" { description = "Network list" type = list default = [] } variable "wait_for_lease" { description = "Wait for network ip assignment" type = bool default = false } variable "metadata" { description = "Metadata do add in state" type = any default = {} } # Cloud init # ----------- variable "user" { description = "Default user login" type = string default = "cloud" } variable "authorized_key" { description = "Default user authorized key" type = string default = "" } # Note: This should only be used for debugging purpose variable "password_hash" { description = "Default user password hash (ie: $1$SaltSalt$GhE887kYCerthShgxern00)" type = string default = "" # sensitive = true } # Cloud settings # ===================== module "system_os" { source = "../../modules/virt_os" count = var.number os_name = "debian" os_version = "10" domain = var.domain hostname = "${var.name}${count.index}" user = var.user password_hash = var.password_hash authorized_key = var.authorized_key } module "system_flavor" { source = "../../modules/virt_flavor" count = var.number flavor = var.flavor } # Volumes Configuration # ===================== module "volume_cloudinit" { source = "../virt_cloudinit" count = var.number name = "inst_${var.prefix}${var.name}${count.index}_cloudinit.iso" pool = var.instance_pool userdata = module.system_os[count.index].template } module "volume_os" { source = "../virt_volume" count = var.number format = "qcow2" name = "inst_${var.prefix}${var.name}${count.index}" pool = var.instance_pool size_gb = 42 base_pool = var.image_base_pool # TOFIX: Hardcoded refrence to debian #base_file = "debian_latest.qcow2" // base_file = "TEST__${var.os} --" base_file = var.image_base_file } module "volumes_extra" { source = "../virt_volumes" count = var.number volumes = var.disks volumes_defaults = { prefix = "inst_${var.prefix}${var.name}${count.index}_" pool = var.instance_pool # TOFIX: Hardcoded variable pool_dir = "/virt" } } # Instance # ===================== locals { hostname = replace( var.name, "_", "-") vmname = ( var.name_prefix ? "${var.prefix}${local.hostname}": "${local.hostname}" ) domain = var.domain metadata = { #cloud_init = one(module.system_os[*].template) os_name = "debian" os_version = "10" domain = var.domain user = var.user #password_hash = var.password_hash authorized_key = var.authorized_key } my_os_infos = var.images[var.os] } resource "ansible_host" "ansible_def" { count = var.number inventory_hostname = ( var.name_fqdn ? "${local.hostname}${count.index}.${var.domain}" : "${local.hostname}${count.index}" ) #groups = [ # "role_${local.hostname}", # var.prefix != "" ? "prj_${var.prefix}" : "" # ] vars = { ansible_user = var.user ansible_host = "${local.hostname}${count.index}.${var.domain}" ansible_connection = "ssh" instances_count = var.number instances_index = count.index instance_domain = var.domain instance_hostname = "${local.hostname}${count.index}" instance_name = "${local.hostname}" instance_provisionning_key = var.authorized_key instance_provisionning_user = var.user instance_flavor = var.flavor instance_metadata = jsonencode(merge(local.metadata, var.metadata)) # TOFIX: lol instance_os_name = "debian" instance_os_version = "10" instance_vm = ( var.name_fqdn ? "${local.vmname}${count.index}.${var.domain}" : "${local.vmname}${count.index}" ) } } resource "libvirt_domain" "instdef" { count = var.number autostart = true name = ( var.name_fqdn ? "${local.vmname}${count.index}.${var.domain}" : "${local.vmname}${count.index}" ) description = "${var.name}${count.index}.${var.domain}" memory = var.memory vcpu = var.vcpu metadata = jsonencode(merge(local.metadata, var.metadata)) # Root FS # ------------------- cloudinit = module.volume_cloudinit[count.index].volume.id disk { volume_id = module.volume_os[count.index].volume.id } # Instance disks dynamic "disk" { for_each = module.volumes_extra[count.index].volumes content { volume_id = disk.value.volume.id #volume_id = disk.value.info.id #volume_id = coalesce(disk.value.volume.id) #file = coalesce(disk.value.info.id) } } # Networking # ------------------- dynamic "network_interface" { for_each = var.networks content { network_name = network_interface.value.name mac = try(network_interface.value.mac, null) addresses = try(network_interface.value.addresses, null) #hostname = try(network_interface.value.hostname, var.name) wait_for_lease = try(network_interface.value.wait_for_lease, var.wait_for_lease ) macvtap = try(network_interface.value.macvtap, null) vepa = try(network_interface.value.vepa, null) } } # Other # ------------------- console { type = "pty" target_port = "0" target_type = "serial" } console { type = "pty" target_type = "virtio" target_port = "1" } graphics { type = "spice" listen_type = "address" autoport = true } cpu { mode = "host-passthrough" } } # Outputs # ===================== output "instance" { value = try(resource.libvirt_domain.instdef, null) } # output "volume_cloudinit" { # value = module.volume_cloudinit # } output "volume_os" { value = module.volume_os } output "volumes_extra" { value = module.volumes_extra } # Tag infos output "system_os" { value = module.system_os } output "system_flavor" { value = module.system_flavor }