Terraform 嵌套 for_each
Terraform nested for_each
我对 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"]
...
}
这工作正常,但现在我想创建角色并分配 aad 组,所以在我的伪逻辑中我看到以下步骤
所以我要添加
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 ...
恐怕我正在混合这个但找不到代表我的想法的样本....
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
属性的串联来标识,这些属性必须是唯一的,因为它们最初是从两个不同映射的键中获取的。
我对 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"]
...
}
这工作正常,但现在我想创建角色并分配 aad 组,所以在我的伪逻辑中我看到以下步骤
所以我要添加
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 ...
恐怕我正在混合这个但找不到代表我的想法的样本....
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
属性的串联来标识,这些属性必须是唯一的,因为它们最初是从两个不同映射的键中获取的。