Terraform 嵌套 for_each

时间:2021-05-11 16:01:18

标签: terraform terraform-provider-azure

我对 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 ...

恐怕我正在混合这个,但找不到代表我的想法的样本....

1 个答案:

答案 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_keyrbac_key 属性的串联标识,这些属性必须是唯一的,因为它们最初取自两个不同映射的键。