练习 - 将资源部署到管理组
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
参数,并指定要用作父级的管理组的名称。
在实际部署中,需要将 R&D 团队的订阅移动到管理组中。 对于本练习,你将部署这些策略,即使管理组不包含任何订阅。 无论管理组为空还是包含订阅,都适用相同的部署过程。
创建 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