本快速入门介绍如何使用 Azure 资源管理器模板(ARM 模板)创建策略分配以验证资源是否符合 Azure 策略。 策略分配给资源组,并对不使用托管磁盘的虚拟机进行审核。 创建策略分配后,可以识别不合规的虚拟机。
Azure 资源管理器模板是定义项目基础结构和配置的 JavaScript 对象表示法 (JSON) 文件。 模板使用声明性语法。 你可以在不编写用于创建部署的编程命令序列的情况下,描述预期部署。
如果你的环境满足先决条件,并且你熟悉如何使用 ARM 模板,请选择“部署到 Azure”按钮。 模板将在 Azure 门户中打开。
分配内置策略或计划定义时,引用版本是可选的。 默认情况下,内置定义的策略分配使用最新版本,并会自动继承小版本更新,除非另有说明。
先决条件
- 如果没有 Azure 帐户,请在开始前创建一个试用帐户。
 - Azure PowerShell 或 Azure CLI。
 - Visual Studio Code 和 Azure 资源管理器 (ARM) 工具。
 - 必须在 Azure 订阅中注册 
Microsoft.PolicyInsights。 要注册资源提供程序,必须具有注册资源提供程序的权限。 此权限包含在“参与者”和“所有者”角色中。 - 具有至少一个不使用托管磁盘的虚拟机的资源组。
 
查看模板
ARM 模板将为资源组范围创建策略分配,并分配不使用托管磁盘的内置策略定义审核 VM。
创建以下 ARM 模板作为 policy-assignment.json。
- 打开 Visual Studio Code 并选择“文件”>“新建文本文件”。
 - 将 ARM 模板复制并粘贴到 Visual Studio Code 中。
 - 选择“文件”>“保存”,并使用文件名 policy-assignment.json。
 
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "policyAssignmentName": {
      "type": "string",
      "defaultValue": "audit-vm-managed-disks",
      "metadata": {
        "description": "Policy assignment name used in assignment's resource ID"
      }
    },
    "policyDefinitionID": {
      "type": "string",
      "defaultValue": "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
      "metadata": {
        "description": "Policy definition ID"
      }
    },
    "policyDisplayName": {
      "type": "string",
      "defaultValue": "Audit VM managed disks",
      "metadata": {
        "description": "Display name for Azure portal"
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2023-04-01",
      "name": "[parameters('policyAssignmentName')]",
      "properties": {
        "policyDefinitionId": "[parameters('policyDefinitionID')]",
        "description": "Policy assignment to resource group scope created with ARM template",
        "displayName": "[parameters('policyDisplayName')]",
        "nonComplianceMessages": [
          {
            "message": "Virtual machines should use managed disks"
          }
        ]
      }
    }
  ],
  "outputs": {
    "assignmentId": {
      "type": "string",
      "value": "[resourceId('Microsoft.Authorization/policyAssignments', parameters('policyAssignmentName'))]"
    }
  }
}
ARM 模板中定义的资源类型为 Microsoft.Authorization/policyAssignments。
该模板使用三个参数以部署策略分配:
policyAssignmentName创建名为 audit-vm-managed-disks 的策略分配。policyDefinitionID使用内置策略定义的 ID。 有关参考,用于获取 ID 的命令位于用于部署模板的部分中。policyDisplayName创建显示在 Azure 门户中的显示名称。
有关 ARM 模板文件的详细信息:
- 要查找更多 ARM 模板示例,请转到浏览代码示例。
 - 要详细了解用于部署的模板参考,请转到 Azure 模板参考。
 - 若要了解如何开发 ARM 模板,请转到 ARM 模板文档。
 - 要了解订阅级部署,请转到使用 ARM 模板进行订阅部署。
 
