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, cómo llamar 100 veces un módulo con valores separados.

Tengo un problema con la configuración de Terraform que realmente no sé cómo resolver. He escrito un módulo para asignaciones de políticas, el módulo toma un objeto con 5 atributos como parámetros. La pregunta es si es posible dividir el archivo tfvars en una estructura de carpeta. Me refiero a, por ejemplo, tener una carpeta principal de suscripciones -> carpeta nombre_suscripción -> varios archivos tfvars con la configuración para cada asignación de política.

Ejemplo de cada archivo:

testmap = {
var1 = "test1"
var2 = "test2"
var3 = "test3"
var4 = "test4"
var5 = "test5"
}

En el módulo, me gustaría iterar sobre todos los mapas y combinarlos en una lista de mapas. ¿Es un buen enfoque? ¿Cómo lograrlo o tal vez debería usar algo diferente como Terragrunt?
Por favor, dame algunos consejos sobre la mejor manera de lograr esto. Básicamente, el objetivo es no tener un archivo tfvars extremadamente grande con una lista de 100 mapas, sino dividirlo en 100 archivos de configuración para cada asignación.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible dividir el archivo tfvars en una estructura de carpetas. Enfoque que se conoce como “diseño de directorio” y es una forma común de organizar el código de Terraform. Ayuda a mantener las cosas organizadas y facilita su gestión en proyectos más grandes.

    Para lograr lo que describiste, puedes crear una carpeta para cada asignación de política y, dentro de cada carpeta, crear un archivo tfvars con la configuración para esa asignación de política. Por ejemplo:

    subscriptions/
        carpeta1/
            policy1.tfvars
            policy2.tfvars
            ...
        carpeta2/
            policy1.tfvars
            policy2.tfvars
            ...
    

    Luego, en tu módulo, puedes utilizar el origen de datos terraform_remote_state para leer las variables de cada archivo tfvars. Puedes iterar sobre todos los directorios y archivos utilizando las funciones for_each y fileset.

    Para combinar todos los mapas en una lista de mapas, puedes utilizar la función flatten del módulo terraform. Por ejemplo:

    variable "policy_configs" {
      type    = list(map(string))
      default = flatten([
        for dir in listdir("${path.module}/../subscriptions"):
          for file in fileset("${path.module}/../subscriptions/${dir}", "*.tfvars"):
            var.file_content
      ])
    }
    
    locals {
      policy_configs_map = { for pc in var.policy_configs : pc.var1 => pc }
    }
    
    module "mi_modulo" {
      for_each = local.policy_configs_map
    
      ...
    
      var1 = each.value.var1
      var2 = each.value.var2
      var3 = each.value.var3
      var4 = each.value.var4
      var5 = each.value.var5
    
      ...
    }
    

    Esto creará una lista de mapas que puedes pasar a tu módulo como una variable. La función flatten concatenará todos los mapas en una sola lista, y el bucle for los convertirá en un mapa con el atributo var1 como clave.

    En general, este enfoque debería funcionar bien para lograr tu objetivo de dividir el archivo tfvars en múltiples archivos de configuración para cada asignación de política.

Comments are closed.