Compartir vía


Uso de Azure Export for Terraform en entornos avanzados

En este artículo se explica cómo realizar algunas de las tareas más avanzadas con Azure Export for Terraform.

  • Anexe recursos a entornos de Terraform existentes.
  • Exportación de recursos a un entorno de Terraform existente con un estado de back-end remoto

Anexar a recursos existentes

De forma predeterminada, con Azure Export for Terraform se garantiza que el directorio de salida está vacío para evitar conflictos con los archivos de usuario existentes. Si necesita importar recursos a un archivo de estado existente, agregue la flag --append.

aztfexport [command] --append <scope>

Cuando se indica la flag --append, Azure Export for Terraform comprueba si hay un bloque provider o terraform preexistente en cualquiera de los archivos del directorio actual. Si no es así, la herramienta crea un archivo para cada bloque y luego sigue con la exportación. Si el directorio de salida tiene un archivo de estado, los recursos exportados se importan en el archivo de estado.

Además, el archivo generado tiene un sufijo .aztfexport antes de la extensión, como en main.aztfexport.tf, para evitar posibles conflictos de nombres de archivo.

Si ejecuta aztfexport --append varias veces, se crea un solo main.aztfexport.tf con los resultados de exportación anexados al archivo cada vez que se ejecuta el comando.

Usar su propia configuración de Terraform

De forma predeterminada, Azure Export for Terraform usa un back-end local para almacenar el archivo de estado. Sin embargo, también es posible usar un back-end remoto. Azure Export for Terraform le permite definir sus propios bloques terraform o provider que pasar.

Defina estos bloques en un archivo .tf en el directorio de destino, expórtelo con la flag --append y la configuración se exportará a la versión de back-end y del proveedor correspondiente (si se facilita).

Importante

Si la versión correspondiente de AzureRM no coincide con la versión instalada al realizar la exportación, se generará un error en el comando.

Ejemplo de Azure Storage

Este ejemplo se basa en el artículo Almacenamiento del estado de Terraform en Azure Storage.

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 {}
}

Ejemplo de Terraform Cloud

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

Uso en línea de comandos incrustada

Para exportar a un back-end incrustado en la línea de comandos, use las opciones --backend-type y --backend-config. Para obtener más información sobre cómo configurar un back-end de Terraform, consulte Configuración de back-end de Terraform.

Si usa el ejemplo de cuenta de almacenamiento de Azure, necesitará lo siguiente, tal como viene recogido en la documentación sobre el back-end de AzureRM.

  • Definición de un nombre de grupo de recursos
  • Nombre de la cuenta de almacenamiento
  • Nombre del contenedor de almacenamiento

Pase estos parámetros al comando junto con el tipo de 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 

Puntos clave:

  • En el ejemplo anterior, se usa el carácter de continuación de línea Unix para que el código se vea bien en el explorador. Quizá tenga que cambiar estos caracteres para que se ajusten al entorno de la línea de comandos (como PowerShell) o combinar el comando en una línea.
  • Si el estado del back-end ya existe, Azure Export for Terraform combinará automáticamente los nuevos recursos con el estado existente. No es necesario indicar la opción --append en la línea de comandos.

Exportación de recursos de Azure a un entorno de Terraform existente

Ahora juntémoslo todo. Imagine que se han creado nuevos recursos fuera de Terraform y estos deben moverse a la administración de Terraform. Para completar la sección, asegúrese de que tiene un back-end configurado. En este tutorial se usa la misma configuración que se indica en el tutorial de estado remoto de Azure Storage.

  1. En el directorio principal donde desee crear el directorio temporal, ejecute el siguiente comando:

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

    Puntos clave:

    • La flag -o indica que se debe crear el directorio si no existe.
    • La flag --hcl-only indica que se deben exportar los recursos configurados al HCL.
  2. Después de inspeccionar que el recurso se puede anexar, use el archivo de asignación generado y la flag --append para asegurarse de que Azure Export respeta el estado remoto y las versiones del proveedor preexistentes dentro del entorno existente:

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

    terraform init --upgrade
    
  4. Ejecute terraform plan.

  5. En Azure Export for Terraform debe aparecer No se necesitan cambios.

Felicidades. La infraestructura y su estado correspondiente se han anexado correctamente al entorno de Terraform.

Si en la planificación surgen problemas, consulte Conceptos de Azure Export for Terraform para conocer las limitaciones relacionadas con la implementación de código generado por --hcl-only. Si ese artículo no le sirve de ayuda, cree una incidencia de GitHub.

Otras opciones de personalización de consultas

A continuación se describen algunas flags avanzadas adicionales y la forma de usarlas:

Selección del entorno en la nube

Para indicar un entorno distinto de la nube pública, use la flag --env. Por ejemplo, para Gobierno de EE. UU.:

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

Cambio de la versión del proveedor de Terraform

Para tener un acceso más directo a la versión AzureRM o AzAPI deseada, use la flag --provider-version. Por ejemplo, si opta por AzAPI, en su versión 1.10.0:

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

Autenticación

Existen diversas flags para administrar la configuración de autenticación. Algunas flags se han añadido con la versión 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 (el valor predeterminado es false)
  • --use-azure-cli-cred (el valor predeterminado es true)
  • --use-oidc-cred (el valor predeterminado es false)

Las flags anteriores respetan las reglas de nomenclatura del proveedor azurerm. Además, todas las flags se pueden configurar a través de variables de entorno, lo que incluye la misma variable de entorno definida en el proveedor azurerm.

aztfexport intenta autenticarse con cada uno de los tipos de credenciales, en el orden siguiente, deteniéndose cuando se facilita un token:

  1. Secreto del cliente
  2. Certificado de cliente
  3. OIDC
  4. Identidad administrada
  5. CLI de Azure

Si una o varias use-xxx-cred no son true, se ignorará ese tipo de credencial. Esto también pasa con el proveedor.

La configuración del proveedor puede invalidar cualquier configuración de autenticación de aztfexport. Esto permite a los usuarios usar diferentes tipos de credenciales entre aztfexport y el proveedor.

Incorporación de asignaciones de roles

Si desea incluir asignaciones de roles al exportar su campo de recursos, use el comando --include-role-assignment:

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

Pasos siguientes