Мы столкнулись с проблемой с функцией поиска. Он не принимает значение по умолчанию. Я определил значения по умолчанию для хранилища данных в переменной.tf как карту и передал временное значение из tfvars.
У меня есть два ключа, определенные в файле TFvars. Один из ключей не содержит значения хранилища данных; функция поиска должна подобрать значение по умолчанию для этого ключа, но она этого не делает. Какие-либо предложения?
Код модуля: (Добавляем только соответствующие коды.)
module "vm_creation" {
for_each = var.vm
source = "Terraform-VMWare-Modules/vm/vsphere"
version = "3.8.0"
dc = var.dc_name[var.vsphere_datacentre]
datastore = lookup(each.value, "datastore_name", var.datastore_name[var.vsphere_datacentre])
network = each.value.network
staticvmname = "${var.vsphere_datacentre}-${each.value.vmname}"
vmfolder = var.folder_name
vmgateway = each.value.vmgateway
vmrp = var.pool_name[var.vsphere_datacentre]
vmtemp = var.vm_template[var.vsphere_datacentre]
...
}
Переменная:
variable "vm" {
type = map(object({
network = map(list(string))
vmname = string
vmgateway = string
datastore_name = string
}))
}
variable "datastore_name" {
description = "Provide the datastore name"
type = map(string)
default = {
idev = "dev_nfs_hx"
lon = "lon_nfs_hx"
rtp = "rtp_nfs_hx"
}
}
TFвары:
vsphere_datacentre = “idev”
domain_name = “idev.com”
vsphere_env = “idev”
vm = {
coredns_vm_1 = {
vmname = “coredns-1”,
vmgateway = “10.1.15.1”
network = {
“vlan15” = [“10.1.15.101”],
}
datastore_name = “idev-011-raid1”
},
coredns_vm_2 = {
vmname = “coredns-2”,
vmgateway = “10.1.25.1”
network = {
“vlan25” = [“10.1.25.102”],
}
}
}
Ошибка:
30: coredns_vm_2 = { │ 31: vmname = "coredns-2", │ 32: vmgateway = «10.15.25.1» │ 33: сеть = { │ 34: "vlan25" = ["10.15.25.102"], │ 35: } │ 38: │ 39: } │ 40: } │ │ Данное значение не подходит для var.vm, объявленного в переменные.tf:121,1-14: элемент «coredns_vm_2»: │ требуется атрибут datastore_name.
Функция lookup
на самом деле делает то, что должна. Ошибка возникает из-за того, что ключ coredns_vm_2
не содержит ключ datastore_name
, который является обязательным атрибутом согласно определению вашей переменной. Вы можете попробовать определить datastore_name
как необязательный атрибут , что-то вроде:
variable "vm" {
type = map(object({
network = map(list(string))
vmname = string
vmgateway = string
datastore_name = optional(string, "")
}))
}
Затем при вызове модуля я переключился с использования lookup
на использование тернарного оператора:
datastore = each.value.datastore_name != "" ? each.value.datastore_name : var.datastore_name[var.vsphere_datacentre]
Можете ли вы уточнить, что означает it's randomly picking up the datastore(as per the module condition)
?
я имел в виду github.com/Terraform-VMWare-Modules/terraform-vsphere-vm/blob/… состояние.
Но это отсюда: vmtemp = var.vm_template[var.vsphere_datacentre]
. Не похоже, что это ваша первоначальная проблема.
Нет, я имел в виду datastore_id = var.datastore != "" ? data.vsphere_datastore.datastore[0].id : null
Обновил ответ, это должно работать.
Все работает так, как и ожидалось @Marko, спасибо.
Спасибо за ответ @Marko, когда я попробовал с
datastore_name = optional(string)
, возникла ошибкаThe argument "name" is required, but no definition was found.
. Однако, когда я попробовал использоватьdatastore_name = optional(string, "")
, он случайно выбрал хранилище данных (согласно условию модуля) вместо значения по умолчанию"dev_nfs_hx"
.