es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Terraform ignora la bandera de paralelismo cuando se ejecuta a través de Jenkins.

Estoy ejecutando un trabajo de Terraform utilizando la tubería de Jenkins. La actualización de Terraform está tardando demasiado tiempo, alrededor de 10 minutos, pero utilizando -parallelism=60 (local)Terraform se ejecuta mucho más rápido, en aproximadamente 2.5 minutos.
Cuando ejecuto la misma configuración a través de un esclavo de Jenkins con paralelismo, no veo ninguna mejora en el tiempo de ejecución.

Jenkins ver. 2.154

Plugin de Docker de Jenkins 1.1.6

Plugin de Agente SSH 1.19

Flujo: El maestro de Jenkins crea el trabajo -> Jenkins esclavo ejecutando la imagen de Docker de Terraform

def terraformRun(String envName, String terraformAction, String dirName = 'env') {
    sshagent(['xxxxxxx-xxx-xxx-xxx-xxxxxxxx']) {
        withEnv(["ENVNAME=${envName}", "TERRAFORMACTION=${terraformAction}", "DIRNAME=${dirName}"]) {
            sh '''
                #!/bin/bash
                set -e
                ssh-keyscan -H "bitbucket.org" >> ~/.ssh/knownhosts
                AUTOAPPROVE=""
                echo terraform "${TERRAFORMACTION}" en "${ENVNAME}"
                cd "${DIRNAME}"
                export TFWORKSPACE="${ENVNAME}"
                echo "terraform init"
                terraform init -input=false

                echo "terraform refresh"
                terraform apply -refresh-only -auto-approve -parallelism=60 -var-file=tfvars/"${ENVNAME}".tfvars -var-file=../variables.tfvars # Refresh está funcionando pero parece ignorar el paralelismo

                echo "terraform ${TERRAFORMACTION}"
                if [ ${TERRAFORMACTION} = "apply" ]; then
                    AUTOAPPROVE="-auto-approve"
                fi

                terraform ${TERRAFORMACTION} -refresh=false -var-file=tfvars/"${ENVNAME}".tfvars -var-file=../variables.tfvars ${AUTOAPPROVE}

                echo "terraform ${TERRAFORMACTION} en ${ENVNAME} finalizó exitosamente."
            '''
        }
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Posible solución para una actualización lenta de Terraform al ejecutar una tubería de Jenkins:

    1. Verificar si la máquina esclava de Jenkins tiene suficientes recursos (CPU, RAM) para manejar comandos paralelos de Terraform.

    2. Considerar el uso de una imagen Docker diferente para Terraform que pueda estar más optimizada para el paralelismo, o ejecutar el script de instalación de Terraform durante la ejecución de la tubería de Jenkins.

    3. Modificar el comando de Terraform para limitar el número de paralelismos al número de CPUs disponibles en la máquina esclava de Jenkins. Un paralelismo de 60 puede ser demasiado alto para algunos entornos.

    4. Intentar usar la bandera -parallelism durante el comando terraform init para ver si acelera el comando posterior terraform apply -refresh-only.

    5. Ejecutar el comando terraform apply -refresh-only localmente y comparar los resultados con los de la máquina esclava para ver si hay diferencias en el tiempo de ejecución.

    6. Verificar si los archivos de estado de Terraform se almacenan de forma remota y si se puede usar un estado remoto para evitar tiempos de actualización largos.

    7. Considerar la posibilidad de almacenar en caché los archivos de Terraform con una herramienta como Artifactory o Nexus para mejorar la velocidad de las compilaciones de Jenkins.

Comments are closed.