要通过删除空对象进行映射的 Terraform 元组?
Terraform tuple to map with removing empty objects?
我正在尝试为其他资源中的 for_each 循环创建局部变量,但无法按预期制作局部地图。
以下是我试过的。 (地形 0.12)
预期映射到循环
temple_list = { "test2-role" = "test-test2-role", ... }
main.tf
locals {
tmpl_list = flatten([
for role in keys(var.roles) : {
for tmpl_vars in values(var.roles[role].tmpl_vars) :
role => "test-${role}" if tmpl_vars == "SECRET"
}
])
}
output "tmpl_list" {
value = local.tmpl_list
}
variable "roles" {
type = map(object({
tmpl_vars = map(string)
tags = map(string)
}))
default = {
"test-role" = {
tmpl_vars = {test = "y"}
tags = { test = "xxx"}
}
"test2-role" = {
tmpl_vars = { token = "SECRET" }
tags = {}
}
"test3-role" = {
tmpl_vars = {test = "x"}
tags = {}
}
}
}
错误
来自合并
| var.roles is map of object with 3 elements
Call to function "merge" failed: arguments must be maps or objects, got
"tuple".
没有合并
locals {
tmpl_list = flatten([
for role in keys(var.roles) : {
for tmpl_vars in values(var.roles[role].tmpl_vars) :
role => "test-${role}" if tmpl_vars == "SECRET"
}
])
}
output "tmpl_list" {
value = local.tmpl_list
}
variable "roles" {
type = map(object({
tmpl_vars = map(string)
tags = map(string)
}))
default = {
"test-role" = {
tmpl_vars = {test = "y"}
tags = { test = "xxx"}
}
"test2-role" = {
tmpl_vars = { token = "SECRET" }
tags = {}
}
"test3-role" = {
tmpl_vars = {test = "x"}
tags = {}
}
}
}
没有合并的结果
tmpl_list = [
{},
{
"test2-role" = "test-test2-role"
},
{},
]
我尝试了其他函数,例如 tomap(),但它似乎对我不起作用。
(我也不确定为什么会创建空的。)
如何将此元组转换为没有空元组的映射?
您可以分两步完成:
- 将其转换为过滤后的对象列表:
locals {
result = flatten([
for role, role_value in var.roles: [
for tmpl_vars in role_value.tmpl_vars: {
key = role
value = "test-${role}"
} if tmpl_vars == "SECRET"
]
])
}
local.result
将具有以下值:
[
{
"key" = "test2-role"
"value" = "test-test2-role"
},
]
- 然后用
for
转换成地图就很简单了:
my_map = { for item in local.result: item.key => item.value }
给出:
{
"test2-role" = "test-test2-role"
}
我正在尝试为其他资源中的 for_each 循环创建局部变量,但无法按预期制作局部地图。
以下是我试过的。 (地形 0.12)
预期映射到循环
temple_list = { "test2-role" = "test-test2-role", ... }
main.tf
locals {
tmpl_list = flatten([
for role in keys(var.roles) : {
for tmpl_vars in values(var.roles[role].tmpl_vars) :
role => "test-${role}" if tmpl_vars == "SECRET"
}
])
}
output "tmpl_list" {
value = local.tmpl_list
}
variable "roles" {
type = map(object({
tmpl_vars = map(string)
tags = map(string)
}))
default = {
"test-role" = {
tmpl_vars = {test = "y"}
tags = { test = "xxx"}
}
"test2-role" = {
tmpl_vars = { token = "SECRET" }
tags = {}
}
"test3-role" = {
tmpl_vars = {test = "x"}
tags = {}
}
}
}
错误 来自合并
| var.roles is map of object with 3 elements
Call to function "merge" failed: arguments must be maps or objects, got
"tuple".
没有合并
locals {
tmpl_list = flatten([
for role in keys(var.roles) : {
for tmpl_vars in values(var.roles[role].tmpl_vars) :
role => "test-${role}" if tmpl_vars == "SECRET"
}
])
}
output "tmpl_list" {
value = local.tmpl_list
}
variable "roles" {
type = map(object({
tmpl_vars = map(string)
tags = map(string)
}))
default = {
"test-role" = {
tmpl_vars = {test = "y"}
tags = { test = "xxx"}
}
"test2-role" = {
tmpl_vars = { token = "SECRET" }
tags = {}
}
"test3-role" = {
tmpl_vars = {test = "x"}
tags = {}
}
}
}
没有合并的结果
tmpl_list = [
{},
{
"test2-role" = "test-test2-role"
},
{},
]
我尝试了其他函数,例如 tomap(),但它似乎对我不起作用。 (我也不确定为什么会创建空的。)
如何将此元组转换为没有空元组的映射?
您可以分两步完成:
- 将其转换为过滤后的对象列表:
locals {
result = flatten([
for role, role_value in var.roles: [
for tmpl_vars in role_value.tmpl_vars: {
key = role
value = "test-${role}"
} if tmpl_vars == "SECRET"
]
])
}
local.result
将具有以下值:
[
{
"key" = "test2-role"
"value" = "test-test2-role"
},
]
- 然后用
for
转换成地图就很简单了:
my_map = { for item in local.result: item.key => item.value }
给出:
{
"test2-role" = "test-test2-role"
}