Search code examples
terraformterraform-provider-vsphere

Terraform How to add Dyanmic number of DATA disks to vSphere VMs


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


Solution

  • 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
          }  
      }