Condividi tramite


Distribuire un account Azure Batch e due pool con un'attività di avvio - Terraform

In questa guida introduttiva si creerà un account Azure Batch, un account Archiviazione di Azure e due pool di Batch usando Terraform. Batch è un servizio di pianificazione dei processi basato sul cloud che parallelizza e distribuisce l'elaborazione di grandi volumi di dati in molti computer. Viene in genere usato per attività come il rendering di grafica 3D, l'analisi di set di dati di grandi dimensioni o l'elaborazione di video. In questo caso, le risorse create includono un account Batch ,ovvero l'entità di organizzazione centrale per le attività di elaborazione distribuita, un account di archiviazione per l'elaborazione dei dati e due pool di Batch, ovvero gruppi di macchine virtuali che eseguono le attività.

Terraform consente di definire, visualizzare in anteprima e distribuire l'infrastruttura cloud. Con Terraform è possibile creare file di configurazione usando la sintassi HCL. La sintassi HCL consente di specificare il provider di servizi cloud, ad esempio Azure, e gli elementi che costituiscono l'infrastruttura cloud. Dopo aver creato i file di configurazione, è necessario creare un piano di esecuzione che consenta di visualizzare in anteprima le modifiche apportate all'infrastruttura prima che vengano distribuite. Dopo aver verificato le modifiche, è possibile applicare il piano di esecuzione per distribuire l'infrastruttura.

  • Specificare la versione richiesta di Terraform e i provider necessari.
  • Definire il provider di Azure senza funzionalità aggiuntive.
  • Definire le variabili per la posizione del gruppo di risorse e il prefisso del nome.
  • Generare un nome casuale per il gruppo di risorse di Azure.
  • Creare un gruppo di risorse con il nome generato in una posizione specificata.
  • Generare una stringa casuale per il nome dell'account di archiviazione.
  • Creare un account di archiviazione con il nome generato nel gruppo di risorse creato.
  • Generare una stringa casuale per il nome dell'account Batch.
  • Creare un account Batch con il nome generato nel gruppo di risorse creato e collegato all'account di archiviazione creato.
  • Generare un nome casuale per il pool di Batch.
  • Creare un pool di Batch con una scalabilità fissa nel gruppo di risorse creato e collegato all'account Batch creato.
  • Creare un pool di Batch con scalabilità automatica nel gruppo di risorse creato e collegato all'account Batch creato.
  • Restituire i nomi del gruppo di risorse creato, dell'account di archiviazione, dell'account Batch e di entrambi i pool di Batch.

Prerequisiti

Implementare il codice Terraform

  1. Creare una directory in cui testare ed eseguire il codice Terraform di esempio e impostarla come directory corrente.

  2. Creare un file denominato main.tfe inserire il codice seguente:

    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_D4_v3"
      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_D4_v3"
      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. Creare un file denominato outputs.tfe inserire il codice seguente:

    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. Creare un file denominato providers.tfe inserire il codice seguente:

    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. Creare un file denominato variables.tfe inserire il codice seguente:

    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."
    }
    

Inizializzare Terraform

Per inizializzare la distribuzione di Terraform, eseguire terraform init. Questo comando scarica il provider di Azure necessario per gestire le risorse di Azure.

terraform init -upgrade

Punti principali:

  • Il parametro -upgrade aggiorna i plug-in del provider necessari alla versione più recente conforme ai vincoli di versione della configurazione.

Creare un piano di esecuzione Terraform

Eseguire terraform plan per creare un piano di esecuzione.

terraform plan -out main.tfplan

Punti principali:

  • Il comando terraform plan consente di creare un piano di esecuzione, ma non di eseguirlo. Determina invece le azioni necessarie per creare la configurazione specificata nei file di configurazione. Questo modello consente di verificare se il piano di esecuzione corrisponde alle aspettative prima di apportare modifiche alle risorse effettive.
  • Il parametro -out facoltativo consente di specificare un file di output per il piano. L'uso del parametro -out garantisce che il piano esaminato sia esattamente quello che viene applicato.

Applicare un piano di esecuzione Terraform

Eseguire terraform apply per applicare il piano di esecuzione all'infrastruttura cloud.

terraform apply main.tfplan

Punti principali:

  • Il comando terraform apply di esempio presuppone che in precedenza sia stato eseguito terraform plan -out main.tfplan.
  • Se è stato specificato un nome file diverso per il parametro -out, usare lo stesso nome file nella chiamata a terraform apply.
  • Se non è stato usato il parametro -out, chiamare terraform apply senza parametri.

Verificare i risultati

Eseguire az batch account show per visualizzare l'account Batch.

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

Nel comando precedente sostituire <batch_account_name> con il nome dell'account Batch e <resource_group_name> con il nome del gruppo di risorse.

Pulire le risorse

Quando le risorse create tramite Terraform non sono più necessarie, eseguire i passaggi seguenti:

  1. Eseguire terraform plan e specificare il flag destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Punti principali:

    • Il comando terraform plan consente di creare un piano di esecuzione, ma non di eseguirlo. Determina invece le azioni necessarie per creare la configurazione specificata nei file di configurazione. Questo modello consente di verificare se il piano di esecuzione corrisponde alle aspettative prima di apportare modifiche alle risorse effettive.
    • Il parametro -out facoltativo consente di specificare un file di output per il piano. L'uso del parametro -out garantisce che il piano esaminato sia esattamente quello che viene applicato.
  2. Eseguire terraform apply per applicare il piano di esecuzione.

    terraform apply main.destroy.tfplan
    

Risolvere i problemi di Terraform in Azure

Risolvere i problemi comuni relativi all'uso di Terraform in Azure.

Passaggi successivi