Terraform对接Cisco ACI将Contract绑定EPG报Invalid Index错误
问题排查与修复方案
错误根因
aci_application_epg.epga资源的for_each基于local.epga遍历,生成的资源集合键只有web_epg、db_epg两个值- 绑定Contract的
aci_epg_to_contract资源for_each基于var.epga_contracts遍历,遍历的键是terraform_one、terraform_two、terraform_three三个值 - 代码中直接用Contract配置的键
each.key去索引EPG资源集合,两套键完全不匹配,因此触发索引不存在的报错。同时第二个绑定资源还错误的共用了epga_contracts作为遍历对象,也会导致epgb的绑定逻辑异常。
修复方案
修正绑定资源的索引逻辑,使用Contract配置中指定的epg字段值作为EPG资源的索引键,同时修正epgb绑定资源的遍历对象:
resource "aci_epg_to_contract" "terraform_epgweb_contract" { for_each = var.epga_contracts application_epg_dn = aci_application_epg.epga[each.value.epg].id contract_dn = aci_contract.terraform_contract[each.value.contract].id contract_type = each.value.contract_type } resource "aci_epg_to_contract" "terraform_epgdb_contract" { for_each = var.epgb_contracts application_epg_dn = aci_application_epg.epgb[each.value.epg].id contract_dn = aci_contract.terraform_contract[each.value.contract].id contract_type = each.value.contract_type }
注意事项
- 需确保
epga_contracts中所有epg字段的取值都存在于epga的键集合中,epgb_contracts同理,否则仍然会触发索引不存在的错误 - 该写法支持任意数量Contract与EPG的绑定配置,只需在contracts配置中指定对应EPG的键即可
内容的提问来源于stack exchange,提问作者Jason Holt
相关产品推荐
相关产品推荐

