【问题标题】:Creating Azure role assignments over a map of object_ids and roles通过 object_ids 和角色的映射创建 Azure 角色分配
【发布时间】:2023-01-13 18:48:47
【问题描述】:

我正在尝试创建一个 Terraform 部署,它将通过遍历 principal_object_ids 列表及其分配的角色来执行 azurerm_role_assignment。我的代码大致是:

定义 principal_ids 和要分配的角色:

locals {
   subscription_access_list_by_id = {
      "SPID########1" : "reader" ,
      "SPID########1" : "storage blob data reader",
      "SPID########2" : "owner",
      "SPID########2" : "storage blob data owner"
   }
}

分配角色的模块:

resource "azurerm_role_assignment" "role" {
  scope                = var.subscription_id
  role_definition_name = var.role_definition_name
  principal_id         = var.object_id
}

包含以下块的 main.tf:

module "access-control" {
  for_each             = local.subscription_access_list
  source               = "modules/access-control"
  principal_id.        = each.key
  subscription_id      = var.subscription_id
  role_definition_name = each.value
}

我实际上最终看到的是,给定服务主体的最后一个条目是唯一被执行的条目。即,在上面的示例中,SPID#######1 将获得“存储 blob 数据读取器”,但不是“读取器”,而 SPID######2 将获得“存储 blob 数据所有者”,但不是“所有者”。

我假设发生了一些事情,它只为每个键创建一个块,所以最新的值会覆盖它,但我不确定如何在不更复杂地实现我的 subscription_access_list_by_id 映射的情况下解决这个问题。

我试过使用 {for k, v in subscription_access_list_by_id : k => v } 作为一种无济于事的方法。

【问题讨论】:

  • 您有重复的密钥,因此您需要重组。请注意,没有一种语言允许映射、哈希、字典、链表等中的重复键,因此这里没有解决方法。

标签: terraform terraform-provider-azure


【解决方案1】:

我在我的环境中尝试并得到以下结果:

Variables.tf

variable "principal_ids" {

description = "The ID of the principal that is to be assigned the role at the given scope. Can be User, Group or SPN."
type = list(string)
default = ["cbd2d6bc-0d6e-4f13-bf7e-60207d82e674" ,"e396b90e-2309-490b-984f-7a8bab4eb625"]
}

Main.tf

locals {
principal_ids = toset(var.principal_ids)
}

resource "azurerm_role_assignment" "custom" {
for_each = local.principal_ids
scope = data.azurerm_subscription.primary.id
role_definition_name = "Reader"
principal_id = each.key
}

resource "azurerm_role_assignment" "contrib" {
for_each = local.principal_ids
scope = data.azurerm_subscription.primary.id
role_definition_name = "storage blob data reader"
principal_id = each.key
}

使用上面的代码,我可以将 reader 和 storage-blob-data-reader 等角色分配添加到服务主体 ID。

安慰:

门户网站:

角色定义名称不应为list。如果您需要添加分配另一个用户,您可以创建单独的变量并分配给他们。

参考:azure - Create Role assignment dynamically in Terraform from input - Stack Overflow

【讨论】:

    猜你喜欢
    • 2023-01-21
    • 1970-01-01
    • 2020-10-18
    • 2018-05-10
    • 2020-03-07
    • 2021-06-24
    • 2021-05-25
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多