首页 > 解决方案 > 基于区域在 terraform 中创建角色分配

问题描述

我在 Terraform 上寻找一种解决方案,用于创建角色分配并根据区域选择主体 id。如果我将代码运行到中国,变量应该是“local.principal_ids_cn”,如果是全局的,那么它必须是“local.principal_ids”..我确实有一个环境变量,其中地理将根据集群名称设置..所以“如果 geo = cn 使用 local.principal_ids_cn,否则使用 local.principal_ids”如何将其合并到 terraform ?

这是我的输入文件:


    "applications" : [
        {
            "principal_id" : "00000000-000000-global-000000000000", 
            "principal_id_cn" : "00000000-000000-china-000000000000",

        }
]
}

我的资源块如下所示:

locals {
# get json
role_data = jsondecode(file(var.inputfile))
principal_ids = distinct([for principal in local.role_data.applications : principal.principal_id])
principal_ids_cn = distinct([for principal_cn in local.role_data.applications : principal.principal_id_cn])
}

data "azurerm_subscription" "primary" {}

resource "azurerm_role_assignment" "custom" {
  for_each = toset(local.principal_ids)
  scope = data.azurerm_subscription.primary.id
  role_definition_name = var.custom_role
  principal_id = each.key
}

resource "azurerm_role_assignment" "builtin" {
  for_each = toset(local.principal_ids)
  scope = data.azurerm_subscription.primary.id
  role_definition_name = var.builtin_role
  principal_id = each.key
}

变量.tf:

variable "custom_role" {
  type = string
  description = "custom role"
  default = "READER"
}

variable "builtin_role" {
  type = string
  description = "builtin role"
  default = "My_built_in_role"
}

是否可以根据地区(中国和全球)切换局部变量?有什么建议可以解决这个问题吗?

标签: azurekubernetesterraform

解决方案


您可以在 Terraform 中使用条件表达式来实现“如果 geo = cn 使用 local.principal_ids_cn,否则使用 local.principal_ids”的逻辑

资源块的 Terraform 代码:

locals {
# get json
  role_data = jsondecode(file(var.inputfile))
  principal_ids = distinct([for principal in local.role_data.applications : principal.principal_id])
  principal_ids_cn = distinct([for principal_cn in local.role_data.applications : principal.principal_id_cn])
  principal = (var.geo == "cn" ? local.principal_ids_cn : local.principal_ids)
}

data "azurerm_subscription" "primary" {}

resource "azurerm_role_assignment" "custom" {
  for_each = toset(local.principal_ids)
  scope = data.azurerm_subscription.primary.id
  role_definition_name = var.custom_role
  principal_id = each.key
}

resource "azurerm_role_assignment" "builtin" {
  for_each = toset(local.principal_ids)
  scope = data.azurerm_subscription.primary.id
  role_definition_name = var.builtin_role
  principal_id = each.key
}

https://www.terraform.io/docs/language/expressions/conditionals.html


推荐阅读