Быстрое начало: Список ресурсов Azure с использованием провайдера AzAPI Terraform

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

В этой статье вы используете источник данных azapi_resource_list для перечисления Azure ресурсов и фильтрации результатов с помощью выражений JMESPath. Вы создаете две учетные записи хранения, а затем используете azapi_resource_list для перечисления и извлечения их свойств.

  • Создание группы ресурсов и двух учетных записей хранения с помощью поставщика AzureRM
  • Использование azapi_resource_list для перечисления учетных записей хранения и извлечения их имен и расположений с помощью JMESPath

Необходимые условия

При входе на портал Azure с учетной записью Майкрософт используется подписка Azure по умолчанию для этой учетной записи.

Terraform автоматически проходит проверку подлинности с помощью сведений из подписки Azure по умолчанию.

Запустите az account show , чтобы проверить текущую учетную запись Майкрософт и подписку Azure.

az account show

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

Понимать response_export_values

Атрибут response_export_values определяет, какие свойства извлекаются из ответа API и становятся доступными в output атрибуте источника данных. Он принимает список или карту:

  • Список: указывает пути JSON для извлечения. Используется ["*"] для экспорта полного текста ответа.
  • Карта: использует выражения JMESPath для фильтрации и повторной подготовки ответа. Ключ — это имя результата, а значение — выражение JMESPath.

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

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

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

  2. Создайте файл с именем providers.tf и вставьте следующий код:

    terraform {
      required_providers {
        azapi = {
          source  = "Azure/azapi"
          version = "~> 2.0"
        }
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~> 3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
    provider "azapi" {}
    
  3. Создайте файл с именем 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 value to create a unique name."
    }
    
  4. Создайте файл с именем main.tf и вставьте следующий код:

    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "random_string" "storage_suffix" {
      length  = 8
      upper   = false
      special = false
    }
    
    resource "azurerm_resource_group" "example" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    resource "azurerm_storage_account" "example" {
      count                    = 2
      name                     = "st${random_string.storage_suffix.result}${count.index}"
      resource_group_name      = azurerm_resource_group.example.name
      location                 = azurerm_resource_group.example.location
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    

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

terraform init -upgrade

Основные моменты:

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

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

terraform plan -out main.tfplan

Основные моменты:

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

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

terraform apply main.tfplan

Основные моменты:

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

Составьте список ресурсов с azapi_resource_list

Теперь, когда создаются учетные записи хранения, добавьте источник данных для их перечисления и извлечения свойств с помощью JMESPath.

  1. Создайте файл с именем list_resources.tf и вставьте следующий код:

    data "azapi_resource_list" "storage_accounts" {
      type      = "Microsoft.Storage/storageAccounts@2023-01-01"
      parent_id = azurerm_resource_group.example.id
    
      # Use JMESPath expressions to extract specific fields from the response.
      # The API returns a list of resources in a top-level "value" array.
      response_export_values = {
        "names"     = "value[].name"
        "locations" = "value[].location"
        "skus"      = "value[].sku.name"
      }
    }
    
  2. Создайте файл с именем outputs.tf и вставьте следующий код:

    output "resource_group_name" {
      value = azurerm_resource_group.example.name
    }
    
    output "storage_account_names" {
      value = data.azapi_resource_list.storage_accounts.output.names
    }
    
    output "storage_account_locations" {
      value = data.azapi_resource_list.storage_accounts.output.locations
    }
    
    output "storage_account_skus" {
      value = data.azapi_resource_list.storage_accounts.output.skus
    }
    
  3. Запустите terraform apply еще раз, чтобы создать источник данных и извлечь выходные данные:

    terraform apply
    

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

  • Поле type определяет тип ресурса и версию API для перечисления.
  • Поле parent_id задает область: идентификатор группы ресурсов для перечисления в рамках группы ресурсов, идентификатор подписки для перечисления по всей подписке или идентификатор родительского ресурса для перечисления ресурсов-детей (например, подсетей в виртуальной сети).
  • Форма карты response_export_values использует выражения JMESPath для необработанного ответа API. API списка учетных записей хранения возвращает результаты в массиве верхнего уровня value , поэтому выражения начинаются с value[].

Перечислить ресурсы в различных областях

parent_id определяет пределы области перечисления. Примеры:

# List all storage accounts in a subscription
data "azapi_resource_list" "all_storage" {
  type      = "Microsoft.Storage/storageAccounts@2023-01-01"
  parent_id = "/subscriptions/${var.subscription_id}"
  response_export_values = {
    "names" = "value[].name"
  }
}

# List subnets in a virtual network (child resource listing)
data "azapi_resource_list" "subnets" {
  type      = "Microsoft.Network/virtualNetworks/subnets@2023-11-01"
  parent_id = azurerm_virtual_network.example.id
  response_export_values = ["*"]
}

Очистите ресурсы

Если вам больше не нужны ресурсы, созданные через 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

Дальнейшие действия