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