我正在尝试使用 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
该数据动态生成块。本答案的其余部分是如何做到这一点的示例。一、变量声明:
这声明这
var.ms_graph_api_permission
是一个对象列表,其中每个对象必须有两个属性 -id
和type
- 都是字符串。这似乎与您想要通过块提供的数据的形状相匹配resource_access
。该类型的值类似于您尝试使用本地值的值:
当为此变量选择值时,您可以使用上面这样的表达式作为变量的默认值,也可以在
module
调用模块的块中使用。在资源块本身内部,您需要要求 Terraform 使用block
resource_access
为该列表的每个元素生成一个块:dynamic
块指定基于某些其他集合(在本例中为 )
dynamic "resource_access"
生成零个或多个块的规则。该块描述了如何生成每个块的主体,其中是引用 的当前元素的局部符号。resource_access
var.ms_graph_api_permission
content
resource_access
var.ms_graph_api_permission
在将配置传递给提供者之前,Terraform Core 会动态地将其扩展为一系列单独的块,因此从提供者的角度来看,这相当于您在原始示例中
resource_access
写出了一系列静态块。resource_access