我正在尝试使用 Terraform 在 AD 中创建 Azure 应用程序。
resource "azuread_application" "my_ad_app" {
display_name = "my_app"
#API Permissions
required_resource_access {
resource_app_id = "0000000-000000000000" # Microsoft Graph
resource_access {
id = "df021288-bdef-9214" # User.Read.All
type = "Role"
}
resource_access {
id = "18a4783c662c884" # User.Read.All
type = "Role"
}
resource_access {
id = "9a5d68c3a30" # Application.Read.All
type = "Role"
}
我将创建更多 Azure AD 应用程序,并分配相同的 API 权限。将分配许多 API 权限,它们对于我将创建的所有 Azure AD 应用程序都是相同的。由于我将为其创建的所有 Azure AD 应用程序的 API 权限都是相同的,因此我想将整个
required_resource_access
分配为变量。
类似这样的事情。
#API Permissions
required_resource_access {
resource_app_id = "00000003-0000-0000-c000-000000000000" # Microsoft Graph
resource_access {
assign the entire part as a variable here? Example: var.ms_graph_api_permission
}
我尝试将以下内容添加为变量,但似乎不起作用。
variable "ms_graph_api_permission" {
type = list(string)
default =
resource_access {
id = "df021288f22de89214"
type = "Role"
}
resource_access {
id = "18a4783e5662c884"
type = "Role"
}
resource_access {
id = "9a5d68ac3a30"
type = "Role"
}
}"
这似乎不起作用。知道如何自动化吗?
我尝试使用当地人。
locals {
resource_access = [
{
id = "df021288-bdde89214" # User.Read.All
type = "Role"
},
{
id = "18a4783c-85e5662c884" # User.Read.All
type = "Role"
}
]
}
resource "azuread_application" "my_ad_app" {
display_name = "my_app"
#API Permissions
required_resource_access {
for_each = {
for index, az_app_id in local.resource_access:
az_app_id.id => az_app_id
}
resource_app_id = "000000000000" # Microsoft Graph
resource_access = How should I pass values here using locals??
从这里开始需要注意的一件重要事情是,像
resource_access
这样的嵌套块不是可以直接传入变量的纯数据:它们是提供者在其模式中声明的静态配置构造。因此,您不能“仅仅”通过变量传递一整套块,但是您可以传递一些用于填充这些块的数据,并要求 Terraform 语言根据您的需要动态生成resource_access
块就该数据而言。本答案的其余部分是如何做到这一点的示例。
首先,变量声明:
variable "ms_graph_api_permission" {
type = list(object({
id = string
type = string
}))
}
这声明
var.ms_graph_api_permission
是一个对象列表,其中每个对象必须有两个属性 - id
和 type
- 都是字符串。这似乎与您想要通过 resource_access
块提供的数据的形状相匹配。
该类型的值看起来就像您尝试使用本地值一样:
[
{
id = "df021288-bdde89214" # User.Read.All
type = "Role"
},
{
id = "18a4783c-85e5662c884" # User.Read.All
type = "Role"
},
]
在为此变量选择值时,您可以使用上面这样的表达式作为变量的默认值,也可以在调用模块的
module
块中使用。
在资源块本身内部,您需要要求 Terraform 使用
resource_access
块:为该列表的每个元素生成一个
dynamic
块。
resource "azuread_application" "my_ad_app" {
display_name = "my_app"
#API Permissions
required_resource_access {
resource_app_id = "0000000-000000000000" # Microsoft Graph
dynamic "resource_access" {
for_each = var.ms_graph_api_permission
content {
id = resource_access.value.id
type = resource_access.value.type
}
}
}
}
dynamic "resource_access"
块指定基于某些其他集合(在本例中为resource_access
)生成零个或多个var.ms_graph_api_permission
块的规则。 content
块描述了如何生成每个块的主体,其中resource_access
是引用var.ms_graph_api_permission
当前元素的局部符号。
Terraform Core 会在将配置传递给提供者之前将其动态扩展为一系列单独的
resource_access
块,因此从提供者的角度来看,这相当于您编写了一系列静态 resource_access
块,如原始示例中所示.