Creare un file system lustre gestito di Azure con Terraform

In questo articolo viene usato Terraform per creare un file system lustre gestito di Azure .

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.

In questo articolo vengono illustrate le operazioni seguenti:

Nota

L'esempio di codice in questo articolo usa le risorse random_pet e random_string per generare valori univoci per il nome del gruppo di risorse e il nome del file system Gestito Lustre. È possibile sostituire questi valori con i propri nomi di risorse nei variables.tf file e main.tf .

Prerequisiti

Implementare il codice Terraform

  1. Creare una directory in cui testare il codice Terraform di esempio e renderla la directory corrente.

  2. Creare un file denominato providers.tf e 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 {}
    }
    
  3. Creare un file denominato main.tf e 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" "azurerm_virtual_network_name" {
      length  = 13
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    resource "azurerm_virtual_network" "example" { 
      name = coalesce(var.virtual_network_name, "vnet-${random_string.azurerm_virtual_network_name.result}")
      resource_group_name = azurerm_resource_group.rg.name
      address_space = ["10.0.0.0/16"] 
      location = azurerm_resource_group.rg.location 
    }
    
    resource "random_string" "azurerm_subnet_name" {
      length  = 13
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    resource "azurerm_subnet" "example" { 
      name = coalesce(var.subnet_name, "subnet-${random_string.azurerm_subnet_name.result}")
      resource_group_name = azurerm_resource_group.rg.name 
      virtual_network_name = azurerm_virtual_network.example.name 
      address_prefixes = ["10.0.2.0/24"]
    }
    
    resource "random_string" "azurerm_amlfs_name" {
      length  = 13
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    resource "azurerm_managed_lustre_file_system" "example" { 
      name = coalesce(var.amlfs_name, "amlfs-${random_string.azurerm_amlfs_name.result}")
      resource_group_name = azurerm_resource_group.rg.name
      location = azurerm_resource_group.rg.location 
      sku_name = var.amlfs_sku_name
      subnet_id = azurerm_subnet.example.id 
      storage_capacity_in_tb = var.amlfs_storage_capacity_in_tb 
      zones = ["1"] 
      maintenance_window {
        day_of_week = var.amlfs_maintenance_day_of_week
        time_of_day_in_utc = var.amlfs_maintenance_time_of_day
      }
    }
    
  4. Creare un file denominato variables.tf e inserire il codice seguente:

    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 "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "virtual_network_name" {
      type        = string
      description = "The name of the virtual network resource. The value will be randomly generated if blank."
      default     = ""
    }
    
    variable "subnet_name" {
      type        = string
      description = "The name of the virtual network subnet. The value will be randomly generated if blank."
      default     = ""
    }
    
    variable "amlfs_name" {
      type        = string
      description = "The name of the Manage Lustre file system resource. The value will be randomly generated if blank."
      default     = ""
    }
    
    variable "amlfs_sku_name" {
      type        = string
      default     = "AMLFS-Durable-Premium-40"
      validation {
        condition     = contains(["AMLFS-Durable-Premium-40", "AMLFS-Durable-Premium-125", "AMLFS-Durable-Premium-250", "AMLFS-Durable-Premium-500"], var.amlfs_sku_name)
        error_message = "The SKU value must be one of the following: AMLFS-Durable-Premium-40, AMLFS-Durable-Premium-125, AMLFS-Durable-Premium-250, AMLFS-Durable-Premium-500."
      }
      description = "SKU name for the Azure Managed Lustre file system."
    }
    
    variable "amlfs_storage_capacity_in_tb" {
      type        = number
      default     = 48
      description = "The size of the Managed Lustre file system, in TiB. This might be rounded up."
    }
    
    variable "amlfs_maintenance_day_of_week" {
      type        = string
      default     = "Saturday"
      validation {
        condition     = contains(["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], var.amlfs_maintenance_day_of_week)
        error_message = "The maintenance day of week value must be one of the following: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday."
      }
      description = "Day of the week on which the maintenance window will occur."
    }
    
    variable "amlfs_maintenance_time_of_day" {
      type        = string
      default     = "02:00"
      description = "The time of day (in UTC) to start the maintenance window."
    }
    
  5. Creare un file denominato outputs.tf e inserire il codice seguente:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "virtual_network_name" {
      value = azurerm_virtual_network.example.name
    }
    
    output "subnet_name" {
      value = azurerm_subnet.example.name
    }
    
    output "managed_lustre_file_system_name" {
      value = azurerm_managed_lustre_file_system.example.name
    }
    
    output "amlfs_sku_name" {
      value = azurerm_managed_lustre_file_system.example.sku_name
    }
    
    output "amlfs_storage_capacity_in_tb" {
      value = azurerm_managed_lustre_file_system.example.storage_capacity_in_tb
    }
    

Inizializzare Terraform

Eseguire terraform init per inizializzare la distribuzione terraform. Questo comando scarica il provider di Azure necessario per gestire le risorse di Azure.

terraform init -upgrade

Punti principali:

  • Il -upgrade parametro 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 per applicare il piano di esecuzione all'infrastruttura cloud.

terraform apply main.tfplan

Punti principali:

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

Verificare i risultati

  1. Ottenere il nome del gruppo di risorse di Azure.

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. Ottenere il nome del file system lustre gestito.

    managed_lustre_file_system_name=$(terraform output -raw managed_lustre_file_system_name)
    
  3. Eseguire az amlfs show per visualizzare il nome del file system lustre gestito.

    az amlfs show --resource-group $resource_group_name \
                  --name $managed_lustre_file_system_name \
    
    

Pulire le risorse

Quando non sono più necessarie le risorse create tramite Terraform, seguire questa procedura:

  1. Eseguire il piano terraform e specificare il destroy flag.

    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 relativi a Terraform in Azure

Risolvere i problemi comuni quando si usa Terraform in Azure

Passaggi successivi

È quindi possibile esplorare altre informazioni su Lustre gestito di Azure.