我对 Terraform 还很陌生,可能是我想要的太多......但情况就是这样 这就是我的 .tfvars(部分)
st_resources = {
"steu1edwdas001common" = {
st_name_site_region = "eu1"
st_name_application = "edw"
st_name_role = "das"
st_name_seqnr = "001"
st_name_purpose = "commfs"
...
st_kind = "StorageV2"
st_tier = "Premium"
...
st_blob_contributor_role_aadgroups = [
{ display_name = "LG_GLB_AzureLZSolutionLeadersAdmin", role = "Storage Blob Data Contributor" }
]
...
}
}
在模板中我有这个代码
module "st_create" {
for_each = var.resources_st
source = "../../_modules/general/st_create"
st_name_site_region = each.value["st_name_site_region"]
st_name_application = each.value["st_name_application"]
st_name_role = each.value["st_name_role"]
st_name_seqnr = each.value["st_name_seqnr"]
st_name_purpose = each.value["st_name_purpose"]
...
st_blob_contributor_role_aadgroups = each.value["st_blob_contributor_role_aadgroups"]
...
}
这很好用,但现在我想创建角色并分配广告组,所以在我的伪逻辑中,我看到以下步骤
所以我要添加
locals {
st_blob_contributor_role_aadgroups = flatten([
for st_key, st in var.resources_st : [
for rbac_key, rbac in st.st_blob_contributor_role_aadgroups : {
st_key = st_key
rbac_key = rbac_key
role_display_name = rbac.display_name
role_role = rbac.role
}
]
])
}
但我不知道如何继续。 我可以做第二个模块并循环扁平结构,但是我会在这个结构中获得存储帐户的 ID ...
恐怕我正在混合这个,但找不到代表我的想法的样本....
答案 0 :(得分:0)
for_each
的两个主要要求是:
您在 locals.st_blob_contributor_roleaadgroups
中的列表似乎满足这些要求,因此它适合用作 for_each
的基础,但需要进行一些额外的转换才能将其转换为具有唯一性的地图每个元素的字符串是键:
module "example" {
source = "../../_modules/example"
for_each = {
for obj in locals.st_blob_contributor_roleaadgroups : "${obj.st_key}:${obj.rbac_key}" => obj
}
# ...
}
在这个 module
块中,您可以使用 each.value
来引用当前对象,例如 each.value.display_name
来获取显示名称。模块的每个实例都将由 st_key
和 rbac_key
属性的串联标识,这些属性必须是唯一的,因为它们最初取自两个不同映射的键。