练习 - 将资源部署到管理组
Project Teddybear 已成功完成,玩具公司的机密研发团队现准备好研发更多新玩具。 团队几乎每天都会请求你提供新订阅,并且需要对所有这些订阅应用策略。
你决定将所有团队的订阅放在一个管理组中,而不是复制每个订阅中的策略定义和分配。 然后,你可以将策略应用于整个管理组,而不是单独应用于每个订阅。
在此练习中,你将创建一个新的 Bicep 模板,用于将策略定义和分配应用到管理组。
在此过程中,你将:
- 创建新的管理组。
- 创建新的管理组范围 Bicep 文件。
- 将 Azure Policy 资源添加到文件。
- 通过手动构建资源 ID,将策略分配链接到策略定义。
- 部署模板并验证结果。
本练习需要满足以下前提条件:
- 必须在 Azure 租户上启用管理组。
- 需要在层次结构中创建新管理组的权限。
- 需要将 Azure Policy 资源部署到管理组的权限。
如果你当前的 Azure 帐户无法满足这些要求,可以获取免费试用版并创建新的 Azure 订阅和租户。 或者,你也可以跳过此练习中的部署步骤。
创建管理组
在此练习中,你将创建一个新的管理组,以便不会意外影响 Azure 环境中其他部分的任何资源。
在 Visual Studio Code 终端中,运行以下 Azure CLI 命令:
az account management-group create \
--name SecretRND \
--display-name "Secret R&D Projects"
默认情况下,新的管理组创建为租户根管理组的直接子组。 如果需要将管理组置于现有管理组层次结构中的特定位置,请使用 --parent-id
参数,并指定要用作父级的管理组的名称。
在 Visual Studio Code 终端中,运行以下 Azure PowerShell 命令:
New-AzManagementGroup `
-GroupId 'SecretRND' `
-DisplayName 'Secret R&D Projects'
默认情况下,新管理组创建为租户根管理组的子组。 如果需要将管理组置于现有管理组层次结构中的特定位置,请使用 -ParentId
参数,并指定要用作父级的管理组的名称。
在实际部署中,你需要将研发团队的订阅移动到管理组中。 对于本练习,你将部署这些策略,即使管理组不包含任何订阅。 无论管理组为空还是包含订阅,相同的部署流程均适用。
创建部署到管理组的 Bicep 文件
打开 Visual Studio Code。
删除 main.bicep 文件,然后新建一个同名的空文件。
保存空文件。
将以下内容添加到该文件。
targetScope = 'managementGroup'
请注意,此代码行告诉 Bicep,模板将部署在管理组范围。
添加策略定义
如前文所述,在 Bicep 文件中创建策略定义。
在刚刚添加的代码行下,添加以下变量定义:
var policyDefinitionName = 'DenyFandGSeriesVMs'
在文件底部,添加下列 Azure Policy 定义:
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = { name: policyDefinitionName properties: { policyType: 'Custom' mode: 'All' parameters: {} policyRule: { if: { allOf: [ { field: 'type' equals: 'Microsoft.Compute/virtualMachines' } { anyOf: [ { field: 'Microsoft.Compute/virtualMachines/sku.name' like: 'Standard_F*' } { field: 'Microsoft.Compute/virtualMachines/sku.name' like: 'Standard_G*' } ] } ] } then: { effect: 'deny' } } } }
策略定义与之前应用于订阅的策略定义相同。 不过,这次是将其部署到管理组。
添加策略分配
你现在要将策略应用到管理组。 这意味着策略将应用于此管理组子级的所有订阅。
在
policyDefinitionName
变量定义下,添加以下变量:var policyAssignmentName = 'DenyFandGSeriesVMs'
在文件底部的策略定义资源下,添加以下策略分配:
resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = { name: policyAssignmentName properties: { policyDefinitionId: policyDefinition.id } }
保存对文件所做的更改。
验证模板
模板应如下所示:
targetScope = 'managementGroup'
var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
name: policyDefinitionName
properties: {
policyType: 'Custom'
mode: 'All'
parameters: {}
policyRule: {
if: {
allOf: [
{
field: 'type'
equals: 'Microsoft.Compute/virtualMachines'
}
{
anyOf: [
{
field: 'Microsoft.Compute/virtualMachines/sku.name'
like: 'Standard_F*'
}
{
field: 'Microsoft.Compute/virtualMachines/sku.name'
like: 'Standard_G*'
}
]
}
]
}
then: {
effect: 'deny'
}
}
}
}
resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
name: policyAssignmentName
properties: {
policyDefinitionId: policyDefinition.id
}
}
如果不是,请复制示例或调整模板以与该示例一致。
将模板部署到 Azure
在 Visual Studio Code 终端中,使用以下 Azure CLI 命令部署模板:
managementGroupId="SecretRND"
templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="mg-scope-"$today
az deployment mg create \
--management-group-id $managementGroupId \
--name $deploymentName \
--location westus \
--template-file $templateFile
在终端中使用 Azure PowerShell 命令部署模板。
$managementGroupId = 'SecretRND'
$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "mg-scope-$today"
New-AzManagementGroupDeployment `
-ManagementGroupId $managementGroupId `
-Name $deploymentName `
-Location westus `
-TemplateFile $templateFile
注意,与订阅部署一样,你可以显式指定部署元数据的名称和位置。 使用当天日期可以减少使用现有部署名称的几率。
此部署可能需要一两分钟才能完成,然后你会看到部署成功。
验证部署
对于订阅范围的部署,可以在 Azure 门户中查看管理组范围的部署。
转到 Azure 门户。
在左窗格中,选择“所有服务”。
在“搜索”框中,输入“管理组”,然后在结果列表中选择“管理组”。
选择“机密研发项目”管理组。
在左侧窗格的“搜索”框中,输入“部署”,然后在“治理”下选择“部署”。
选择以“mg-scope”开头的部署,以查看部署了哪些资源。
在所选部署的“概述”窗格上,选择“部署详细信息”以将其展开。 将列出两个 Azure Policy 资源。
清理资源
已成功部署管理组范围资源。 现在可以删除创建的策略资源和管理组。
az account management-group delete --name SecretRND
Remove-AzManagementGroup -GroupId SecretRND