使用 Bicep 文件进行管理组部署
本文介绍如何在部署到管理组时使用 Bicep 来设置范围。
随着组织的不断发展,可以部署 Bicep 文件来创建管理组级别的资源。 例如,你可能需要为管理组定义和分配策略或 Azure 基于角色的访问控制 (Azure RBAC)。 使用管理组级别的模板,可以声明方式在管理组级别应用策略和分配角色。
支持的资源
并非所有资源类型都可以部署到管理组级别。 本部分列出了支持的资源类型。
对于 Azure 蓝图,请使用:
- 项目
- blueprints
- blueprintAssignments
- versions
对于 Azure Policy,请使用:
- policyAssignments
- policyDefinitions
- policySetDefinitions
- remediations
对于访问控制,请使用:
- privateLinkAssociations
- roleAssignments
- roleAssignmentScheduleRequests
- roleDefinitions
- roleEligibilityScheduleRequests
- roleManagementPolicyAssignments
对于部署到订阅或资源组的嵌套模板,请使用:
- deployments
若要管理资源,请使用:
- diagnosticSettings
- tags
管理组是租户级资源。 但你可以将新管理组的范围设置为租户,从而在管理组部署中创建管理组。 请参阅管理组。
集作用域
若要将范围设置为管理组,请使用:
targetScope = 'managementGroup'
部署命令
若要部署到管理组,请使用管理组部署命令。
对于 Azure CLI,请使用 az deployment mg create:
az deployment mg create \
--name demoMGDeployment \
--location ChinaNorth \
--management-group-id myMG \
--template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/management-level-deployment/azuredeploy.json"
有关部署命令和部署 ARM 模板的选项的更多详细信息,请参阅:
部署位置和名称
对于管理组级别部署,必须为部署提供位置。 部署位置独立于部署的资源的位置。 部署位置指定何处存储部署数据。 订阅和租户部署也需要位置。 对于资源组部署,资源组的位置用于存储部署数据。
可以为部署提供一个名称,也可以使用默认部署名称。 默认名称是模板文件的名称。 例如,部署名为“main.bicep”的模板会创建默认部署名称 main。
每个部署名称的位置不可变。 当某个位置中已有某个部署时,无法在另一位置创建同名的部署。 例如,如果在 chinaeast 中创建名为“deployment1”的管理组部署,则以后不能创建另一个名为“deployment1”但位置为“chinanorth”的部署。 如果出现错误代码 InvalidDeploymentLocation
,请使用其他名称或使用与该名称的以前部署相同的位置。
部署范围
部署到管理组时,可以将资源部署到:
- 操作的目标管理组
- 租户中的另一个管理组
- 管理组中的订阅
- 管理组中的资源组
- 资源组的租户
可以将扩展资源的范围设置为与部署目标不同的范围。
部署模板的用户必须有权访问指定的作用域。
将范围设定为管理组
若要将资源部署到目标管理组,请添加那些具有关键字 resource
的资源。
targetScope = 'managementGroup'
// policy definition created in the management group
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2023-04-01' = {
...
}
若要以另一个管理组为目标,请添加模块。 使用 managementGroup 函数设置 scope
属性。 提供管理组名称。
targetScope = 'managementGroup'
param otherManagementGroupName string
// module deployed at management group level but in a different management group
module exampleModule 'module.bicep' = {
name: 'deployToDifferentMG'
scope: managementGroup(otherManagementGroupName)
}
订阅的范围
还可以将管理组中的订阅作为目标。 部署模板的用户必须有权访问指定的作用域。
若要以管理组中的订阅为目标,请添加模块。 使用 subscription 函数设置 scope
属性。 提供订阅 ID。
targetScope = 'managementGroup'
param subscriptionID string
// module deployed to subscription in the management group
module exampleModule 'module.bicep' = {
name: 'deployToSub'
scope: subscription(subscriptionID)
}
将范围限定于资源组
还可以将管理组中的资源组作为目标。 部署模板的用户必须有权访问指定的作用域。
若要以管理组中的资源组为目标,请添加模块。 使用 resourceGroup 函数设置 scope
属性。 提供订阅 ID 和资源组名称。
targetScope = 'managementGroup'
param subscriptionID string
param resourceGroupName string
// module deployed to resource group in the management group
module exampleModule 'module.bicep' = {
name: 'deployToRG'
scope: resourceGroup(subscriptionID, resourceGroupName)
}
将范围设定为租户
要在租户中创建资源,请添加一个模块。 使用 tenant 函数设置其 scope
属性。 部署模板的用户必须具有在租户中进行部署所需的访问权限。
targetScope = 'managementGroup'
// module deployed at tenant level
module exampleModule 'module.bicep' = {
name: 'deployToTenant'
scope: tenant()
}
或者,可将某些资源类型(如管理组)的范围设置为 /
。 下一部分将介绍如何创建新的管理组。
管理组
若要在管理组部署中创建管理组,则必须将管理组的范围设置为租户。
下面的示例在根管理组中创建了一个新的管理组。
targetScope = 'managementGroup'
param mgName string = 'mg-${uniqueString(newGuid())}'
resource newMG 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: mgName
properties: {}
}
output newManagementGroup string = mgName
下一个示例将在部署的目标管理组中创建一个新的管理组。 下一个示例使用管理组函数。
targetScope = 'managementGroup'
param mgName string = 'mg-${uniqueString(newGuid())}'
resource newMG 'Microsoft.Management/managementGroups@2023-04-01' = {
scope: tenant()
name: mgName
properties: {
details: {
parent: {
id: managementGroup().id
}
}
}
}
output newManagementGroup string = mgName
订阅
若要部署一个会将现有 Azure 订阅移至新管理组的模板,请参阅在 ARM 模板中移动订阅
Azure Policy
部署到管理组的自定义策略定义是管理组的扩展。 若要获取自定义策略定义的 ID,请使用 extensionResourceId() 函数。 内置策略定义是租户级别资源。 若要获取内置策略定义的 ID,请使用 tenantResourceId 函数。
下面的示例演示如何在管理组级别定义策略,以及如何分配它。
targetScope = 'managementGroup'
@description('An array of the allowed locations, all other locations will be denied by the created policy.')
param allowedLocations array = [
'chinaeast2'
'chinaeast'
'chinanorth'
]
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2023-04-01' = {
name: 'locationRestriction'
properties: {
policyType: 'Custom'
mode: 'All'
parameters: {}
policyRule: {
if: {
not: {
field: 'location'
in: allowedLocations
}
}
then: {
effect: 'deny'
}
}
}
}
resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-04-01' = {
name: 'locationAssignment'
properties: {
policyDefinitionId: policyDefinition.id
}
}
后续步骤
若要了解其他范围,请参阅: