首页 > 解决方案 > Terraform 对象和嵌套循环

问题描述

我正在尝试转换 a map(object),但我觉得 Terraform 文档在涉及更复杂的循环用例时有点缺乏​​。

有没有人能够编写一个 for 循环,以便output.solution等于local.desired_output

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
      }
}

我不完全理解为什么上述方法不起作用;[]除非内部循环包含在or中,否则您似乎无法执行嵌套循环{},这随后需要更多代码来解包以达到for_each友好的对象结构。

标签: terraform

解决方案


推荐阅读