在 Terraform 中访问嵌套地图(对象)

问题描述 投票:0回答:1

每当我尝试使用嵌套映射(对象)来声明动态磁盘时,都会收到无效变量错误。

只要我不在 vm_profiles 中包含 disk_profiles,我的代码就可以工作。但是,由于我使用映射(对象)进行虚拟机配置,因此我认为在这里包含每个虚拟机各自的磁盘会更容易。这是我第一次尝试使用 Terraform,因此我所做的很可能不受支持或不准确。

错误:

│ Error: Invalid value for input variable
│
│   on terraform.tfvars line 5:
│    5: vm_profiles = {

这是我的 main.tf、variables.tf 和 terraform.tfvars 文件的片段。

这是我的 main.tf 文件:

resource "vsphere_virtual_machine" "vm" {
  for_each = var.vm_profiles
  name                  = each.value.name
  num_cpus              = each.value.cpu
  num_cores_per_socket  = each.value.cores_per_socket
  memory                = each.value.memory
  scsi_controller_count = each.value.scsi_contrl

  resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
  datastore_id     = data.vsphere_datastore.datastore_cluster.id

  guest_id             = data.vsphere_virtual_machine.template.guest_id
  scsi_type                 = data.vsphere_virtual_machine.template.scsi_type
  firmware                  = data.vsphere_virtual_machine.template.firmware
  #wait_for_guest_ip_timeout = each.value.cpu - 1 

  custom_attributes = {
    (data.vsphere_custom_attribute.appname.id) = each.value.appname
    (data.vsphere_custom_attribute.owner.id)   = each.value.owner
  }

  disk {
    label            = var.vm_disk0_label
    size             = var.vm_disk0_size_gb
    unit_number      = "0"
    thin_provisioned = false
    eagerly_scrub    = false
  }

  dynamic "disk" {
    for_each = each.value.disk_profiles
    content {
      label             = each.value.disk_profiles.label
      size              = each.value.disk_profiles.size
      unit_number       = each.value.disk_profiles.unit_number
      thin_provisioned  = false
      eagerly_scrub     = false
    }
  }

这是我的变量.tf 文件:

variable "vm_profiles" {
  description = "Prefix name for virtual machine"
  type = map(object({
    name              = string
    cpu               = number
    memory            = number
    domain            = string
    vm_ipv4_address   = string
    vm_ipv4_netmasks  = number
    vm_ipv4_gateway   = string
    vm_dns_servers    = list(string)
    disk_profiles = map(object({
      label           = string
      size            = number
      unit_number     = number
    }))
  }))
}

这是我的 terraform.tfvars 文件:

vm_profiles = {
  host01= {
    name             = "vmlab01"
    cpu              = 4
    cores_per_socket = 1
    scsi_contrl      = 4
    memory           = 4096
    domain           = "WORKGROUP"
    vm_ipv4_address  = "10.20.10.48"
    vm_ipv4_netmasks = 24
    vm_ipv4_gateway  = "10.20.10.254"
    vm_dns_servers   = ["10.20.10.21", "10.20.10.22"]
    appname          = "Prov_Test"
    owner            = "First Last"
    local_admin_pass = "localpswdtst01"
    disk_profiles = [
      #{
      #  label       = "disk0"
      #  size        = 80
      #  unit_number = 0
      #},
      {
        label       = "disk1"
        size        = 10
        unit_number = 1
      },
      {
        label       = "disk2"
        size        = 20
        unit_number = 2
      },
      {
        label       = "disk3"
        size        = 100
        unit_number = 15
      },
      {
        label       = "disk4"
        size        = 30
        unit_number = 30
      },
      {
        label       = "disk5"
        size        = 10
        unit_number = 45
      },
    ]
  }
  host02 = {
    name             = "vmlab02"
    cpu              = 4
    cores_per_socket = 2
    memory           = 4096
    domain           = "WORKGROUP"
    vm_ipv4_address  = "10.20.10.49"
    vm_ipv4_netmasks = 24
    vm_ipv4_gateway  = "10.20.10.254"
    vm_dns_servers   = ["10.20.10.21", "10.20.10.22"]
    appname          = "Prov_Test"
    owner            = "First Last"
    local_admin_pass = "localpswdtst02"
    disk_profiles = [
      {
        label       = "disk1"
        size        = 50
        unit_number = 1
      }
    ]
  }
}

任何帮助我指明正确方向的帮助将不胜感激。

如果我不嵌套我的地图(对象),我可以很好地部署虚拟机。仅当我尝试使用嵌套映射(对象)动态配置磁盘时才会出现此问题。

terraform vsphere
1个回答
0
投票

您的变量输入值包含多个未在类型中定义的对象成员。而且

disk_profiles
list(object)
而不是
map(object)
。您需要添加/更正它们的定义:

type = map(object({
  name              = string
  cpu               = number
  cores_per_socket  = number
  scsi_contrl       = number
  memory            = number
  domain            = string
  vm_ipv4_address   = string
  vm_ipv4_netmasks  = number
  vm_ipv4_gateway   = string
  vm_dns_servers    = list(string)
  appname           = string
  owner             = string
  local_admin_pass  = string
  disk_profiles     = list(object({
    label       = string
    size        = number
    unit_number = number
  }))
}))

您可能还想知道为什么只有

disk_profiles
的错误类型定义才会触发错误,而不是缺少的类型定义。这是因为 Terraform 的行为是忽略输入变量中没有相应类型定义的对象成员。虽然这个附带问题不会导致您的错误,但它可能会导致意外行为并成为您的下一个问题。

© www.soinside.com 2019 - 2024. All rights reserved.