Функция поиска не получает значение по умолчанию из переменной

Мы столкнулись с проблемой с функцией поиска. Он не принимает значение по умолчанию. Я определил значения по умолчанию для хранилища данных в переменной.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.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция 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]

Спасибо за ответ @Marko, когда я попробовал с datastore_name = optional(string), возникла ошибка The argument "name" is required, but no definition was found.. Однако, когда я попробовал использовать datastore_name = optional(string, ""), он случайно выбрал хранилище данных (согласно условию модуля) вместо значения по умолчанию "dev_nfs_hx".

Gowthamakanthan Gopal 08.08.2024 10:24

Можете ли вы уточнить, что означает it's randomly picking up the datastore(as per the module condition)?

Marko E 08.08.2024 10:36

я имел в виду github.com/Terraform-VMWare-Modules/terraform-vsphere-vm/blo‌​b/… состояние.

Gowthamakanthan Gopal 08.08.2024 10:43

Но это отсюда: vmtemp = var.vm_template[var.vsphere_datacentre]. Не похоже, что это ваша первоначальная проблема.

Marko E 08.08.2024 10:45

Нет, я имел в виду datastore_id = var.datastore != "" ? data.vsphere_datastore.datastore[0].id : null

Gowthamakanthan Gopal 08.08.2024 10:55

Обновил ответ, это должно работать.

Marko E 08.08.2024 11:12

Все работает так, как и ожидалось @Marko, спасибо.

Gowthamakanthan Gopal 08.08.2024 12:28

Другие вопросы по теме