[英]Transform an object (map) into a distinct list with terraform
使用 Terraform,是否可以转换 object 之类的东西
locals {
data = {
"project1" = {
user_assigned = ["user1", "user2", "user3"]
}
"project2" = {
user_assigned = ["user2", "user3", "user4"]
}
}
到 output 之类的
user1 = ["project1"]
user2 = ["project1","project2"]
user3 = ["project1","project2"]
user4 = ["project2"]
请注意,数据是 object 与键(项目)和值(用户分配)的映射
这是另一种方法,我正在分享它以防万一它很有趣 - 接受的答案也是一种很好的方法。
locals {
data = {
"project1" = {
user_assigned = ["user1", "user2", "user3"]
}
"project2" = {
user_assigned = ["user2", "user3", "user4"]
}
}
project_user = flatten([
for proj_name, proj in local.data : [
for username in proj.user_assigned : {
project_name = proj_name,
username = username
}
]
])
}
output "example" {
value = {
for pu in local.project_user :
pu.username => pu.project_name...
}
}
Outputs:
example = {
"user1" = [
"project1",
]
"user2" = [
"project1",
"project2",
]
"user3" = [
"project1",
"project2",
]
"user4" = [
"project2",
]
}
我通常使用这种方法,因为像中间local.project_user
值这样的数据结构——它是一个包含每个项目/用户对的元素的列表——通常在声明代表这些配对的资源时很有用。
关于这些项目和用户代表什么或他们可能与哪个提供商相关的问题中没有任何上下文,所以我将使用github_team
和github_team_membership
作为示例来说明我的意思:
resource "github_team" "example" {
for_each = local.data
name = each.key
}
resource "github_team_membership" "example" {
for_each = {
for pu in local.project_user : "${pu.username}:${pu.project_name}" => pu
}
team_id = github_team.example[each.value.project_name].id
username = each.value.username
}
许多提供者都有代表两个对象之间关系的资源,因此拥有一个包含每对元素的中间数据结构对于这些情况是一个有用的构建块,然后您可以从任一方向的映射派生为我在原始片段中的output "example"
中做了。
您不能动态创建完全独立的变量。 相反,您可以通过几种方式创建 map。 一种方法是借助transpose和zipmap :
output "test1" {
value = transpose(zipmap(keys(local.data), values(local.data)[*].user_assigned))
}
导致:
test1 = tomap({
"user1" = tolist([
"project1",
])
"user2" = tolist([
"project1",
"project2",
])
"user3" = tolist([
"project1",
"project2",
])
"user4" = tolist([
"project2",
])
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.