如何在 terraform 中循环嵌套对象地图?

问题描述 投票:0回答:1

我希望下面的资源能够摄取包含嵌套对象映射的变量/本地。

资源:

resource "azurerm_postgresql_flexible_server_firewall_rule" "pgsql_fw_rules" {
  for_each = ???
  server_id        = module.pgsql[each.key].id
  name             = ???
  start_ip_address = ???
  end_ip_address   = ???
}

变量/局部:

  + output1 = {
      + aa1 = {
          + azure_services = {
              + end_ip   = "0.0.0.0"
              + start_ip = "0.0.0.0"
            }
          + rule2          = {
              + end_ip   = "10.255.255.255"
              + start_ip = "10.0.0.1"
            }
          + ruleabc        = {
              + end_ip   = "1.1.1.2"
              + start_ip = "1.1.1.1"
            }
          + tf_user        = {
              + end_ip   = "127.0.0.2"
              + start_ip = "127.0.0.1"
            }
        }
      + aa2 = {
          + azure_services = {
              + end_ip   = "0.0.0.0"
              + start_ip = "0.0.0.0"
            }
          + rulexyz        = {
              + end_ip   = "1.1.1.2"
              + start_ip = "1.1.1.1"
            }
          + tf_user        = {
              + end_ip   = "127.0.0.2"
              + start_ip = "127.0.0.1"
            }
        }
    }

正如您从上面的资源中看到的,我不确定如何访问每个对象映射的内容,这就是我想要的帮助。

这里有一些限制:

  • 资源中的
    each.key
    语句必须是客户的名称(aa1、aa2等)-第一个地图的键
  • 我无法更改名为 output1 的原始变量/本地,因此必须从 for_each 资源(最好)或创建另一个本地来解决该问题

我假设:

  • 带有嵌套
    for
    的 for_each 可以实现技巧,尽管构建它的逻辑我不明白
  • 可能有一种简单(神奇的:-/)方法来引用这些内部地图字符串,例如每个.[*].value.start_ip

有什么想法吗?

terraform terraform-provider-azure
1个回答
0
投票

为了让事情变得更容易,您可以:

  1. 扁平化所有规则
  2. 使用自定义键创建地图,例如
    ${server_name}-${rule_name}
  3. 最后,迭代您要管理的资源中的地图
    for_each
工作示例:

locals { output1 = { aa1 = { azure_services = { end_ip = "0.0.0.0" start_ip = "0.0.0.0" } rule2 = { end_ip = "10.255.255.255" start_ip = "10.0.0.1" } ruleabc = { end_ip = "1.1.1.2" start_ip = "1.1.1.1" } tf_user = { end_ip = "127.0.0.2" start_ip = "127.0.0.1" } } aa2 = { azure_services = { end_ip = "0.0.0.0" start_ip = "0.0.0.0" } rulexyz = { end_ip = "1.1.1.2" start_ip = "1.1.1.1" } tf_user = { end_ip = "127.0.0.2" start_ip = "127.0.0.1" } } } flattened_rules = flatten([ for server_name, rules in local.output1 : [ for rule_name, details in rules : { server_name = server_name rule_name = rule_name start_ip = details.start_ip end_ip = details.end_ip } ] ]) # Create a map with key as "${server_name}-${rule_name}" and value as the rule details rules_map = { for rule in local.flattened_rules : "${rule.server_name}-${rule.rule_name}" => rule } } resource "null_resource" "example" { for_each = local.rules_map triggers = { server_name = each.value.server_name rule_name = each.value.rule_name start_ip = each.value.start_ip end_ip = each.value.end_ip } }
跑步

terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # null_resource.example["aa1-azure_services"] will be created + resource "null_resource" "example" { + id = (known after apply) + triggers = { + "end_ip" = "0.0.0.0" + "rule_name" = "azure_services" + "server_name" = "aa1" + "start_ip" = "0.0.0.0" } } # null_resource.example["aa1-rule2"] will be created + resource "null_resource" "example" { + id = (known after apply) + triggers = { + "end_ip" = "10.255.255.255" + "rule_name" = "rule2" + "server_name" = "aa1" + "start_ip" = "10.0.0.1" } } # null_resource.example["aa1-ruleabc"] will be created + resource "null_resource" "example" { + id = (known after apply) + triggers = { + "end_ip" = "1.1.1.2" + "rule_name" = "ruleabc" + "server_name" = "aa1" + "start_ip" = "1.1.1.1" } } # null_resource.example["aa1-tf_user"] will be created + resource "null_resource" "example" { + id = (known after apply) + triggers = { + "end_ip" = "127.0.0.2" + "rule_name" = "tf_user" + "server_name" = "aa1" + "start_ip" = "127.0.0.1" } } # null_resource.example["aa2-azure_services"] will be created + resource "null_resource" "example" { + id = (known after apply) + triggers = { + "end_ip" = "0.0.0.0" + "rule_name" = "azure_services" + "server_name" = "aa2" + "start_ip" = "0.0.0.0" } } # null_resource.example["aa2-rulexyz"] will be created + resource "null_resource" "example" { + id = (known after apply) + triggers = { + "end_ip" = "1.1.1.2" + "rule_name" = "rulexyz" + "server_name" = "aa2" + "start_ip" = "1.1.1.1" } } # null_resource.example["aa2-tf_user"] will be created + resource "null_resource" "example" { + id = (known after apply) + triggers = { + "end_ip" = "127.0.0.2" + "rule_name" = "tf_user" + "server_name" = "aa2" + "start_ip" = "127.0.0.1" } } Plan: 7 to add, 0 to change, 0 to destroy.
    
© www.soinside.com 2019 - 2024. All rights reserved.