【问题标题】:Terraform iterate over list and map in one resourceTerraform 在一个资源中迭代列表和映射
【发布时间】:2021-09-22 11:48:32
【问题描述】:

我有资源:

resource "aci_epg_to_static_path" "static_ports" {
  for_each           = var.epgs

  application_epg_dn = aci_application_epg.epgs[each.key].id
  tdn                = "topology/pod-1/paths-101/pathep-[eth1/2]"
  encap              = "vlan-${each.value.vlan_id}"
  mode               = "regular"
}

变量文件:

{
                            },
"epgs":{
         "net-1.1.20.0_24": {"name": "net-1.1.20.0_24",
                                     "bd": "bd_1.1.20.0_24",
                                     "vlan_id": "1000"
                                    },
                 "net-1.1.30.0_24": {"name": "net-1.1.30.0_24",
                                     "bd": "bd_1.1.30.0_24",
                                     "vlan_id": "1001"
                                                 }
        }
"static_ports": ["topology/pod-1/paths-101/pathep-[eth1/2]", 
"topology/pod-1/paths-101/pathep-[eth1/3]"]
}

问题是我想为 tdn 使用字符串列表,例如:

["topology/pod-1/paths-101/pathep-[eth1/2]", "topology/pod-1/paths-101/pathep-[eth1/3]"]

并且提供者资源不支持列表,只支持字符串。

由于我已经在使用 for_each 来获取其他变量,因此似乎不可能同时循环遍历列表。

也许还有其他方法可以解决这个问题?

【问题讨论】:

  • 您需要将var.epgs 的结构从list(string) 更改为map(string),然后您可以为application_epg_dn 分配一个tdn。如果您想要每个application_epg_dn 的所有可能的tdn,那么这需要是map(list(string))。无论哪种方式,我们都需要知道其中哪一个是您的意图,以及您当前的 var.epgs 是什么样的。
  • 你的var.epgs的结构是什么?你能举个例子吗?
  • 据我了解,如果你想遍历同一个 TF 资源中的两个列表变量,你可能想看看 setproduct 函数。
  • 我用变量文件更新了问题。

标签: terraform


【解决方案1】:

感谢Caio 的提示。

我让它在不改变变量结构的情况下工作。 将 var.epgs 转换为列表并使用 setproduct 创建新列表:

> setproduct([for i in var.epgs :"${i.name},${i.vlan_id}"], var.static_ports)
tolist([
  [
    "net-1.1.20.0_24,1000",
    "topology/pod-1/paths-101/pathep-[eth1/2]",
  ],
  [
    "net-1.1.20.0_24,1000",
    "topology/pod-1/paths-101/pathep-[eth1/3]",
  ],
  [
    "net-1.1.30.0_24,1001",
    "topology/pod-1/paths-101/pathep-[eth1/2]",
  ],
  [
    "net-1.1.30.0_24,1001",
    "topology/pod-1/paths-101/pathep-[eth1/3]",
  ],
])

所以我不得不创建新的 loca 变量。

locals {
  static_path_var = setproduct([for i in var.epgs :"${i.name},${i.vlan_id}"], var.static_ports)
}

然后我在资源中使用了这个变量:

resource "aci_epg_to_static_path" "static_ports" {
  for_each = {
    for i in local.static_path_var : "${i[0]}-${i[1]}" => {
      net_vlan = i[0]
      port_path = i[1]
    }
  }

  application_epg_dn = aci_application_epg.epgs[split(",", each.value.net_vlan)[0]].id
  tdn                = each.value.port_path
  encap              = "vlan-${split(",", each.value.net_vlan)[1]}"
  mode               = "regular"

不确定它是否是最佳解决方案,但它可以按预期工作。

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 2021-10-28
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2017-12-22
    • 2015-02-11
    相关资源
    最近更新 更多