【问题标题】:Terraform nested for_eachTerraform 嵌套 for_each
【发布时间】:2021-08-02 00:50:38
【问题描述】:

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

恐怕我正在混合它,但找不到代表我所想的样本......

【问题讨论】:

    标签: terraform terraform-provider-azure


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 2021-07-21
      • 2021-10-06
      • 2021-10-18
      • 2021-07-09
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多