У меня проблемы с этой проблемой слишком долго. Я пытаюсь настроить некоторую инфраструктуру с помощью Terraform и Cisco ACI. Что я хочу сделать сейчас, так это настроить несколько epgs для одного арендатора. Итак, с for_each я повторяю свой JSON. Но я не понимаю, как я могу перебирать ключ epg (который содержит список строк). Это не может быть так сложно! Но я не понимаю.
{
"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"
}
]
}
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. Так что, если у вас есть идеи, я был бы очень признателен.
Так что на самом деле я хочу использовать вложенный цикл в моем ресурсе «aci_application_epg». Так что я могу перебирать свой список epg, чтобы использовать каждую запись в этом списке в качестве имени для epg. Написав это, я осознал свою проблему... Я пытаюсь добавить несколько имен для одного epg. Но мне нужно несколько epgs. Мне нужно переосмыслить это и мой .json
Вы должны сгладить свой 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, но это выглядит намного лучше. Спасибо!
Я не уверен, что понимаю, чего вы хотите добиться здесь. Во-первых, требуется аргумент
name
, но я не думаю, что вы можете установить его динамически, и в любом случае он не блочного типа. В ваших данных JSON также естьname
, почему бы не использовать его?