【问题标题】:Terraform - Iterate through map of maps depending on value of internal mapTerraform - 根据内部地图的值迭代地图地图
【发布时间】:2020-09-30 07:49:20
【问题描述】:

我正在尝试根据地图内部地图的值创建资源。 如果该特定值为 true,则创建资源

请在下面找到代码:

variable "ip_restrictions" {
  type        = map(map(string))
  default = {
    test01 = {
      name                      = "test01"
      start_ip_address          = "0.0.0.0"
      end_ip_address            = "0.0.0.0"
      is_firewall               = false
    },
    test02 = {
      name                      = "test02"
      start_ip_address          = "0.0.0.0"
      end_ip_address            = "0.0.0.0"
      is_firewall               = true
    }
  }
}

resource "azurerm_sql_firewall_rule" "sql_firewall_rules" {
  for_each = {
    for restr in var.ip_restrictions :
    restr => restr
    if restr.is_firewall == true
  }
  
  name                = each.value.name
  resource_group_name = azurerm_resource_group.rg.name
  server_name         = azurerm_sql_server.sqls.name
  start_ip_address    = each.value.start_ip_address
  end_ip_address      = each.value.end_ip_address
}

【问题讨论】:

    标签: for-loop foreach resources terraform


    【解决方案1】:

    for_each 的正确格式应该是:

      for_each = {
        for key, restr in var.ip_restrictions :
          key => restr if restr.is_firewall == "true"
      }
    

    这将过滤掉所有具有is_firewallfalse 的记录。

    【讨论】:

    • 换行符是否会影响 for 的功能?我还想了解的是,如果您之前添加的“键”=> 是我尝试遍历的地图的键({test01 = {valuesOfTheObject/map},test02 = {valuesOfTheObject/map }}) 或对象本身的键 {name="",start_ip_address="",etc...}\
    • @RMDev 不,你可以把它放在第二行。我只是放了它,因为它节省了一些空间。
    • 我已经编辑了问题,请您再看一遍问题吗?
    • @RMDev 我看不出问题有什么变化?
    • 你去 :) 我还想了解的是,如果您之前添加的“键”=> 是我要遍历的地图的键({test01 = {valuesOfTheObject/map}, test02 = {valuesOfTheObject/map}}) 或对象本身的键 {name="",start_ip_address="",etc...}
    【解决方案2】:

    由于您的 var.ip_restrictionsma​​p 而不是 list,因此您需要像 map 一样对其进行迭代(返回键和值)。在您的情况下最短的方法:

    for_each = {
      for key, restr in var.ip_restrictions :
        key => restr if restr.is_firewall
    }
    

    给予:

    "test02" = {
      "end_ip_address"   = "0.0.0.0"
      "is_firewall"      = "true"
      "name"             = "test02"
      "start_ip_address" = "0.0.0.0"
    }
    

    【讨论】:

    • is "key => restr if restr.is_firewall" 如果我​​没有布尔值也可以工作吗?因为我已经将对象创建为字符串映射的映射。
    • 是的,我在 terraform 0.13.3 中使用您使用的相同地图对此进行了测试。即使将 is_firewall 设置为“true”或“false”,结果也是一样的。
    • key => restr,这部分意味着它应该返回一个以“test02”为键,其他元素为值的新地图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2020-12-09
    • 2023-03-14
    • 2020-08-11
    • 2012-10-22
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多