采用 Bicep 文件的订阅部署
若要简化资源管理,可在 Azure 订阅级别部署资源。 例如,可以将策略和 Azure 基于角色的访问控制 (Azure RBAC) 部署到你的订阅中,从而将它们应用于整个订阅。
本文介绍如何在 Bicep 文件中将部署范围设置为订阅。
注意
可在订阅级别部署中部署到 800 个不同的资源组。
支持的资源
并非所有资源类型都可以部署到订阅级别。 本部分列出了支持的资源类型。
对于 Azure 蓝图,请使用:
- 项目
- blueprints
- blueprintAssignments
- versions
对于 Azure 策略,请使用:
- policyAssignments
- policyDefinitions
- policySetDefinitions
- remediations
对于访问控制,请使用:
- accessReviewScheduleDefinitions
- accessReviewScheduleSettings
- roleAssignments
- roleDefinitions
- roleEligibilityScheduleRequests
- roleManagementPolicyAssignments
对于部署到资源组的嵌套模板,请使用:
- deployments
若要创建新的资源组,请使用:
- resourceGroups
若要管理订阅,请使用:
- 预算
- 配置 - 顾问
- lineOfCredit
- 锁定
- 配置文件 - 更改分析
- supportPlanTypes
- 标记
对于监视,请使用:
- diagnosticSettings
- logprofiles
对于安全性,请使用:
- advancedThreatProtectionSettings
- alertsSuppressionRules
- assessmentMetadata
- assessments
- autoProvisioningSettings
- 连接器
- deviceSecurityGroups
- ingestionSettings
- pricings
- workspaceSettings
其他支持的类型包括:
- scopeAssignments
- eventSubscriptions
- peerAsns
集作用域
若要将范围设置为订阅,请使用以下命令:
targetScope = 'subscription'
部署命令
若要部署到订阅,请使用订阅级别部署命名。
对于 Azure CLI,请使用 az deployment sub create。 以下示例会部署一个模板来创建资源组:
az deployment sub create \
--name demoSubDeployment \
--location chinaeast \
--template-file main.bicep \
--parameters rgName=demoResourceGroup rgLocation=chinaeast
有关部署命令和部署 ARM 模板的选项的更多详细信息,请参阅:
部署位置和名称
对于订阅级别部署,必须为部署提供位置。 部署位置独立于部署的资源的位置。 部署位置指定何处存储部署数据。 管理组和租户部署也需要位置。 对于资源组部署,资源组的位置用于存储部署数据。
可以为部署提供一个名称,也可以使用默认部署名称。 默认名称是模板文件的名称。 例如,部署名为“main.json”的模板会创建默认部署名称 main。
每个部署名称的位置不可变。 当某个位置中已有某个部署时,无法在另一位置创建同名的部署。 例如,如果在 chinaeast 中创建名为“deployment1”的订阅部署,则以后不能创建另一个名为“deployment1”但位置为“chinanorth”的部署。 如果出现错误代码 InvalidDeploymentLocation
,请使用其他名称或使用与该名称的以前部署相同的位置。
部署范围
部署到订阅时,可以将资源部署到:
- 操作中的目标订阅
- 租户中的任何订阅
- 该订阅或其他订阅中的资源组
- 订阅的租户
可以将扩展资源的范围设置为与部署目标不同的范围。
部署模板的用户必须有权访问指定的作用域。
订阅的范围
若要将资源部署到目标订阅,请使用关键字 resource
添加这些资源。
targetScope = 'subscription'
// resource group created in target subscription
resource exampleResource 'Microsoft.Resources/resourceGroups@2022-09-01' = {
...
}
有关部署到订阅的示例,请参阅使用 Bicep 创建资源组和分配策略定义。
若要将资源部署到与操作中的订阅不同的订阅,请添加一个模块。 使用 subscription 函数设置 scope
属性。 将 subscriptionId
属性设置为要部署到的订阅的 ID。
targetScope = 'subscription'
param otherSubscriptionID string
// module deployed at subscription level but in a different subscription
module exampleModule 'module.bicep' = {
name: 'deployToDifferentSub'
scope: subscription(otherSubscriptionID)
}
将范围限定于资源组
若要将资源部署到订阅中的资源组,请添加一个模块并设置其 scope
属性。 如果资源组已存在,请使用 resourceGroup 函数设置范围值。 提供资源组名称。
targetScope = 'subscription'
param resourceGroupName string
module exampleModule 'module.bicep' = {
name: 'exampleModule'
scope: resourceGroup(resourceGroupName)
}
如果资源组是在同一 Bicep 文件中创建的,请使用资源组的符号名称设置范围值。 有关将范围设置为符号名称的示例,请参阅使用 Bicep 创建资源组。
将范围设定为租户
要在租户中创建资源,请添加一个模块。 使用 tenant 函数设置其 scope
属性。
部署模板的用户必须具有在租户中进行部署所需的访问权限。
下面的示例包括一个部署到租户的模块。
targetScope = 'subscription'
// module deployed at tenant level
module exampleModule 'module.bicep' = {
name: 'deployToTenant'
scope: tenant()
}
可将范围限定为某些资源类型的 tenant()
,而不是使用模块。 下面的示例在租户中部署管理组。
targetScope = 'subscription'
param mgName string = 'mg-${uniqueString(newGuid())}'
// management group created at tenant
resource managementGroup 'Microsoft.Management/managementGroups@2021-04-01' = {
scope: tenant()
name: mgName
properties: {}
}
output output string = mgName
有关详细信息,请参阅管理组。
资源组
有关创建资源组的信息,请参阅使用 Bicep 创建资源组。
Azure Policy
分配策略定义
以下示例将现有的策略定义分配到订阅。 如果策略定义使用参数,请将参数作为对象提供。 如果策略定义不使用参数,请使用默认的空对象。
targetScope = 'subscription'
param policyDefinitionID string
param policyName string
param policyParameters object = {}
resource policyAssign 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
name: policyName
properties: {
policyDefinitionId: policyDefinitionID
parameters: policyParameters
}
}
创建和分配策略定义
可以在同一 Bicep 文件中定义和分配策略定义。
targetScope = 'subscription'
resource locationPolicy 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
name: 'locationpolicy'
properties: {
policyType: 'Custom'
parameters: {}
policyRule: {
if: {
field: 'location'
equals: 'chinaeast2'
}
then: {
effect: 'deny'
}
}
}
}
resource locationRestrict 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
name: 'allowedLocation'
properties: {
policyDefinitionId: locationPolicy.id
}
}
访问控制
若要了解如何分配角色,请参阅使用 Azure 资源管理器模板添加 Azure 角色分配。
以下示例创建一个资源组,对其应用锁定,并为主体分配一个角色。
targetScope = 'subscription'
@description('Name of the resourceGroup to create')
param resourceGroupName string
@description('Location for the resourceGroup')
param resourceGroupLocation string
@description('principalId of the user that will be given contributor access to the resourceGroup')
param principalId string
@description('roleDefinition to apply to the resourceGroup - default is contributor')
param roleDefinitionId string = 'b24988ac-6180-42a0-ab88-20f7382dd24c'
@description('Unique name for the roleAssignment in the format of a guid')
param roleAssignmentName string = guid(principalId, roleDefinitionId, resourceGroupName)
var roleID = '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/${roleDefinitionId}'
resource newResourceGroup 'Microsoft.Resources/resourceGroups@2022-09-01' = {
name: resourceGroupName
location: resourceGroupLocation
properties: {}
}
module applyLock 'lock.bicep' = {
name: 'applyLock'
scope: newResourceGroup
}
module assignRole 'role.bicep' = {
name: 'assignRBACRole'
scope: newResourceGroup
params: {
principalId: principalId
roleNameGuid: roleAssignmentName
roleDefinitionId: roleID
}
}
以下示例显示了要应用锁的模块:
resource createRgLock 'Microsoft.Authorization/locks@2020-05-01' = {
name: 'rgLock'
properties: {
level: 'CanNotDelete'
notes: 'Resource group should not be deleted.'
}
}
以下示例显示了要分配角色的模块:
@description('The principal to assign the role to')
param principalId string
@description('A GUID used to identify the role assignment')
param roleNameGuid string = newGuid()
param roleDefinitionId string
resource roleNameGuid_resource 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: roleNameGuid
properties: {
roleDefinitionId: roleDefinitionId
principalId: principalId
}
}
后续步骤
若要了解其他范围,请参阅: