Поделиться через


Развертывание учетной записи пакетной службы Azure и двух пулов — Terraform

В этом кратком руководстве вы создадите учетную запись Azure Batch, учетную запись Azure Storage и два пула Batch с помощью Terraform. Пакетная служба — это облачная служба планирования заданий, которая параллелизирует и распределяет обработку больших объемов данных на многих компьютерах. Обычно используется для параметрических вычислений, моделирования Монте-Карло, моделирования финансовых рисков и других высокопроизводительных вычислительных приложений. Учетная запись Batch — это основной ресурс в службе Batch, предоставляющий доступ к пулам, заданиям и задачам. Учетная запись хранения используется для хранения всех файлов, используемых и создаваемых пакетной службой, а два пула пакетной службы — это коллекции вычислительных узлов, выполняющих задачи.

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

  • Укажите требуемую версию Terraform и необходимые поставщики.
  • Определите поставщика Azure без дополнительных функций.
  • Определите переменные для расположения группы ресурсов и префикса имени группы ресурсов.
  • Создайте случайное имя для группы ресурсов с помощью предоставленного префикса.
  • Создайте группу ресурсов Azure с созданным именем в указанном расположении.
  • Создайте случайную строку, которая будет использоваться в качестве имени учетной записи хранения.
  • Создайте учетную запись хранения с созданным именем в созданной группе ресурсов, в том же расположении, а также со стандартным уровнем учетной записи и локальным избыточным типом репликации хранилища.
  • Создайте другую случайную строку, которая будет использоваться в качестве имени учетной записи Batch.
  • Создайте учетную запись Batch с созданным именем в созданной группе ресурсов в том же расположении и свяжите ее с созданной учетной записью хранения в режиме аутентификации ключей хранения.
  • Создайте случайное имя для пула Batch с префиксом "пул".
  • Создайте пул пакетной службы с фиксированным масштабом с помощью созданного имени в созданной группе ресурсов, связанной с созданной учетной записью пакетной службы, с стандартным размером виртуальной машины A1, номером SKU агента узла Ubuntu 22.04 и начальной задачей, которая повторяет "Hello World из $env" с максимальным количеством повторных попыток и ожидает успешного выполнения.
  • Создайте другой пул пакетной службы с автоматическим масштабированием, используя то же имя, в созданной группе ресурсов, связанной с созданной учетной записью пакетной службы, стандартным размером виртуальной машины A1, номером SKU агента узла Ubuntu 22.04 и формулой автомасштабирования.
  • Выводит имена созданной группы ресурсов, учетной записи хранения, учетной записи пакетной службы и пулов пакетной службы.

Предпосылки

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

Замечание

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

Дополнительные статьи и пример кода, демонстрирующие использование Terraform для управления ресурсами Azure.

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

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

    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    resource "random_string" "storage_account_name" {
      length  = 8
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    resource "azurerm_storage_account" "example" {
      name                     = random_string.storage_account_name.result
      resource_group_name      = azurerm_resource_group.rg.name
      location                 = azurerm_resource_group.rg.location
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    
    resource "random_string" "batch_account_name" {
      length  = 8
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    resource "azurerm_batch_account" "example" {
      name                                = random_string.batch_account_name.result
      resource_group_name                 = azurerm_resource_group.rg.name
      location                            = azurerm_resource_group.rg.location
      storage_account_id                  = azurerm_storage_account.example.id
      storage_account_authentication_mode = "StorageKeys"
    }
    
    resource "random_pet" "azurerm_batch_pool_name" {
      prefix = "pool"
    }
    
    resource "azurerm_batch_pool" "fixed" {
      name                = "${random_pet.azurerm_batch_pool_name.id}-fixed-pool"
      resource_group_name = azurerm_resource_group.rg.name
      account_name        = azurerm_batch_account.example.name
      display_name        = "Fixed Scale Pool"
      vm_size             = "Standard_A1"
      node_agent_sku_id   = "batch.node.ubuntu 22.04"
    
      fixed_scale {
        target_dedicated_nodes = 2
        resize_timeout         = "PT15M"
      }
    
      storage_image_reference {
        publisher = "Canonical"
        offer     = "0001-com-ubuntu-server-jammy"
        sku       = "22_04-lts"
        version   = "latest"
      }
    
      start_task {
        command_line       = "echo 'Hello World from $env'"
        task_retry_maximum = 1
        wait_for_success   = true
    
        common_environment_properties = {
          env = "TEST"
        }
    
        user_identity {
          auto_user {
            elevation_level = "NonAdmin"
            scope           = "Task"
          }
        }
      }
    
      metadata = {
        "tagName" = "Example tag"
      }
    }
    
    resource "azurerm_batch_pool" "autopool" {
      name                = "${random_pet.azurerm_batch_pool_name.id}-autoscale-pool"
      resource_group_name = azurerm_resource_group.rg.name
      account_name        = azurerm_batch_account.example.name
      display_name        = "Auto Scale Pool"
      vm_size             = "Standard_A1"
      node_agent_sku_id   = "batch.node.ubuntu 22.04"
    
      auto_scale {
        evaluation_interval = "PT15M"
    
        formula = <<EOF
          startingNumberOfVMs = 1;
          maxNumberofVMs = 25;
          pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
          pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
          $TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);
    EOF
      }
    
      storage_image_reference {
        publisher = "Canonical"
        offer     = "0001-com-ubuntu-server-jammy"
        sku       = "22_04-lts"
        version   = "latest"
      }
    }
    
  3. Создайте файл с именем outputs.tfи вставьте следующий код:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "storage_account_name" {
      value = azurerm_storage_account.example.name
    }
    
    output "batch_account_name" {
      value = azurerm_batch_account.example.name
    }
    
    output "batch_pool_fixed_name" {
      value = azurerm_batch_pool.fixed.name
    }
    
    output "batch_pool_autopool_name" {
      value = azurerm_batch_pool.autopool.name
    }
    
  4. Создайте файл с именем providers.tfи вставьте следующий код:

    terraform {
      required_version = ">=1.0"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  5. Создайте файл с именем 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."
    }
    

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

Запустите 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 без параметров.

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

Запустите az batch account show, чтобы просмотреть учетную запись Batch.

az batch account show --name <batch_account_name> --resource-group <resource_group_name>

Замените <batch_account_name> именем учетной записи пакетной службы и <resource_group_name> именем группы ресурсов.

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

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

Дальнейшие шаги