如何通过Azure Bicep一键部署到租户/管理组下所有订阅?
可行方案:单阶段Bicep部署实现跨订阅ASC策略豁免
可以通过管理组/租户级嵌套部署+Azure资源图查询+部署脚本实现单阶段部署,无需提前手动生成订阅列表。核心思路是在部署过程中动态查询目标范围内的所有订阅,再循环对每个订阅执行策略豁免操作。
实现步骤与代码示例
1. 根模板(管理组/租户级别)
该模板负责查询订阅列表,并触发每个订阅的豁免部署:
targetScope = 'managementGroup' // 需部署到管理组,若要覆盖整个租户,改为'tenant' param targetManagementGroupId string = '你的管理组ID' // 租户级别部署可删除此参数 // 部署脚本:通过资源图查询订阅ID列表 resource getSubscriptions 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: 'FetchSubscriptions' location: 'eastus' kind: 'AzureCLI' properties: { azCliVersion: '2.50.0' scriptContent: ''' # 构造查询语句,管理组级别添加过滤条件 QUERY="ResourceContainers | where type == 'microsoft.resources/subscriptions'" if [ -n "${targetManagementGroupId}" ]; then QUERY="$QUERY and managementGroupId == '${targetManagementGroupId}'" fi QUERY="$QUERY | project id" # 执行查询并输出JSON格式结果 az graph query -q "$QUERY" --output json ''' timeout: 'PT10M' cleanupPreference: 'Always' } } // 解析查询结果为订阅ID数组 output subscriptionIds array = json(getSubscriptions.properties.outputs).data // 循环部署订阅级豁免模板 module ascExemption './asc-exemption.bicep' = [for subId in subscriptionIds: { name: "ASC-Exemption-${subId}" scope: subscription(subId) }]
2. 订阅级豁免模板
该模板负责针对单个订阅找到"ASC Default"计划并添加指定策略豁免:
targetScope = 'subscription' // 引用已存在的ASC Default策略分配 resource ascDefaultPolicyAssignment 'Microsoft.Authorization/policyAssignments@2022-06-01' existing = { name: 'ASC Default' } // 创建策略豁免 resource ascPolicyExemption 'Microsoft.Authorization/policyExemptions@2022-06-01' = { name: 'Exempt-Non-Applicable-ASC-Policies' properties: { policyAssignmentId: ascDefaultPolicyAssignment.id exemptionCategory: 'Waiver' // 可选值:Waiver(豁免)/Mitigated(缓解) displayName: '豁免ASC Default中不适用的策略' description: '针对当前订阅业务场景,豁免部分ASC默认策略' // 替换为你需要豁免的策略引用ID(从ASC计划定义中获取) policyDefinitionReferenceIds: [ 'ASC-Policy-Reference-ID-1' 'ASC-Policy-Reference-ID-2' ] } }
关键注意事项
- 权限要求:执行部署的账户需要具备:
- 管理组/租户级别的
Microsoft.ResourceGraph/queries/run权限 - 每个目标订阅的
Microsoft.Authorization/policyExemptions/write权限
- 管理组/租户级别的
- 策略引用ID获取:可通过Azure门户查看"ASC Default"计划的策略列表,或使用CLI命令:
az policy definition show --name <ASC计划ID> --query 'policyDefinitions[*].policyDefinitionReferenceId' - 部署命令:根模板需通过管理组或租户级部署命令执行:
# 管理组级别部署 az deployment mg create --management-group-id <你的管理组ID> --template-file deploy.bicep --location eastus # 租户级别部署 az deployment tenant create --template-file deploy.bicep --location eastus
内容的提问来源于stack exchange,提问作者Grilse
相关产品推荐
相关产品推荐

