Terraform 如何在另一个资源中使用来自一个资源的每个值

Posted

技术标签:

【中文标题】Terraform 如何在另一个资源中使用来自一个资源的每个值【英文标题】:Terraform How to use for each values from one resource in another resource 【发布时间】: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 【参考方案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] 表达式指的是相应实例的对象表示其他资源,通过映射键关联。

【讨论】:

您好,感谢您的回复,这对我想要做的事情进行了完美的排序。非常感谢!

以上是关于Terraform 如何在另一个资源中使用来自一个资源的每个值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 terraform 在多个区域进行设置?

在另一个模块中为 EC2 添加指定子网 - AWS Terraform -

在另一个模板中包含一个 terraform 模板

如何从 terraform 状态中删除资源?

使用 terraform 如何创建一个跨多个项目使用的服务帐户?

如何使用 Terraform 将资源动态附加到内联策略?