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 如何在另一个资源中使用来自一个资源的每个值的主要内容,如果未能解决你的问题,请参考以下文章
在另一个模块中为 EC2 添加指定子网 - AWS Terraform -