Terraform嵌套dynamic block读取JSON二层属性报错求助
问题原因
你的错误来自于内层members动态块的for_each参数传入了非集合类型的值:
你JSON结构里的avi_gslbservice_groups_ip是单个对象,并不是列表/集合类型。当你把单个对象直接传给for_each时,Terraform会自动将对象的键值对拆分为独立迭代项,迭代出来的members.value实际是单个属性的值(比如url2、false),自然无法通过["host"]/["enabled"]索引取值。
解决方案
分两种场景适配:
场景1:每个group固定只有1个member(和你当前JSON结构匹配)
不需要嵌套dynamic "members"块,直接在groups的content里写member配置即可,修正后的代码如下:
dynamic "groups" { for_each = var.avi_gslbservice_groups content { members { ip { type = "V4" addr = "" } fqdn = groups.value.avi_gslbservice_groups_ip.host vs_uuid = "" cluster_uuid = "" ratio = 1 enabled = groups.value.avi_gslbservice_groups_ip.enabled } name = groups.value.name priority = groups.value.priority algorithm = groups.value.algorithm } }
场景2:后续需要支持1个group对应多个member
先修改你的JSON结构,把avi_gslbservice_groups_ip改为数组类型:
{ "avi_gslbservice_groups": [ { "name": "us-east-1", "priority": 10, "algorithm": "GSLB_ALGORITHM_ROUND_ROBIN", "avi_gslbservice_groups_ip": [ { "host": "url2", "enabled": "false" } ] }, { "name": "us-east-2", "priority": 7, "algorithm": "GSLB_ALGORITHM_TOPOLOGY", "avi_gslbservice_groups_ip": [ { "host": "url1", "enabled": "false" } ] } ] }
修改后你原来的dynamic "members"的迭代逻辑就可以正常运行。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

