练习 - 将资源部署到管理组

已完成

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 文件

  1. 打开 Visual Studio Code。

  2. 删除 main.bicep 文件,然后新建一个同名的空文件。

  3. 保存空文件。

  4. 将以下内容添加到该文件。

    targetScope = 'managementGroup'
    

    请注意,此代码行告诉 Bicep,模板将部署在管理组范围。

添加策略定义

如前文所述,在 Bicep 文件中创建策略定义。

  1. 在刚刚添加的代码行下,添加以下变量定义:

    var policyDefinitionName = 'DenyFandGSeriesVMs'
    
  2. 在文件底部,添加下列 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'
          }
        }
      }
    }
    

    策略定义与之前应用于订阅的策略定义相同。 不过,这次是将其部署到管理组。

添加策略分配

你现在要将策略应用到管理组。 这意味着策略将应用于此管理组子级的所有订阅。

  1. policyDefinitionName 变量定义下,添加以下变量:

    var policyAssignmentName = 'DenyFandGSeriesVMs'
    
  2. 在文件底部的策略定义资源下,添加以下策略分配:

    resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
      name: policyAssignmentName
      properties: {
        policyDefinitionId: policyDefinition.id
      }
    }
    
  3. 保存对文件所做的更改。

验证模板

模板应如下所示:

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 门户中查看管理组范围的部署。

  1. 转到 Azure 门户

  2. 在左窗格中,选择“所有服务”。

  3. 在“搜索”框中,输入“管理组”,然后在结果列表中选择“管理组”

    Screenshot of the Azure portal interface showing the service list with 'Management groups' highlighted.

  4. 选择“机密研发项目”管理组

    Screenshot of the Azure portal interface, highlighting 'Secret R&D Projects' in the list of management groups.

  5. 在左侧窗格的“搜索”框中,输入“部署”,然后在“治理”下选择“部署”

    Screenshot of the Azure portal interface, showing the management group details.

  6. 选择以“mg-scope”开头的部署,以查看部署了哪些资源。

    Screenshot of the Azure portal Deployments pane, highlighting the 'mg-scope-*' deployment in the list of deployments.

  7. 在所选部署的“概述”窗格上,选择“部署详细信息”以将其展开。 将列出两个 Azure Policy 资源。

    Screenshot of the Azure portal 'Overview' pane for the selected deployment.

清理资源

已成功部署管理组范围资源。 现在可以删除创建的策略资源和管理组。

az account management-group delete --name SecretRND
Remove-AzManagementGroup -GroupId SecretRND