Uso dell'esportazione di Azure per Terraform in scenari avanzati

Questo articolo illustra come eseguire alcune delle attività più avanzate con Esportazione di Azure per Terraform.

  • Aggiungere risorse agli ambienti Terraform esistenti.
  • Esportare le risorse in un ambiente Terraform esistente con uno stato back-end remoto

Aggiunta a risorse esistenti

Per impostazione predefinita, l'esportazione di Azure per Terraform garantisce che la directory di output sia vuota per evitare conflitti con i file utente esistenti. Se è necessario importare risorse in un file di stato esistente, aggiungere il --append flag .

aztfexport [command] --append <scope>

Quando si specifica il --append flag, Esportazione di Azure per Terraform verifica se è presente un blocco o terraform preesistente provider in uno dei file nella directory corrente. In caso contrario, lo strumento crea un file per ogni blocco e quindi procede con l'esportazione. Se la directory di output ha un file di stato, tutte le risorse esportate vengono importate nel file di stato.

Inoltre, il file generato ha un .aztfexport suffisso prima dell'estensione, ad esempio main.aztfexport.tf per evitare potenziali conflitti di nomi di file.

Se si esegue aztfexport --append più volte, viene creato un singolo main.aztfexport.tf oggetto con i risultati di esportazione aggiunti al file ogni volta che viene eseguito il comando.

Bring Your Own Terraform configuration (Bring Your Own Terraform configuration)

Per impostazione predefinita, Esportazione di Azure per Terraform usa un back-end locale per archiviare il file di stato. Tuttavia, è anche possibile usare un back-end remoto. Esportazione di Azure per Terraform consente di definire blocchi o provider personalizzati terraform da passare.

Definire questi blocchi in un .tf file all'interno della directory di destinazione, esportare con il --append flag e le esportazioni di configurazione nella versione del back-end e del provider specificata (se disponibile).

Importante

Se la versione specificata di AzureRM non corrisponde alla versione installata durante l'esportazione, il comando non riesce.

esempio di Archiviazione di Azure

Questo esempio si basa sull'articolo Store Terraform state in Archiviazione di Azure.

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
    backend "azurerm" {
        resource_group_name  = "tfstate"
        storage_account_name = "storageacc"
        container_name       = "tfstate"
        key                  = "terraform.tfstate"
    }

}

provider "azurerm" {
  features {}
}

Esempio di Terraform Cloud

terraform {
  cloud {
    organization = "aztfexport-test"
    workspaces {
      name = "aztfexport-playground"
    }
  }
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
}
provider "azurerm" {
  features {
  }
}

Esperienza inline

Per esportare in un back-end inline, usare le --backend-type opzioni e --backend-config . Per altre informazioni sulla configurazione di un back-end Terraform, vedere Configurazione back-end terraform.

Usando l'esempio dell'account di archiviazione di Azure, è necessario quanto segue come definito nella documentazione back-end di AzureRM.

  • Nome del gruppo di risorse
  • Nome account di archiviazione
  • Nome contenitore di archiviazione

Passare questi parametri al comando insieme al tipo di back-end:

aztfexport [subcommand] --backend-type=azurerm \
                        --backend-config=resource_group_name=<resource group name> \
                        --backend-config=storage_account_name=<account name> \
                        --backend-config=container_name=<container name> \
                        --backend-config=key=terraform.tfstate 

Punti principali:

  • Nell'esempio precedente si usa il carattere di continuazione della riga Unix in modo che il codice venga visualizzato bene nel browser. Potrebbe essere necessario modificare questi caratteri in modo che corrispondano all'ambiente della riga di comando, ad esempio PowerShell, o combinare il comando in una sola riga.
  • Se lo stato back-end esiste già, Esportazione di Azure per Terraform unisce automaticamente le nuove risorse allo stato esistente. Non è necessario specificare l'opzione --append inline.

Esportare le risorse di Azure in un ambiente Terraform esistente

