Terraform: итерация по списку строк во вложенном JSON с помощью terraform-provider-aci

У меня проблемы с этой проблемой слишком долго. Я пытаюсь настроить некоторую инфраструктуру с помощью Terraform и Cisco ACI. Что я хочу сделать сейчас, так это настроить несколько epgs для одного арендатора. Итак, с for_each я повторяю свой JSON. Но я не понимаю, как я могу перебирать ключ epg (который содержит список строк). Это не может быть так сложно! Но я не понимаю.

Прежде всего мой .json

{
   "tenants": [
 {
   "id": 1,
   "name": "kde0815",
   "bd": "bd0815",
   "vRF": "vrf0815",
   "epg": [
      "epg1"
   ],
   "_fwdCtrl": "disabled",
   "_isAttrBasedEPg": "no",
   "_matchT": "no",
   "_prefGrMemb": "unenforced"
},
 {
   "id": 97,
   "name": "kde0816",
   "bd": [
      "bd0816"  
   ],
   "vRF": "vrf0816",
   "epg": [
      "epg1",
      "epg2,
      "epg3,
      "epg4" 
   ],
   "_fwdCtrl": "disabled",
   "_isAttrBasedEPg": "no",
   "_matchT": "no",
   "_prefGrMemb": "unenforced"
}
]
}

мои ресурсы.tf

locals {
  # get json 
  user_data = jsondecode(file("./data/aci-data_test.json"))

  # get all users
  all_users = [for tenants in local.user_data.tenants : tenants.name]

}

resource "aci_application_epg" "epgLocalName" {
  for_each               = { for inst in local.user_data.tenants : inst.id => inst }
  relation_fv_rs_bd      = aci_bridge_domain.bdLocalName[each.value.id].id
  application_profile_dn = aci_application_profile.apLocalName[each.value.id].id
  
  # dynamic "name" {
  #   for_each = each.value.epg 
  #   content {
  #     name = name.value
  #   }
  #}

}

конечно, это не весь мой код. Я уже создал Tenants, Bridgedomains и так далее. Я попытался использовать динамический блок, чтобы перейти к «epg», произошли две ошибки.

Error: Missing required argument
│ The argument "name" is required, but no definition was found
Error: Unsupported block type
│ Blocks of type "name" are not expected here.

поэтому я устал использовать второй цикл for_each

Error: Attribute redefined: The argument "for_each" was already set at resources.tf:54,3-11. Each argument may be set only once.

до сих пор я понял, что вы используете циклы for только для изменения/фильтрации... строк. Есть ли способ просто использовать цикл for для передачи строки в переменную «имя» в aci_applicaton_profile?

Я действительно застрял здесь с Terraform... никогда не было проблем с этим Python. Так что, если у вас есть идеи, я был бы очень признателен.

Я не уверен, что понимаю, чего вы хотите добиться здесь. Во-первых, требуется аргумент name, но я не думаю, что вы можете установить его динамически, и в любом случае он не блочного типа. В ваших данных JSON также есть name, почему бы не использовать его?

Marko E 31.03.2022 09:50

Так что на самом деле я хочу использовать вложенный цикл в моем ресурсе «aci_application_epg». Так что я могу перебирать свой список epg, чтобы использовать каждую запись в этом списке в качестве имени для epg. Написав это, я осознал свою проблему... Я пытаюсь добавить несколько имен для одного epg. Но мне нужно несколько epgs. Мне нужно переосмыслить это и мой .json

Mikesh 31.03.2022 10:17
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы должны сгладить свой user_data. Например:

locals {
 
  flat_all_users = merge([ for id, inst in local.user_data.tenants:
          {
            for epg in inst.epg:
              "${id}-${epg}" => {
                    id = id
                    name = epg
              }
          }    
    ]...)
}

потом

resource "aci_application_epg" "epgLocalName" {
  for_each               = localflat_all_users
  relation_fv_rs_bd      = aci_bridge_domain.bdLocalName[each.value.id].id
  application_profile_dn = aci_application_profile.apLocalName[each.value.id].id
  name                   = each.value.name
}

Хорошо, я думаю, это сработает для меня! Я думал теперь использовать другие .jsons, но это выглядит намного лучше. Спасибо!

Mikesh 31.03.2022 10:35

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