每当我尝试使用嵌套映射(对象)来声明动态磁盘时,都会收到无效变量错误。
只要我不在 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
}
]
}
}
任何帮助我指明正确方向的帮助将不胜感激。
如果我不嵌套我的地图(对象),我可以很好地部署虚拟机。仅当我尝试使用嵌套映射(对象)动态配置磁盘时才会出现此问题。
您的变量输入值包含多个未在类型中定义的对象成员。而且
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 的行为是忽略输入变量中没有相应类型定义的对象成员。虽然这个附带问题不会导致您的错误,但它可能会导致意外行为并成为您的下一个问题。