Ora, mettiamo tutto insieme! Si supponga che siano state create nuove risorse all'esterno di Terraform che devono essere spostate nella gestione di Terraform. Per completare la sezione, assicurarsi di avere un back-end configurato. Questa esercitazione usa la stessa configurazione specificata nell'esercitazione sullo stato remoto di Archiviazione di Azure.

  1. Nella directory padre di in cui si vuole creare la directory temporanea, eseguire il comando seguente:

    aztfexport resource -o tempdir --hcl-only <resource_id>
    

    Punti principali:

    • Il -o flag specifica di creare la directory se non esiste.
    • Il --hcl-only flag specifica di esportare le risorse configurate in HCL
  2. Dopo aver controllato che la risorsa può essere aggiunta, usare il file di mapping generato e il --append flag per garantire che l'esportazione di Azure rispetti le versioni preesistenti dello stato remoto e del provider all'interno dell'ambiente esistente:

    aztfexport map --append `./tempdir/aztfexportResourceMapping.json`
    
  3. Eseguire terraform init.

    terraform init --upgrade
    
  4. Eseguire il piano terraform.

  5. Esportazione di Azure per Terraform dovrebbe visualizzare Nessuna modifica necessaria.

Complimenti. L'infrastruttura e lo stato corrispondente sono stati aggiunti correttamente all'ambiente Terraform.

Se il piano si verifica in problemi, vedere Concetti relativi all'esportazione di Azure per Terraform per comprendere le limitazioni relative alla distribuzione del codice generato da --hcl-only. Se questo articolo non è utile, aprire un problema di GitHub.

Personalizzare ulteriormente la query

Di seguito sono descritti alcuni flag avanzati aggiuntivi, con come usarli:

Selezione dell'ambiente cloud

Per specificare un ambiente diverso da quello pubblico, usare il --env flag . Ad esempio, per il governo degli Stati Uniti:

aztfexport [command] --env="usgovernment" [further options] <scope>

Modifica della versione del provider Terraform

Per un accesso più semplice a una versione o AzAPI preferitaAzureRM, usare il --provider-version flag . Ad esempio, se si era nella AzAPI versione 1.10.0:

aztfexport [command] --provider-name=azapi --provider-version=1.10.0 [further options] <scope>

Autenticazione

Esiste un'ampia gamma di flag per la gestione della configurazione di autenticazione. Alcuni flag sono stati aggiunti in ritardo come v0.15:

  • --env
  • --tenant-id
  • --auxiliary-tenant-ids
  • --client-id
  • --client-id-file-path
  • --client-certificate
  • --client-certificate-path
  • --client-certificate-password
  • --client-secret
  • --client-secret-file-path
  • --oidc-request-token
  • --oidc-request-url
  • --oidc-token
  • --oidc-token-file-path
  • --use-managed-identity-cred (il valore predefinito è false)
  • --use-azure-cli-cred (il valore predefinito è true)
  • --use-oidc-cred (il valore predefinito è false)

I flag precedenti seguono la convenzione di denominazione del azurerm provider. Tutti i flag sono configurabili anche tramite variabili di ambiente, che include la stessa variabile di ambiente definita nel azurerm provider.

aztfexport tenta di eseguire l'autenticazione con ognuno dei tipi di credenziali, nell'ordine seguente, arrestandosi quando viene fornito un token:

  1. Segreto client
  2. Certificato client
  3. OIDC
  4. Identità gestita
  5. Interfaccia della riga di comando di Azure

Se uno o più use-xxx-cred non sono true, il tipo di credenziale verrà ignorato. Questo comportamento corrisponde al provider.

La configurazione del provider può eseguire l'override di qualsiasi configurazione di autenticazione da aztfexport. In questo modo gli utenti possono usare tipi di credenziali diversi tra aztfexport e il provider.

Inclusione delle assegnazioni di ruolo

Se si desidera includere assegnazioni di ruolo durante l'esportazione dell'ambito delle risorse, usare il --include-role-assignment comando :

aztfexport [command] --include-role-assignment [further options] <scope>

Passaggi successivi