Как выполнить for_each по карте внутри карты со строками на основе рабочей области

#foreach #terraform

#инструкция foreach #терраформирование

Вопрос:

У меня есть переменная, подобная этой:

 variable "hosts" {  type = map(map(string))  default = {  workspace1 = {  hostname1-workspace1-1 = 177.104  hostname1-workspace1-2 = 177.105  hostname1-workspace1-3 = 177.106  }  workspace2 = {  hostname1-workspace2-1 = 129.124  hostname1-workspace2-2 = 129.125  hostname1-workspace2-3 = 129.126  }  } }  

и я пытаюсь выполнить for_each по этой карте, чтобы я мог создать сетевую карту виртуальной машины для каждого хоста на карте, но только для любого выбранного рабочего пространства. Где каждый.ключом должно быть имя выбранной текущей рабочей области, и каждое.значение должно быть последними 2 октетами IP-адреса на основе рабочей области, которую я попробовал, что-то вроде этого:

 resource "azurerm_network_interface" "redis_vm_nic" {  for_each = var.hosts[terraform.workspace]  name = "${each.key}VMNic"  location = "${var.redis_rg_location[terraform.workspace]}"  resource_group_name = azurerm_resource_group.infrastructure_redis_rg.name  ip_configuration {  name = "ipconfig${each.key}"  subnet_id = var.aks_subnet  private_ip_address_allocation = "Static"  private_ip_address = "10.99.${each.value}"  }  tags = var.tags_vms }  

но я понимаю:

 │ │ on main.tf line 59, in resource "azurerm_linux_virtual_machine" "virtual_machine": │ 59: network_interface_ids = [azurerm_network_interface.redis_vm_nic[each.key].id] │ ├──────────────── │ │ azurerm_network_interface.redis_vm_nic is object with 3 attributes │ │ each.key is "workspace1" │ │ The given key does not identify an element in this collection value. ╵ ╷ │ Error: Invalid index │ │ on main.tf line 59, in resource "azurerm_linux_virtual_machine" "virtual_machine": │ 59: network_interface_ids = [azurerm_network_interface.redis_vm_nic[each.key].id] │ ├──────────────── │ │ azurerm_network_interface.redis_vm_nic is object with 3 attributes │ │ each.key is "workspace2" │ │ The given key does not identify an element in this collection value. ╵  

Комментарии:

1. Что такое виртуальная машина azurerm_linux_virtual_machine»»?

Ответ №1:

Ваша проблема, конечно, не в azurerm_network_interface этом . Вы правильно выполняете итерацию на подкарте. Я думаю, проблема в том, как вы это делаете for_each azurerm_linux_virtual_machine . Из того, что я вижу в ошибке, for_each для виртуальной машины Linux, вероятно, в этом формате:

 for_each = var.hosts  

Вам больше всего хотелось бы , чтобы все было так, как есть azurerm_network_interface , так что:

 resource "azurerm_linux_virtual_machine" "virtual_machine" {  for_each = var.hosts[terraform.workspace]  ... }  

Комментарии:

1. Да, вы абсолютно правы, в этом и была проблема. После добавления спецификации рабочей области к другим ресурсам, которые требовали ее, далее по рецепту все работало идеально. Спасибо!