Быстрый старт: Создание присвоения политики для выявления ресурсов, не соответствующих требованиям, с помощью Terraform

Чтобы понять, соответствуют ли ресурсы требованиям в Azure, прежде всего нужно определить их состояние. В этом кратком руководстве вы шаг за шагом пройдете через процесс создания назначения политики для выявления виртуальных машин, которые не используют управляемые диски.

При назначении встроенной политики или определения инициативы необязательно ссылаться на версию. Назначения политик встроенных определений по умолчанию назначаются на последнюю версию и автоматически получают незначительные изменения версии, если иное не указано.

Terraform включает определение, предварительную версию и развертывание облачной инфраструктуры. С помощью Terraform вы создаете файлы конфигурации с помощью синтаксиса HCL. Синтаксис HCL позволяет указать поставщика облачных служб, таких как Azure, и элементы, составляющие облачную инфраструктуру. После создания файлов конфигурации вы создадите план выполнения , который позволяет предварительно просмотреть изменения инфраструктуры перед развертыванием. После того как вы проверите изменения, примените план выполнения для развертывания инфраструктуры.

В этой статье вы узнаете, как:

  • Получите текущую конфигурацию клиента Azure.
  • Создайте группу ресурсов Azure с созданным случайным именем.
  • Создайте назначение политики подписки для обнаружения виртуальных машин, которые не используют управляемые диски

Предварительные условия

Реализуйте код Terraform

Пример кода для этой статьи находится в репозитории Azure Terraform GitHub. Вы можете просмотреть файл журнала, содержащий результаты теста из текущих и предыдущих версий Terraform. Дополнительные статьи и пример кода, демонстрирующие использование Terraform для управления ресурсами Azure

  1. Создайте каталог, в котором необходимо протестировать и запустить пример кода Terraform и сделать его текущим каталогом.

  2. Создайте файл с именем providers.tf и вставьте приведенный ниже код.

    terraform {
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>4.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Создайте файл с именем main.tf и вставьте приведенный ниже код.

    # Create a random pet name to ensure unique resource group name
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    # Create a resource group
    resource "azurerm_resource_group" "example" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    # Get the current subscription
    data "azurerm_subscription" "current" {}
    
    # Create a subscription policy assignment
    resource "azurerm_subscription_policy_assignment" "auditvms" {
      name                 = "audit-vm-manageddisks"
      subscription_id      = coalesce(var.scope, "/subscriptions/${data.azurerm_subscription.current.subscription_id}")
      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"
    }
    
  4. Создайте файл с именем variables.tf и вставьте приведенный ниже код.

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "scope" {
      type        = string
      default     = ""
      description = "Scope of the policy assignment."
    }
    
  5. Создайте файл с именем outputs.tf и вставьте приведенный ниже код.

    output "resource_group_name" {
      value = azurerm_resource_group.example.name
    }
    
    output "assignment_id" {
      value = azurerm_subscription_policy_assignment.auditvms.id
    }
    
    output "subscription_id" {
      value = data.azurerm_subscription.current.subscription_id
    }
    

Указание области

Область определяет, к каким ресурсам или группе ресурсов применяется назначение политики. Она может варьироваться от группы управления до отдельного ресурса. Чтобы использовать любую из следующих областей, обновите scope переменную в variables.tf файле. Если оставить значение переменной scope пустым, используется область подписки.

  • Подписка: /subscriptions/<subscription_id>
  • Группа ресурсов /subscriptions/<subscription_id>/resourceGroups/<resource_group_name>;
  • Ресурс: /subscriptions/<subscription_id>/resourceGroups/<resource_group_name>/providers/<resource_provider_namespace>/[{parentResourcePath}/].

Инициализируйте Terraform

Это важно

Если вы используете поставщик azurerm 4.x, необходимо явно указать идентификатор подписки Azure для проверки подлинности в Azure перед выполнением команд Terraform.

Один из способов указать идентификатор подписки Azure, не помещая его в providers блок, заключается в указании идентификатора подписки в переменной среды с именем ARM_SUBSCRIPTION_ID.

Дополнительные сведения см. в справочной документации по поставщику Azure.

Запустите terraform init , чтобы инициализировать развертывание Terraform. Эта команда загружает поставщика Azure, необходимого для управления вашими ресурсами в Azure.

terraform init -upgrade

Ключевые моменты:

  • Параметр -upgrade обновляет необходимые плагины провайдера до самой последней версии, которая соответствует ограничениям версии конфигурации.

Создайте план запуска Terraform

Выполните terraform plan, чтобы создать план выполнения.

terraform plan -out main.tfplan

Ключевые моменты:

  • Команда terraform plan создает план выполнения, но не выполняет его. Вместо этого он определяет, какие действия необходимы для создания конфигурации, указанной в ваших конфигурационных файлах. Данный шаблон позволяет вам убедиться, что план выполнения соответствует вашим ожиданиям, прежде чем вносить какие-либо изменения в реальные ресурсы.
  • Необязательный параметр -out позволяет указать выходной файл для плана. Использование параметра -out обеспечивает, что план, который вы просмотрели, будет применен точно в таком виде.

Применение плана выполнения Terraform

Запустите terraform apply для применения плана выполнения к облачной инфраструктуре.

terraform apply main.tfplan

Ключевые моменты:

  • Пример команды terraform apply предполагает, что вы ранее выполнили команду terraform plan -out main.tfplan.
  • Если вы указали другое имя файла для параметра -out, используйте то же имя файла при вызове terraform apply.
  • Если вы не использовали параметр -out, вызовите terraform apply без параметров.

Проверка результатов

  1. Получите значение _assignment\_id_, возвращаемое terraform apply.

  2. Выполните следующую команду, чтобы просмотреть ресурсы, которые не соответствуют новому назначению политики.

    armclient post "/subscriptions/<subscription_id>/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>
    
  3. Результаты сравнимы с тем, что отображается в разделе "Несоответствующие ресурсы " в представлении портала Azure.

Очистка ресурсов

Если вам больше не нужны ресурсы, созданные через Terraform, выполните следующие действия:

  1. Запустите terraform plan с флагом destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Ключевые моменты:

    • Команда terraform plan создает план выполнения, но не выполняет его. Вместо этого он определяет, какие действия необходимы для создания конфигурации, указанной в ваших конфигурационных файлах. Данный шаблон позволяет вам убедиться, что план выполнения соответствует вашим ожиданиям, прежде чем вносить какие-либо изменения в реальные ресурсы.
    • Необязательный параметр -out позволяет указать выходной файл для плана. Использование параметра -out обеспечивает, что план, который вы просмотрели, будет применен точно в таком виде.
  2. Чтобы применить план выполнения, запустите terraform apply.

    terraform apply main.destroy.tfplan
    

Устранение неполадок с Terraform в Azure

Устранение распространенных проблем при использовании Terraform в Azure.

Следующие шаги