【问题标题】:Terraform How to use for each values from one resource in another resourceTerraform 如何在另一个资源中使用来自一个资源的每个值
【发布时间】:2020-10-29 22:56:57
【问题描述】:

我正在尝试基于一个简单的 csv 在 terraform 云中创建用户,结构如下:

email,access_level
test@gmail.com,readonly
test2@gmail.come,owners

我可以使用以下资源块轻松创建用户:

locals {
  users_csv = csvdecode(file("${path.module}/users.csv"))

}


resource "tfe_organization_membership" "users_csv" {
  for_each = { for r in local.users_csv : r.email => r }

  organization  = var.ppl_organisation
  email = each.value.email
}

但是,如果我想将它们添加到团队中,那么我需要将上述资源中的“id”输出到以下资源中:

resource "tfe_team_organization_member" "readonly_member" {
  for_each = { for r in local.read_only : r.email => r }

  team_id = each.value.access_level == "readonly" ? each.value.access_level : local.readonly_id
  organization_membership_id = "${tfe_organization_membership.users_csv.id}"
}

有没有办法通过这个?

提前致谢。

【问题讨论】:

  • 你可以试试organization_membership_id = tfe_organization_membership.users_csv[each.key].id

标签: terraform terraform0.12+


【解决方案1】:

我认为我在这里要做的第一件事是将 CSV 数据从列表投影到地图,如下所示:

locals {
  users_csv = csvdecode(file("${path.module}/users.csv"))
  users     = { for r in local.users_csv : r.email => r }
}

通过像这样定义local.users,我们可以更简洁地在配置的其他地方多次引用该值:

resource "tfe_organization_membership" "users_csv" {
  for_each = local.users

  organization = var.ppl_organisation
  email        = each.value.email
}

resource "tfe_team_organization_member" "readonly_member" {
  for_each = local.users

  team_id = (
    each.value.access_level == "readonly" ?
    each.value.access_level :
    local.readonly_id
  )
  organization_membership_id = tfe_organization_membership.users_csv[each.key].id
}

任何设置了for_each 的资源在表达式中都表示为对象的映射,其键与for_each 输入映射相同,因此tfe_organization_membership.users_csv[each.key] 表达式指的是相应实例的对象表示其他资源,通过映射键关联。

【讨论】:

  • 您好,感谢您的回复,这对我想要做的事情进行了完美的排序。非常感谢!
猜你喜欢
  • 2021-12-11
  • 2023-03-24
  • 2020-09-16
  • 1970-01-01
  • 2020-12-17
  • 2021-12-14
  • 2020-09-21
  • 2022-07-28
  • 1970-01-01
相关资源
最近更新 更多