快速入门:使用 Terraform 创建策略分配以识别不合规的资源

若要了解 Azure 中的符合性,第一步是确定资源的状态。 本快速入门逐步讲解如何创建策略分配,以识别未使用托管磁盘的虚拟机。

此过程结束时,你可以识别订阅中哪些虚拟机未使用托管磁盘。 这些虚拟机不符合策略分配要求。

先决条件

  • 如果没有 Azure 订阅,请在开始前创建一个试用版订阅帐户。

  • 在你的环境中配置 Terraform 0.12.0 或更高版本。

  • 本快速入门需要运行 Azure CLI 2.13.0 或更高版本。 若要查找版本,请运行 az --version。 如果需要进行安装或升级,请参阅安装 Azure CLI

创建 Terraform 配置、变量和输出文件

本快速入门将创建一个策略分配,并分配“审核未使用托管磁盘的 VM”定义 。 此策略定义可识别不符合策略定义中设置的条件的资源。

配置 Terraform 配置、变量和输出文件。 Azure Policy 的 Terraform 资源使用 Azure 提供程序

  1. 创建名为 policy-assignment 的新文件夹,并将目录更改到其中。

  2. 使用以下代码创建 main.tf

    注意

    若要在管理组中创建策略分配,请使用 azurerm_management_group_policy_assignment 资源,对于资源组,请使用 azurerm_resource_group_policy_assignment,对于订阅,请使用 azurerm_subscription_policy_assignment 资源。

      provider "azurerm" {
        features {}
    
        environment = "china"
      }
    
      terraform {
      required_providers {
          azurerm = {
              source = "hashicorp/azurerm"
              version = ">= 2.96.0"
          }
        }
      }
    
      resource "azurerm_subscription_policy_assignment" "auditvms" {
      name = "audit-vm-manageddisks"
      subscription_id = var.cust_scope
      policy_definition_id = "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d"
      description = "Shows all virtual machines not using managed disks"
      display_name = "Audit VMs without managed disks assignment"
      }
    
  3. 使用以下代码创建 variables.tf

    variable "cust_scope" {
        default = "{scope}"
    }
    

    范围用于确定对其强制执行策略分配的资源或资源组。 它的范围可以从管理组到单个资源。 请务必将 {scope} 替换为基于所声明资源的以下模式之一:

    • 订阅:/subscriptions/{subscriptionId}
    • 资源组:/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}
    • 资源:/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/[{parentResourcePath}/]
  4. 使用以下代码创建 output.tf

    output "assignment_id" {
        value = azurerm_subscription_policy_assignment.auditvms.id
    }
    

初始化 Terraform 并创建计划

初始化 Terraform 以下载所需的提供程序,然后创建计划。

  1. 运行 terraform init 命令。 此命令将下载在 Terraform 配置中创建 Azure 资源所需的 Azure 模块。

    terraform init
    

    运行 terraform init 命令的屏幕截图,其中显示了下载 azurerm 模块的过程和一条成功消息。

  2. 使用 Azure CLI 为 Terraform 进行身份验证。 有关详细信息,请参阅Azure 提供程序:使用 Azure CLI 进行身份验证

    az cloud set -n AzureChinaCloud
    az login
    
  3. 使用 terraform plan 命令和 out 参数创建执行计划。

    terraform plan -out assignment.tfplan
    

    运行 terraform plan 命令和 out 参数(用于显示将创建的 Azure 资源)的屏幕截图。

    注意

    有关使执行计划和安全性持久化的信息,请参阅 Terraform 计划:安全警告

应用 Terraform 执行计划

应用执行计划。

运行 terraform apply 命令并指定已创建的 assignment.tfplan

terraform apply assignment.tfplan

运行 terraform apply 命令以及随后创建的资源的屏幕截图。

出现 Apply complete! Resources: 1 added, 0 changed, 0 destroyed. 消息,表示策略分配现已创建。 由于我们已定义 outputs.tf 文件,因此还会返回 assignment_id。

识别不合规的资源

若要查看此新分配下不合规的资源,请使用 terraform apply 返回的 assignment_id。 使用它,运行以下命令,获取输出到 JSON 文件中的不合规资源的资源 ID:

armclient post "/subscriptions/<subscriptionID>/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01&$filter=IsCompliant eq false and PolicyAssignmentId eq '<policyAssignmentID>'&$apply=groupby((ResourceId))" > <json file to direct the output with the resource IDs into>

结果应如以下示例所示:

{
  "@odata.context": "https://management.chinacloudapi.cn/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
  "@odata.count": 3,
  "value": [
    {
      "@odata.id": null,
      "@odata.context": "https://management.chinacloudapi.cn/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
      "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachineId>"
    },
    {
      "@odata.id": null,
      "@odata.context": "https://management.chinacloudapi.cn/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
      "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine2Id>"
    },
    {
      "@odata.id": null,
      "@odata.context": "https://management.chinacloudapi.cn/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
      "ResourceId": "/subscriptions/<subscriptionName>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine3ID>"
    }
  ]
}

这些结果与 Azure 门户视图中“不合规资源”下通常所列的结果类似。

清理资源

若要删除创建的分配,请使用 Azure CLI,或使用 terraform destroy 撤销 Terraform 执行计划。

  • Azure CLI

    az policy assignment delete --name 'audit-vm-manageddisks' --scope '/subscriptions/<subscriptionID>/<resourceGroupName>'
    
  • Terraform

    terraform destroy
    

后续步骤

本快速入门已分配一个策略定义用于识别 Azure 环境中的不合规资源。

要了解有关分配策略以验证新资源是否符合要求的详细信息,请继续以下教程: