I am trying to create the vSphere VM with Dynamics number of disks. from the resource block not sure how to iterate the number of data disks list.
Here is the code I have:
varible.tf
variable "virtual_machines" {
type = map(object({
system_cores = number
system_cores_per_socket = number
system_memory = number
system_ipv4_address = string
system_ipv4_netmask = string
system_ipv4_gateway = string
system_domainname = string
disks = list(number)
}))
}
values.tfvar
virtual_machines = {
server1 = {
system_cores = 4
system_cores_per_socket = 2
system_memory = 4096
system_disk1_size = 110
disks = [ 10, 20]
}
server2 = {
system_cores = 4
system_cores_per_socket = 2
system_memory = 4096
system_disk1_size = 110
disks = [ 50, 20,80]
}
}
resource.tf
resource "vsphere_virtual_machine" "server" {
for_each = var.virtual_machines
# VM-Name
name = each.key
resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
datastore_id = data.vsphere_datastore.datastore.id
# CPU
num_cpus = each.value.system_cores
num_cores_per_socket = each.value.system_cores_per_socket
# Memory
memory = each.value.system_memory
memory_hot_add_enabled = true
network_interface {
network_id = data.vsphere_network.network.id
adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0]
}
# Root Disk
disk {
label = "disk0"
size = data.vsphere_virtual_machine.template.disks.0.size
eagerly_scrub = data.vsphere_virtual_machine.template.disks.0.eagerly_scrub
thin_provisioned = data.vsphere_virtual_machine.template.disks.0.thin_provisioned
unit_number = 0
}
# Data Disk need to loop based on disks list
disk {
label = "disk1"
unit_number = 1
size = each.value.system_disk1_size
eagerly_scrub = data.vsphere_virtual_machine.template.disks.0.eagerly_scrub
thin_provisioned = data.vsphere_virtual_machine.template.disks.0.thin_provisioned
}
# Template clone and OS settings
clone {
template_uuid = data.vsphere_virtual_machine.template.id
customize {
timeout = 15
linux_options {
host_name = each.key
domain = each.value.system_domainname
}
network_interface {
ipv4_address = each.value.system_ipv4_address
ipv4_netmask = each.value.system_ipv4_netmask
}
ipv4_gateway = each.value.system_ipv4_gateway
dns_suffix_list = var.vm-dns-suffix-list
dns_server_list = var.vm_dns_servers
}
}
}
Any help to add list of disk on this resource block?
Thanks
You can use dynamic blocks:
# Root Disk
disk {
label = "disk0"
size = data.vsphere_virtual_machine.template.disks.0.size
eagerly_scrub = data.vsphere_virtual_machine.template.disks.0.eagerly_scrub
thin_provisioned = data.vsphere_virtual_machine.template.disks.0.thin_provisioned
unit_number = 0
}
dynamic "disk" {
for_each = {for idx, size in each.value.disks: idx=>size}
content {
label = "disk${disk.key+1}"
unit_number = idx + 1
size = disk.value
# not sure if these must be changed or not:
eagerly_scrub = data.vsphere_virtual_machine.template.disks.0.eagerly_scrub
thin_provisioned = data.vsphere_virtual_machine.template.disks.0.thin_provisioned
}
}