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

已完成

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 文件以部署到管理组

  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. 选择“机密研发项目”管理组。

    Azure 门户界面的屏幕截图,其中突出显示了管理组列表中的“机密 R&D 项目”。

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

    Azure 门户界面的屏幕截图,其中显示了管理组详细信息。

  5. 选择以 mg-scope 开头的部署,查看已部署的资源。

    Azure 门户部署窗格的屏幕截图,其中突出显示了部署列表中的“mg-scope-*”部署。

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

    所选部署的 Azure 门户“概述”窗格的屏幕截图。

清理资源

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

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