快速入门:使用 Terraform 创建策略分配以识别不合规的资源
若要了解 Azure 中的符合性,第一步是确定资源的状态。 本快速入门逐步讲解如何创建策略分配,以识别未使用托管磁盘的虚拟机。
此过程结束时,你可以识别订阅中哪些虚拟机未使用托管磁盘。 这些虚拟机不符合策略分配要求。
先决条件
如果没有 Azure 订阅,请在开始前创建一个试用版订阅帐户。
在你的环境中配置 Terraform 0.12.0 或更高版本。
本快速入门需要运行 Azure CLI 2.13.0 或更高版本。 若要查找版本,请运行
az --version
。 如果需要进行安装或升级,请参阅安装 Azure CLI。
创建 Terraform 配置、变量和输出文件
本快速入门将创建一个策略分配,并分配“审核未使用托管磁盘的 VM”定义 。 此策略定义可识别不符合策略定义中设置的条件的资源。
配置 Terraform 配置、变量和输出文件。 Azure Policy 的 Terraform 资源使用 Azure 提供程序。
创建名为
policy-assignment
的新文件夹,并将目录更改到其中。使用以下代码创建
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" }
使用以下代码创建
variables.tf
:variable "cust_scope" { default = "{scope}" }
范围用于确定对其强制执行策略分配的资源或资源组。 它的范围可以从管理组到单个资源。 请务必将
{scope}
替换为基于所声明资源的以下模式之一:- 订阅:
/subscriptions/{subscriptionId}
- 资源组:
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}
- 资源:
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/[{parentResourcePath}/]
- 订阅:
使用以下代码创建
output.tf
:output "assignment_id" { value = azurerm_subscription_policy_assignment.auditvms.id }
初始化 Terraform 并创建计划
初始化 Terraform 以下载所需的提供程序,然后创建计划。
运行 terraform init 命令。 此命令将下载在 Terraform 配置中创建 Azure 资源所需的 Azure 模块。
terraform init
使用 Azure CLI 为 Terraform 进行身份验证。 有关详细信息,请参阅Azure 提供程序:使用 Azure CLI 进行身份验证。
az cloud set -n AzureChinaCloud az login
使用 terraform plan 命令和 out 参数创建执行计划。
terraform plan -out assignment.tfplan
注意
有关使执行计划和安全性持久化的信息,请参阅 Terraform 计划:安全警告。
应用 Terraform 执行计划
应用执行计划。
运行 terraform apply 命令并指定已创建的 assignment.tfplan
。
terraform apply assignment.tfplan
出现 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 环境中的不合规资源。
要了解有关分配策略以验证新资源是否符合要求的详细信息,请继续以下教程: