Compartir a través de


Implementación de pruebas de integración para proyectos de Terraform en Azure

Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.

Las pruebas de integración validan que un cambio de código recién introducido no interrumpe el código existente. En DevOps, la integración continua (CI) hace referencia a un proceso que compila todo el sistema cada vez que se cambia la base de código; por ejemplo, si alguien quiere combinar una solicitud de incorporación de cambios en un repositorio de GIT. La lista siguiente contiene ejemplos comunes de pruebas de integración:

  • Herramientas de análisis de código estático, por ejemplo, de lint y formato.
  • Ejecute terraform validate para comprobar la sintaxis del archivo de configuración.
  • Ejecute terraform plan para asegurarse de que la configuración funcionará según lo previsto.

En este artículo aprenderá a:

  • Aprenda los conceptos básicos de las pruebas de integración para proyectos de Terraform.
  • Use Azure DevOps para configurar una canalización de integración continua.
  • Ejecute análisis de código estático en el código de Terraform.
  • Ejecute terraform validate para validar los archivos de configuración de Terraform en el equipo local.
  • Ejecute terraform plan para validar los archivos de configuración de Terraform desde una perspectiva de servicios remotos.
  • Use una canalización de Azure para automatizar la integración continua.

1. Configurar su entorno

  • Suscripción de Azure: Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
  • Organización y proyecto de Azure DevOps: si no tiene uno, cree una organización de Azure DevOps.

  • Extensión terraform Build & Release Tasks: instale la extensión de tareas de compilación y versión de Terraform en su organización de Azure DevOps.

  • Concesión de acceso a Azure DevOps a su suscripción de Azure: cree una conexión de servicio de Azure denominada terraform-basic-testing-azure-connection para permitir que Azure Pipelines se conecte a las suscripciones de Azure.

  • Código y recursos de ejemplo: descargue desde GitHub el proyecto integration-testing. El directorio en el que se descarga el ejemplo se conoce como directorio de ejemplo.

2. Validación de una configuración local de Terraform

El comando terraform validate se ejecuta desde la línea de comandos en el directorio que contiene los archivos de Terraform. El objetivo principal de este comando es validar la sintaxis.

  1. En el directorio de ejemplo, vaya al directorio src.

  2. Ejecute terraform init para inicializar el directorio de trabajo.

    terraform init
    
  3. Ejecute terraform validate para validar la sintaxis de los archivos de configuración.

    terraform validate
    

    Puntos clave:

    • Aparece un mensaje que indica que la configuración es válida.
  4. Edite el archivo main.tf.

  5. En la línea 5, inserte un error tipográfico que invalide la sintaxis. Por ejemplo, reemplace var.location por var.loaction.

  6. Guarde el archivo.

  7. Vuelva a ejecutar la validación.

    terraform validate
    

    Puntos clave:

    • Verá un mensaje de error que indica la línea de código que tiene un error y una descripción del error.

Como puede ver, Terraform ha detectado un problema en la sintaxis del código de configuración. Este problema impide la implementación de la configuración.

Se recomienda ejecutar siempre terraform validate en los archivos de Terraform antes de insertarlos en el sistema de control de versiones. Además, este nivel de validación debe formar parte de la canalización de integración continua. Más adelante en este artículo, exploraremos cómo configurar una canalización de Azure para realizar la validación automáticamente.

3. Implementación de una configuración de Terraform

En la sección anterior, vio cómo validar una configuración de Terraform. Ese nivel de pruebas era específico de la sintaxis. Esa prueba no tuvo en cuenta lo que ya podía estar implementado en Azure.

Terraform es un lenguaje declarativo, lo que significa que declara lo que quiere como resultado final. Por ejemplo, supongamos que tiene 10 máquinas virtuales en un grupo de recursos. A continuación, se crea un archivo de Terraform que define tres máquinas virtuales. La aplicación de este plan no incrementa el recuento total hasta 13. En su lugar, Terraform elimina siete de las máquinas virtuales para que termine con tres. La ejecución de terraform plan permite confirmar los posibles resultados de la aplicación de un plan de ejecución para evitar sorpresas.

