Terraform 地形对象和嵌套循环
我试图转换一个Terraform 地形对象和嵌套循环,terraform,Terraform,我试图转换一个映射(对象),但我觉得Terraform文档在涉及循环的更复杂用例时有点缺乏 是否有人能够编写for循环,以便output.solution等于local.required\u输出 locals { users = { user1 = { teams = { team1 = "member" team2 = "admin" } } user2
映射(对象)
,但我觉得Terraform文档在涉及循环的更复杂用例时有点缺乏
是否有人能够编写for循环,以便output.solution
等于local.required\u输出
locals {
users = {
user1 = {
teams = {
team1 = "member"
team2 = "admin"
}
}
user2 = {
teams = {
team1 = "member"
}
}
}
desired_output = {
user1_team1 = {
user = "user1"
team = "team1"
role = "member"
}
user1_team2 = {
user = "user1"
team = "team2"
role = "admin"
}
user2_team1 = {
user = "user2"
team = "team1"
role = "member"
}
}
}
output "solution" {
value = ???
}
编辑:
找到了解决方案,但很难看:
locals {
temp_output = flatten([
for user, data in local.users : [
for team, role in data.teams : {
join("-", [user, team]) = {
"user" = user
"team" = team
"role" = role
}
}
]
])
}
output "solution" {
value = {
for tuple in local.temp_output : keys(tuple)[0] => values(tuple)[0]
}
}
有人能提出一个更干净的方法来做这件事吗
编辑2:
继Martin Atkins评论清洁是主观的之后:
我不喜欢我的解决方案的一点是,它要求我将我的循环包装在各种各样的括号中,然后使用另一个循环来解包它们。我想做的是直接从嵌套循环创建所需的输出,而不需要中间步骤创建元组列表
如果这样做有效的话,会更干净:
# Does not work
output = {
for user, data in local.users :
for team, role in data.teams :
join("-", [user, team]) => {
"user" = user
"team" = team
"role" = role
}
}
我不完全理解为什么上述方法不起作用;似乎无法执行嵌套循环,除非内部循环包含在
[]
或{}
中,随后需要更多的代码来展开,以便为每个友好的对象结构找到一个。为什么不仅仅是value=local。所需的
输出?所需的
只是我手工创建的一个示例,以演示我想要的最终结果。可能不应该把它放在locals
块中,我可以理解为什么这会让人困惑。很抱歉如果不知道我们是如何从中构建输出的,就无法回答?你是什么意思?问题是通过修改local.users
来创建一个map(object)
像local.required\u输出那样的。我已经提供了一个解决方案,所以这个问题肯定可以回答。您可能应该使用team(user(arg))
优化原始结构的设计,使其成为map(map(string))
。这对于大多数用例来说都是尴尬的,因为它目前存在。对于这个用例,您甚至可以在之后调用zipmap
。