#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. Да, вы абсолютно правы, в этом и была проблема. После добавления спецификации рабочей области к другим ресурсам, которые требовали ее, далее по рецепту все работало идеально. Спасибо!