Я пытаюсь создать все определенные виртуальные_сети во всех определенных группах ресурсов.
Итак, переменные выглядят так:
inputs = {
virtual_networks = {
"test-net1": {
address_space = ["10.0.0.0/24"]
}
"test-net2": {
address_space = ["10.0.1.0/24"]
}
}
resource_groups = {
"group1": {
location = "West Europe"
}
"group2": {
location = "East Europe"
}
}
}
Блок ресурсов выглядит примерно так:
resource "azurerm_virtual_network" "virtual_network" {
for_each = var.resource_groups
name = <FIRST KEY OF var.virtual_networks>
resource_group_name = each.key
location = each.value["location"]
address_space = <ADDRESS_SPACE VALUE OF FIRST NETWORK FROM var.virtual_networks>
}
Я пробовал много разных способов преобразования/реструктуризации/объединения карт из переменных, чтобы я мог перебирать их лучше для этого варианта использования. Однако я просто не мог найти правильную структуру и как ее построить.
Я создал следующую локальную переменную, чтобы решить эту проблему. Однако мне не удалось структурировать карту таким образом, чтобы я мог перебирать ее в одном блоке ресурсов.
locals = {
resource_groups = {
for key, resource_groups in var.resource_groups : "${key}" =>
merge(
var.virtual_networks,
resource_groups
)
}
}
Выходы:
group1 = {
location = "West Europe"
test-net1 = {
address_space = [
"10.0.0.0/24",
]
}
test-net2 = {
address_space = [
"10.0.1.0/24",
]
}
}
group2 = {
location = "West Europe"
test-net1 = {
address_space = [
"10.0.0.0/24",
]
}
test-net2 = {
address_space = [
"10.0.1.0/24",
]
}
}
Насколько я понимаю, вы хотите создать вложенный цикл для двух словарей. Вы облачно структурируете свой локальный объект следующим образом:
locals {
resource_groups = distinct(flatten([
for k1, rg in var.resource_groups : [
for k2, vn in var.virtual_networks : {
group = merge({name = "${k1}"}, rg )
network = merge({name = "${k2}"}, vn )
}
]
]))
}
Результатом будет:
Changes to Outputs:
+ test = [
+ {
+ group = {
+ location = "West Europe"
+ name = "group1"
}
+ network = {
+ address_space = [
+ "10.0.0.0/24",
]
+ name = "test-net1"
}
},
+ {
+ group = {
+ location = "West Europe"
+ name = "group1"
}
+ network = {
+ address_space = [
+ "10.0.1.0/24",
]
+ name = "test-net2"
}
},
+ {
+ group = {
+ location = "East Europe"
+ name = "group2"
}
+ network = {
+ address_space = [
+ "10.0.0.0/24",
]
+ name = "test-net1"
}
},
+ {
+ group = {
+ location = "East Europe"
+ name = "group2"
}
+ network = {
+ address_space = [
+ "10.0.1.0/24",
]
+ name = "test-net2"
}
},
]
И ваш ресурс будет выглядеть так:
resource "azurerm_virtual_network" "virtual_network" {
for_each = {for obj in local.resource_groups : "${obj.group.name}_${obj.network.name}" => obj}
name = each.value.network.name
resource_group_name = each.value.group.name
location = each.value.group.location
address_space = each.value.network.address_space
}