使用 Bicep 文件的租户部署

随着组织的成熟,你可能需要在 Azure AD 租户中定义和分配策略Azure 基于角色的访问控制 (Azure RBAC)。 通过租户级模板,可以声明的方式在全局级别应用策略和分配角色。

支持的资源

并非所有资源类型都可以部署到租户级别。 本部分列出了支持的资源类型。

对于 Azure 基于角色的访问控制 (Azure RBAC),请使用:

  • roleAssignments

对于部署到管理组、订阅或资源组的嵌套模板,请使用:

  • deployments

对于创建管理组,请使用:

  • managementGroups

若要创建订阅,请使用:

  • aliases

对于管理成本,请使用:

  • billingProfiles
  • billingRoleAssignments
  • 说明
  • invoiceSections
  • 策略

若要配置门户,请使用:

  • tenantConfigurations

内置策略定义是租户级别的资源,但你无法在租户中部署自定义策略定义。 有关为资源分配内置策略定义的示例,请参阅 tenantResourceId 示例

集作用域

若要将范围设置为租户,请使用:

targetScope = 'tenant'

所需访问权限

部署模板的主体必须具有在租户范围中创建资源的权限。 该主体必须有权执行部署操作 (Microsoft.Resources/deployments/*) 和创建模板中定义的资源。 例如,若要创建管理组,主体必须在租户范围内具有参与者权限。 若要创建角色分配,主体则必须具有所有者权限。

Microsoft Entra ID 的全局管理员不会自动拥有分配角色的权限。 若要在租户范围内实现模板部署,全局管理员必须执行以下步骤:

  1. 提升帐户访问权限,使其自身可分配角色。 有关详细信息,请参阅提升访问权限以管理所有 Azure 订阅和管理组

  2. 向需要部署模板的主体分配所有者或参与者角色。

    New-AzRoleAssignment -SignInName "[userId]" -Scope "/" -RoleDefinitionName "Owner"
    
    az role assignment create --assignee "[userId]" --scope "/" --role "Owner"
    

主体现已具有部署模板所需的权限。

部署命令

用于租户部署的命令与资源组部署使用的命令不同。

对于 Azure CLI,请使用 az deployment tenant create

az deployment tenant create \
  --name demoTenantDeployment \
  --location ChinaNorth2 \
  --template-file main.bicep

有关部署命令和部署 ARM 模板的选项的更多详细信息,请参阅:

部署位置和名称

对于租户级别的部署,必须提供部署位置。 部署位置独立于部署的资源的位置。 部署位置指定何处存储部署数据。 订阅管理组部署也需要位置。 对于资源组部署,资源组的位置用于存储部署数据。

可以为部署提供一个名称,也可以使用默认部署名称。 默认名称是模板文件的名称。 例如,部署一个名为 main.bicep 的文件会创建默认部署名称 main。

每个部署名称的位置不可变。 当某个位置中已有某个部署时,无法在另一位置创建同名的部署。 例如,如果在 chinaeast 中创建名为“deployment1”的租户部署,则以后不能创建另一个名为“deployment1”但位置为“chinanorth”的部署。 如果出现错误代码 InvalidDeploymentLocation,请使用其他名称或使用与该名称的以前部署相同的位置。

部署范围

部署到租户时,可以将资源部署到:

  • 租户
  • 租户中的管理组
  • subscriptions
  • 资源组

可以将扩展资源的范围设置为与部署目标不同的范围。

部署模板的用户必须有权访问指定的作用域。

本部分演示如何指定不同范围。 可以在单个模板中组合这些不同范围。

将范围设定为租户

在 Bicep 文件中定义的资源将应用于租户。

targetScope = 'tenant'

// create resource at tenant
resource mgName_resource 'Microsoft.Management/managementGroups@2021-04-01' = {
  ...
}

将范围设定为管理组

若要以租户中的管理组为目标,请添加模块。 使用 managementGroup 函数设置其 scope 属性。 提供管理组名称。

targetScope = 'tenant'

param managementGroupName string

// create resources at management group level
module  'module.bicep' = {
  name: 'deployToMG'
  scope: managementGroup(managementGroupName)
}

订阅的范围

若要以租户中的订阅为目标,请添加一个模块。 使用 subscription 函数设置其 scope 属性。 提供订阅 ID。

targetScope = 'tenant'

param subscriptionID string

// create resources at subscription level
module  'module.bicep' = {
  name: 'deployToSub'
  scope: subscription(subscriptionID)
}

将范围限定于资源组

若要以租户内的资源组为目标,请添加一个模块。 使用 resourceGroup 函数设置其 scope 属性。 提供订阅 ID 和资源组名称。

targetScope = 'tenant'

param resourceGroupName string
param subscriptionID string

// create resources at resource group level
module  'module.bicep' = {
  name: 'deployToRG'
  scope: resourceGroup(subscriptionID, resourceGroupName)
}

创建管理组

以下模板用于创建管理组。

targetScope = 'tenant'
param mgName string = 'mg-${uniqueString(newGuid())}'

resource mgName_resource 'Microsoft.Management/managementGroups@2021-04-01' = {
  name: mgName
  properties: {}
}

如果帐户没有部署到租户的权限,仍然可以通过部署到另一个范围来创建管理组。 有关详细信息,请参阅管理组

分配角色

以下模板用于在租户范围内分配角色。

targetScope = 'tenant'

@description('principalId of the user that will be given contributor access to the resourceGroup')
param principalId string

@description('roleDefinition for the assignment - default is owner')
param roleDefinitionId string = '8e3af657-a8ff-443c-a75c-2fe8c4bcb635'

var roleAssignmentName = guid(principalId, roleDefinitionId)

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: roleAssignmentName
  properties: {
    roleDefinitionId: tenantResourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
    principalId: principalId
  }
}

后续步骤

若要了解其他范围,请参阅: