【问题标题】:Iterate over list inside a map of maps with condition在有条件的地图地图中迭代列表
【发布时间】:2022-11-17 18:15:30
【问题描述】:

多变的:

gateways:
  gateway1:
    routingConfig:
      sslCertificates: [
        "a",
        "b"
      ],
    ## amended for brievity
  gateway2:
    routingConfig: {}
    ## amended for brievity

代码尝试:

data "azurerm_key_vault_secret" "ssl_certificates" {
  for_each = {
    for k, v in local.gateways : v.routing_config.ssl_certificates
    if v.routing_config != {}
  }

  name         = each.value
  key_vault_id = data.azurerm_key_vault.ssl_certificates.id
}

这不起作用,它只为每个网关创建一个迭代并尝试将元组插入名称:

each.value 是包含 2 个元素的元组

这是预料之中的,如果你考虑一下,但我不知道如何在循环中做一个循环

对于网关,相同的数据结构有效,因为我可以为 ssl_certificates 属性做动态处理,但我认为我不能在这里这样做

【问题讨论】:

  • 这甚至不是有效的 TF 代码。什么是routing_config?您的“变量”中没有这样的东西。请提供代码和您正在使用的实际变量。
  • wdym有没有这个东西?有,这是一个有效的 tf 代码,我只删除了 {} 因为它们只会弄乱屏幕

标签: azure loops terraform terraform-provider-azure hashicorp


【解决方案1】:

我如何在循环中做一个循环

你必须展平你的变量。例如如下:

locals {
  gateways_flat = merge([
    for gtw, gtw_details in local.gateways: {
      for ssl_cert in gtw_details.routing_config.ssl_certificates:
        "${gtw}-${ssl_cert}" => {
          ssl_certificate = ssl_cert
        }
    } if gtw_details.routing_config != {}
    
  ]...)
}

给予:

{
  "gateway1-a" = {
    "ssl_certificate" = "a"
  }
  "gateway1-b" = {
    "ssl_certificate" = "b"
  }
}

然后

data "azurerm_key_vault_secret" "ssl_certificates" {
  for_each = local.gateways_flat
  name         = each.value.ssl_certificate
  key_vault_id = data.azurerm_key_vault.ssl_certificates.id
}

【讨论】:

  • 谢谢。让我试试看。我见过多次使用 flatten,但我真的不明白它的作用。需要做一些阅读
猜你喜欢
  • 2019-06-30
  • 2019-08-16
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 2019-07-24
相关资源
最近更新 更多