每个“for”资源都具有多个属性的 Terraform 输出对象?

jmk*_*ite 2 for-loop terraform terraform0.12+

我有 terraform,其中使用for. 通常,此资源的每个实例都有几个属性。目前我有这个资源组的一系列映射输出,但每个输出只包含一个键值对。我希望我的 terraform 输出包含地图或对象的列表或地图,其中包含按资源实例分组的所有属性。我如何在不使用的情况下做到这一点flattenzipmap等从我当前的输出构建它们?这个例子是,aws_route53_record但这是一个通用查询:

当前代码

output "r53record_zonal_fqdn" {
  value = {
    for entry in aws_route53_record.zonal :
    entry.name => entry.fqdn
  }
}
output "r53record_zonal_records" {
  value = {
    for entry in aws_route53_record.zonal :
    entry.name => entry.records
  }
}
output "r53record_zonal_zone_id" {
  value = {
    for entry in aws_route53_record.zonal :
    entry.name => entry.zone_id
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所料,这将渲染三个地图,aws_route53_record.zonal.name以键为键,以其他属性为值。

我想要的是让这些输出按资源分组,每个值都有一个预定义的键,例如(伪代码):

output "r53record_zonal_zone_id" {
    value = {
        for entry in aws_route53_record.zonal : {
            instance[count.index] {
                "name"    = entry.name 
                "fqdn"    = entry.fqdn
                "records" = entry.records
                "zone_id" = entry.zone_id
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为每个实例生成地图或地图列表。

如何做到这一点或类似的事情?

小智 5

我在 for_each 循环中创建了一个带有两个“名称”参数的随机 route53_record 资源块,并尝试输出与您要查找的内容接近的内容。

假设“mydomain.com”是Route53中的域作为例子......

resource "aws_route53_record" "zonal" {
for_each=toset(["site1","site2"])
  name    = each.key
  zone_id = "ABCDZONEIDSTRING"
  type    = "A"
  ttl     = "300"
  records = ["192.168.1.10"]
}



output "test" {
  value = {
    for dns, details in aws_route53_record.zonal:
    dns => ({"fqdn" = details.fqdn , "zone_id" = details.zone_id , "records" = details.records})
  }
}
Run Code Online (Sandbox Code Playgroud)

这将以这种方式创建输出..

    test = {
      "site1" = {
         "fqdn" = "site1.mydomain.com"
         "records" = [
           "192.168.1.10",
         ]
         "zone_id" = "Z0630117NTQNSYTXYQ4Z"
      }

      "site2" = {
         "fqdn" = "site2.mydomain.com"
         "records" = [
          "192.168.1.10",
         ]
         "zone_id" = "Z0630117NTQNSYTXYQ4Z"
       }
    }
Run Code Online (Sandbox Code Playgroud)

假设您通过域名传递名称值,如下所示...

for_each=toset(["site1.mydomain.com","site2.mydomain.com"])
Run Code Online (Sandbox Code Playgroud)

输出看起来像

    test = {
       "site1.mydomain.com" = {
       "fqdn" = "site1.mydomain.com"
       "records" = [
        "192.168.1.10",
       ]
       "zone_id" = "ABCDMYZONEIDSTRING"
       }

       "site2.mydomain.com" = {
       "fqdn" = "site2.mydomain.com"
       "records" = [
        "192.168.1.10",
       ]
       "zone_id" = "ABCDMYZONEIDSTRING"
       }
    }
Run Code Online (Sandbox Code Playgroud)