使用terraform将对象(地图)转换为不同的列表

使用terraform将对象(地图)转换为不同的列表,terraform,terraform0.12+,terraform0.11,Terraform,Terraform0.12+,Terraform0.11,在Terraform中,是否可以将对象转换为 locals { data = { "project1" = { user_assigned = ["user1", "user2", "user3"] } "project2" = { user_assigned = ["user2",

在Terraform中,是否可以将对象转换为

locals {
  data = {
    "project1" = {
      user_assigned           = ["user1", "user2", "user3"]
     }
    "project2" = {
      user_assigned           = ["user2", "user3", "user4"]
     }
  }
输出类似于

user1 = ["project1"]
user2 = ["project1","project2"]
user3 = ["project1","project2"]
user4 = ["project2"]

请注意,数据是一个具有键(项目)和值(用户指定)映射的对象。

您无法动态创建完全独立的变量。相反,您可以用几种方法创建地图。一种方法是借助和:

导致:

test1 = tomap({
  "user1" = tolist([
    "project1",
  ])
  "user2" = tolist([
    "project1",
    "project2",
  ])
  "user3" = tolist([
    "project1",
    "project2",
  ])
  "user4" = tolist([
    "project2",
  ])
})

这里有另一种方法,我正在分享,以防它有趣——公认的答案也是一种很好的方法

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

我通常使用这种方法,因为像中间的
local.project\u user
值这样的数据结构——它是一个列表,每个项目/用户对都有一个元素——在声明表示这些对的资源时通常非常有用

问题中没有任何关于这些项目和用户代表什么或他们可能与哪个提供商相关的上下文,因此我将使用
github\u团队
github\u团队成员
作为示例来说明我的意思:

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
}

许多提供程序都有表示两个对象之间关系的资源,因此对于这些情况,中间数据结构包含每对对象的一个元素是一个有用的构建块,然后您可以从任何方向的映射中派生,就像我在
输出“示例”中所做的那样
在我的原始代码片段中。

非常感谢,这很有效。但是,我无法获取“${each.value}”,因为它是字符串列表。有什么办法吗资源“local_file”“foo”{for_each=transpose(zipmap(key(local.data)、value(local.data)[*].user_assigned))content=“${each.value}”filename=“${each.key}”}`@Devopsnoob没有问题。我建议用相关代码示例提出新问题,错误消息格式正确(不在注释中),因为这似乎是一个新问题。当然。这是链接-
Outputs:

example = {
  "user1" = [
    "project1",
  ]
  "user2" = [
    "project1",
    "project2",
  ]
  "user3" = [
    "project1",
    "project2",
  ]
  "user4" = [
    "project2",
  ]
}
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
}