首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform for-每个都有对象地图和列表

Terraform for-每个都有对象地图和列表
EN

Stack Overflow用户
提问于 2022-08-16 17:37:07
回答 1查看 767关注 0票数 1

我需要实现嵌套的for -每个循环,以定义服务帐户map(object),计划创建什么,以及visibility将访问存储在RBAC的Azure密钥库中的一个包含其密码的秘密。

我检查了多篇文章,并试图应用它们,但是没有成功。这里的问题是,当每个principal_id都已经就位时,如何访问单个的

可变定义:

代码语言:javascript
复制
variable "user_collection" {
  type = map(object({
      name       = string,
      role       = string,
      namespace  = string,
      warehouse  = string,
      ## What user (ObjectID within AAD should have access to generated password)
      visibility = list(string)
    }))
}

在这里,我试图为两个人提供对用户密码的访问:

代码语言:javascript
复制
module "SVC_USERS" {
  source              = "./user-module"
  user_collection   = {
    user_1 = {
    name       = "TEST_SVC_1"
    namespace  = "ADMINISTRATION"
    role       = "PUBLIC"
    warehouse  = "ADMIN_WH"
    visibility = ["b9ad7db3-ea64-4815-aad5-a5a72b5bbee9", "d634ebdf-6928-427c-9678-fc3bad8eccc4"] 
  }
 }
}

设置基于角色的对创建的秘密的访问

代码语言:javascript
复制
# Provide access to see generated passwords for key users
resource "azurerm_role_assignment" "secret_access_provision" {
  for_each             = var.user_collection
  scope                = "${module.variables.keyVault-id}/secrets/${replace(each.value["name"] , "_", "-")}"
  role_definition_name = "Key Vault Secrets User"
  principal_id = each.value.visibility
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-16 19:26:55

如果我对您的理解是正确的,我相信您需要使用每个可见id来压扁用户对象的产品。我相信你可以这样做。

注意:我已经将user_collection的缩写版本显示为本地版本,但您可以用var替换local.user_collection

代码语言:javascript
复制
locals {
  user_collection = {
    user_1 = {
      name       = "TEST_SVC_1"
      visibility = ["b9ad7db3-ea64-4815-aad5-a5a72b5bbee9", "d634ebdf-6928-427c-9678-fc3bad8eccc4"]
    }
  }

  user_vis = flatten([
    for user, cfg in local.user_collection : [
      for id in cfg.visibility : {
        user = user
        cfg  = cfg
        id   = id
      }
    ]
  ])
}

然后你可以做这样的事情:

代码语言:javascript
复制
resource "azurerm_role_assignment" "secret_access_provision" {
  for_each = { for uv in local.user_vis : "${uv.user}-${uv.id}" => uv }

  scope                = "${module.variables.keyVault-id}/secrets/${replace(each.value.cfg.name, "_", "-")}"
  role_definition_name = "Key Vault Secrets User"
  principal_id         = each.value.id
}

在这里,每个用户/可见性组合将获得一个azurerm_role_assignment

由于我无法获得测试结果以进行澄清,所以我创建了这个输出以进行说明。

代码语言:javascript
复制
output "user_vis" {
  value = { for uv in local.user_vis : "${uv.user}-${uv.id}" => uv }
}

这意味着:

代码语言:javascript
复制
Changes to Outputs:
  + user_vis = {
      + user_1-b9ad7db3-ea64-4815-aad5-a5a72b5bbee9 = {
          + cfg  = {
              + name       = "TEST_SVC_1"
              + visibility = [
                  + "b9ad7db3-ea64-4815-aad5-a5a72b5bbee9",
                  + "d634ebdf-6928-427c-9678-fc3bad8eccc4",
                ]
            }
          + id   = "b9ad7db3-ea64-4815-aad5-a5a72b5bbee9"
          + user = "user_1"
        }
      + user_1-d634ebdf-6928-427c-9678-fc3bad8eccc4 = {
          + cfg  = {
              + name       = "TEST_SVC_1"
              + visibility = [
                  + "b9ad7db3-ea64-4815-aad5-a5a72b5bbee9",
                  + "d634ebdf-6928-427c-9678-fc3bad8eccc4",
                ]
            }
          + id   = "d634ebdf-6928-427c-9678-fc3bad8eccc4"
          + user = "user_1"
        }
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73378090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档