jmk*_*ite 2 for-loop terraform terraform0.12+
我有 terraform,其中使用for. 通常,此资源的每个实例都有几个属性。目前我有这个资源组的一系列映射输出,但每个输出只包含一个键值对。我希望我的 terraform 输出包含地图或对象的列表或地图,其中包含按资源实例分组的所有属性。我如何在不使用的情况下做到这一点flatten;zipmap等从我当前的输出构建它们?这个例子是,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)