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.

Fusionar lista de objetos con valor común en Terraform.

Tengo la siguiente lista de objetos:

variable “accounts” {
default =[{
hub = “54326543266”
ou_name = “test1”
spoke = “76547654765”
vpc_cidr = “10.13.0.0/16”
},
{
hub = “54326543266”
ou_name = “test1”
spoke = “563904425760”
vpc_cidr = “10.14.0.0/16”
},
{
hub = “54387632457”
ou_name = “test2”
spoke = “934960631748”
vpc_cidr = “10.13.0.0/16”
},
{
hub = “54387632457”
ou_name = “test2”
spoke = “43892321454”
vpc_cidr = “10.14.0.0/16”
}
]
}

Quiero obtener una lista de objetos que fusiona los objetos con el mismo “hub” y “ou_name” con el siguiente formato:

     [{
          hub      = "54326543266"
          ou_name  = "test1"
          spokes    = [ 
             { spoke = "76547654765", vpc_cidr = "10.13.0.0/16" },
             { spoke = "563904425760", vpc_cidr = "10.14.0.0/16" }
        },
       {
          hub      = "54387632457"
          ou_name  = "test2"
          spokes    = [ 
             { spoke = "934960631748", vpc_cidr = "10.13.0.0/16" },
             { spoke = "43892321454", vpc_cidr = "10.14.0.0/16" }
        }
     ]
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para fusionar los objetos con el mismo hub y ou_name, puedes utilizar el siguiente código de Terraform:

    locals {
      merged_accounts = {}
    }
    
    foreach var.accounts as account {
      if contains(keys(local.merged_accounts), "${account.hub}-${account.ou_name}") {
        local.merged_accounts["${account.hub}-${account.ou_name}"].spokes = concat(local.merged_accounts["${account.hub}-${account.ou_name}"].spokes, [{
          spoke    = account.spoke
          vpc_cidr = account.vpc_cidr
        }])
      } else {
        local.merged_accounts["${account.hub}-${account.ou_name}"] = {
          hub     = account.hub
          ou_name = account.ou_name
          spokes  = [{
            spoke    = account.spoke
            vpc_cidr = account.vpc_cidr
          }]
        }
      }
    }
    
    output "merged_accounts" {
      value = values(local.merged_accounts)
    }
    

    En este código, creamos una variable local merged_accounts que es un mapa que almacenará las cuentas fusionadas. Luego recorremos cada cuenta y verificamos si ya tenemos una entrada en merged_accounts con el mismo hub y ou_name. Si es así, agregamos los valores de spoke y vpc_cidr de la cuenta actual a la lista spokes existente. Si todavía no tenemos una entrada, creamos una nueva entrada con los valores de hub, ou_name, spoke y vpc_cidr actuales.

    Finalmente, mostramos el mapa merged_accounts como una lista utilizando la función values().

    El resultado de este código debería ser una lista de objetos con el formato que estás buscando, con las cuentas fusionadas por hub y ou_name.

Comments are closed.