Para generar el plan de ejecución de Terraform, ejecute terraform plan. Este comando se conecta a la suscripción de Azure de destino para comprobar qué parte de la configuración ya está implementada. A continuación, Terraform determina los cambios necesarios para cumplir los requisitos indicados en el archivo de Terraform. En esta fase, Terraform no implementa nada. Le indica lo que ocurrirá si aplica el plan.

Si está siguiendo el artículo y ha realizado los pasos de la sección anterior, ejecute el comando terraform plan:

terraform plan

Después de ejecutar terraform plan, Terraform muestra el resultado potencial de la aplicación del plan de ejecución. La salida indica los recursos de Azure que se agregarán, cambiarán y destruirán.

De forma predeterminada, Terraform almacena el estado en el mismo directorio local que el archivo de Terraform. Este patrón funciona bien en escenarios de un solo usuario. Sin embargo, cuando varias personas trabajan en los mismos recursos de Azure, los archivos de estado local pueden salir de la sincronización. Para solucionar este problema, Terraform admite la escritura de archivos de estado en un almacén de datos remoto (como Azure Storage). En este escenario, podría ser problemático ejecutar terraform plan en un equipo local y dirigirse a una máquina remota. Como resultado, puede que tenga sentido automatizar este paso de validación como parte de la canalización de integración continua.

4. Ejecución de análisis de código estático

El análisis de código estático puede realizarse directamente en el código de configuración de Terraform sin ejecutarlo. Este análisis puede ser útil para detectar cuestiones como problemas de seguridad e incoherencias de cumplimiento.

Las herramientas siguientes proporcionan un análisis estático para los archivos de Terraform:

A menudo, el análisis estático se ejecuta como parte de una canalización de integración continua. Estas pruebas no requieren la creación de un plan de ejecución ni una implementación. Como resultado, se ejecutan más rápido que otras pruebas y, por lo general, se ejecutan en primer lugar en el proceso de integración continua.

5. Automatización de las pruebas de integración mediante una canalización de Azure