部署 ARM 模板
可以使用 Azure PowerShell 或 Azure CLI 部署 ARM 模板。
从 Visual Studio Code 终端会话连接到 Azure。 如果具有多个订阅,请运行命令以将上下文设置为你的订阅。 将 <subscriptionID> 替换为你的 Azure 订阅 ID。
Connect-AzAccount -Environment AzureChinaCloud
# Run these commands if you have multiple subscriptions
Get-AzSubScription
Set-AzContext -Subscription <subscriptionID>
你可以验证 Microsoft.PolicyInsights 是否已注册。 如果没有,可以运行一条命令来注册资源提供程序。
Get-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights' |
   Select-Object -Property ResourceTypes, RegistrationState
Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'
有关详细信息,请转到 Get-AzResourceProvider 和 Register-AzResourceProvider。
以下命令显示 policyDefinitionID 参数的值:
(Get-AzPolicyDefinition |
  Where-Object { $_.Properties.DisplayName -eq 'Audit VMs that do not use managed disks' }).ResourceId
以下命令可向资源组部署策略定义。 将 <resourceGroupName> 替换为你的资源组名称:
$rg = Get-AzResourceGroup -Name '<resourceGroupName>'
$deployparms = @{
Name = 'PolicyDeployment'
ResourceGroupName = $rg.ResourceGroupName
TemplateFile = 'policy-assignment.json'
}
New-AzResourceGroupDeployment @deployparms
$rg 变量存储资源组的属性。 $deployparms 变量使用散点来创建参数值并提高可读性。 New-AzResourceGroupDeployment 命令使用 $deployparms 变量中定义的参数值。
Name是在输出和 Azure 中显示的资源组部署名称。ResourceGroupName使用$rg.ResourceGroupName属性获取分配到策略的资源组名称。TemplateFile指定 ARM 模板名称及其在本地计算机上的位置。
你可以使用以下命令验证策略分配的部署:
该命令使用 $rg.ResourceId 属性来获取资源组的 ID。
Get-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId
Name               : audit-vm-managed-disks
ResourceId         : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
ResourceName       : audit-vm-managed-disks
ResourceGroupName  : {resourceGroupName}
ResourceType       : Microsoft.Authorization/policyAssignments
SubscriptionId     : {subscriptionId}
PolicyAssignmentId : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
Properties         : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.Policy.PsPolicyAssignmentProperties
有关详细信息,请转到 Get-AzPolicyAssignment。
识别不合规的资源
部署策略分配后,将会审核部署到资源组的虚拟机是否符合托管磁盘策略。
新策略分配的符合性状态需要几分钟才会变为活动状态,并提供关于策略状态的结果。
$complianceparms = @{
ResourceGroupName = $rg.ResourceGroupName
PolicyAssignmentName = 'audit-vm-managed-disks'
Filter = 'IsCompliant eq false'
}
Get-AzPolicyState @complianceparms
$complianceparms 变量创建在 Get-AzPolicyState 命令中使用的参数值。
ResourceGroupName从$rg.ResourceGroupName属性获取资源组名称。PolicyAssignmentName指定创建策略分配时使用的名称。Filter使用表达式查找不符合策略分配的资源。
结果应如以下示例所示并且 ComplianceState 将显示 NonCompliant:
Timestamp                : 2/26/2024 19:02:56
ResourceId               : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.compute/virtualmachines/{vmId}
PolicyAssignmentId       : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.authorization/policyassignments/audit-vm-managed-disks
PolicyDefinitionId       : /providers/microsoft.authorization/policydefinitions/06a78e20-9358-41c9-923c-fb736d382a4d
IsCompliant              : False
SubscriptionId           : {subscriptionId}
ResourceType             : Microsoft.Compute/virtualMachines
ResourceLocation         : {location}
ResourceGroup            : {resourceGroupName}
ResourceTags             : tbd
PolicyAssignmentName     : audit-vm-managed-disks
PolicyAssignmentOwner    : tbd
PolicyAssignmentScope    : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}
PolicyDefinitionName     : 06a78e20-9358-41c9-923c-fb736d382a4d
PolicyDefinitionAction   : audit
PolicyDefinitionCategory : tbd
ManagementGroupIds       : {managementGroupId}
ComplianceState          : NonCompliant
AdditionalProperties     : {[complianceReasonCode, ]}
有关详细信息,请查看 Get-AzPolicyState
清理资源
Remove-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId
若要退出登录 Azure PowerShell 会话,请执行以下操作:
Disconnect-AzAccount
后续步骤
本快速入门已分配一个策略定义用于识别 Azure 环境中的不合规资源。
若要详细了解如何分配验证资源合规性的策略,请继续学习以下教程。