Terraform — вложенный цикл для создания ресурсов

Я пытаюсь создать все определенные виртуальные_сети во всех определенных группах ресурсов.

Итак, переменные выглядят так:

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",
                    ]
                }
            }       
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Насколько я понимаю, вы хотите создать вложенный цикл для двух словарей. Вы облачно структурируете свой локальный объект следующим образом:

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

}

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