La integración continua implica probar todo un sistema cuando se introduce un cambio. En esta sección, se muestra una configuración de canalización de Azure que se usa para implementar la integración continua.

  1. Con el editor que prefiera, vaya al clon local del proyecto de ejemplo de Terraform en GitHub.

  2. Abra el archivo samples/integration-testing/src/azure-pipeline.yaml .

  3. Desplácese hasta la sección pasos, donde verá un conjunto estándar de pasos que se usan para ejecutar varias rutinas de instalación y validación.

  4. Revise la línea Step 1: run the Checkov Static Code Analysis (Paso 1: ejecutar el análisis de código estático de Checkov). En este paso, el proyecto Checkov mencionado anteriormente ejecuta un análisis de código estático en la configuración de Terraform de muestra.

    - bash: $(terraformWorkingDirectory)/checkov.sh $(terraformWorkingDirectory)
      displayName: Checkov Static Code Analysis
    

    Puntos clave:

    • Este script es responsable de ejecutar Checkov en el área de trabajo de Terraform montada dentro de un contenedor de Docker. Los agentes administrados por Microsoft están habilitados para Docker. La ejecución de herramientas dentro de un contenedor de Docker es más fácil y elimina la necesidad de instalar Checkov en el agente de canalización de Azure.
    • La variable de $(terraformWorkingDirectory) se define en el archivo azure-pipeline.yaml.
  5. Revise la línea Step 2: install Terraform on the Azure Pipelines agent (Paso 2: instalación de Terraform en el agente de Azure Pipelines). La extensión Terraform Build & Release Tasks que ha instalado antes tiene un comando para instalar Terraform en el agente que ejecuta la canalización de Azure. Esta tarea es lo que se hace en este paso.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0
      displayName: 'Install Terraform'
      inputs:
        terraformVersion: $(terraformVersion)
    

    Puntos clave:

    • La versión de Terraform que se va a instalar se especifica mediante una variable de la canalización de Azure denominada terraformVersion que se define en el archivo azure-pipeline.yaml.
  6. Revise la línea Step 3: run Terraform init to initialize the workspace (Paso 3: ejecutar la inicialización de Terraform para inicializar el área de trabajo). Ahora que Terraform está instalado en el agente, se puede inicializar el directorio de Terraform.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform init'
      inputs:
        command: init
        workingDirectory: $(terraformWorkingDirectory)
    

    Puntos clave:

    • La entrada command especifica qué comando de Terraform se debe ejecutar.
    • La entrada workingDirectory indica la ruta de acceso del directorio de Terraform.
    • La variable de $(terraformWorkingDirectory) se define en el archivo azure-pipeline.yaml.
  7. Revise la línea Step 4: run Terraform validate to validate HCL syntax (Paso 4: ejecute terraform validate para validar la sintaxis HCL). Una vez inicializado el directorio del proyecto, se ejecuta terraform validate para validar la configuración en el servidor.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform validate'
      inputs:
        command: validate
        workingDirectory: $(terraformWorkingDirectory)
    
  8. Revise la línea Step 5: run Terraform plan to validate HCL syntax (Paso 5: ejecute terraform plan para validar la sintaxis HCL). Como se explicó anteriormente, la generación del plan de ejecución se realiza para comprobar si la configuración de Terraform es válida antes de la implementación.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform plan'
      inputs:
        command: plan
        workingDirectory: $(terraformWorkingDirectory)
        environmentServiceName: $(serviceConnection)
        commandOptions: -var location=$(azureLocation)
    

    Puntos clave:

    • La entrada environmentServiceName hace referencia al nombre de la conexión de servicio de Azure creada en Configuración del entorno. La conexión permite a Terraform acceder a la suscripción de Azure.
    • La entrada commandOptions se usa para pasar argumentos al comando de Terraform. En este caso, se especifica una ubicación. La variable $(azureLocation) se define anteriormente en el archivo YAML.

Importación de la canalización a Azure DevOps

  1. Abra el proyecto de Azure DevOps y vaya a la sección Azure Pipelines.

  2. Seleccione el botón Crear canalización.

  3. En la opción ¿Dónde está el código?, seleccione GitHub (YAML).

    ¿Dónde está el código?

  4. En este punto, es posible que deba autorizar a Azure DevOps para acceder a su organización. Para obtener más información sobre este tema, consulte el artículo Compilar repositorios de GitHub.

  5. En la lista de repositorios, seleccione la bifurcación del repositorio que creó en la organización de GitHub.

  6. En el paso Configure su canalización, elija iniciar desde una canalización YAML existente.

    Canalización YAML existente

  7. Cuando aparezca la página Select existing YAML pipeline (Seleccionar la canalización de YAML existente), especifique la rama master y escriba la ruta de acceso a la canalización YAML: samples/integration-testing/src/azure-pipeline.yaml.

    Selección de la canalización YAML existente

  8. Seleccione Continuar para cargar la canalización YAML de Azure desde GitHub.

  9. Cuando aparezca la página Revisar YAML de la canalización, seleccione Ejecutar para crear y desencadenar manualmente la canalización por primera vez.

    Ejecutar la canalización de Azure

Verificación de los resultados

También puede ejecutar la canalización manualmente desde la UI de Azure DevOps. Sin embargo, el objetivo del artículo es mostrar la integración continua automatizada. Para probar el proceso, confirme un cambio en la carpeta samples/integration-testing/src del repositorio bifurcado. El cambio desencadenará automáticamente una nueva canalización en la rama en la que va a insertar el código.

Canalización que se ejecuta desde GitHub

Una vez completado el paso, acceda a los detalles de Azure DevOps para asegurarse de que todo se ejecutó correctamente.

Canalización verde de Azure DevOps

Solución de problemas de Terraform en Azure

Solución de problemas comunes al usar Terraform en Azure

Pasos siguientes