Terraform 如何将地图列表合并到单个地图中而不覆盖重复键的值

问题描述 投票:0回答:1

我有以下输入作为存在重复键的地图列表。我想将这些映射合并到一个映射中,其中对于每个重复的键,将附加值而不是用最新值替换。

输入:

input_maps = [
    {
        “e-p”: {
             "a-emea": {
                "[email protected]": {
                    "role": "READER"
                 }
              }
             "c-emea": {
                 "[email protected]": {
                    "role": "READER"
                  }
              }
        }
        “g-p”: {
            "a-global": {
                "[email protected]": {
                    "role": "READER"
                 }
             }
         }
    },
   {},
   {
        “g-p”: {
            “a-global": {
                "[email protected]": {
                    "role": "READER"
                 }
             }
            “d-global": {
                "[email protected]": {
                    "role": "READER"
                }
             }
         }
        “u-p”: {
            “a-us": {
                "[email protected]": {
                    "role": "READER"
                }
            }
         }
  
    },
]

输出:

output_maps = {
    “e-p”: {
        "a-emea": {
            "[email protected]": {
                "role": "READER"
             }
         }
         "c-emea": {
             "[email protected]": {
                 "role": "READER"
              }
          }
        }
    “g-p”: {
        "a-global": {
            "[email protected]": {
                "role": "READER"
             }
            "[email protected]": {
                "role": "READER"
            }
         }
        “d-global": {
            "[email protected]": {
                "role": "READER"
            }
        }
     }
    “u-p”: {
        “a-us": {
            "[email protected]": {
                "role": "READER"
            }
        }
    }
  }

我尝试过以下代码:

output_maps = merge([
    for input_map in local.input_maps:{
        for key, value in input_map => {
            for sub_key, sub_value in value : sub_key => sub_value
            }
        }
    ]...)  

此代码替换值,而不是合并键的值(例如键“g-p”)。我尝试了各种方法,但无法使深度合并起作用。

list dictionary merge terraform
1个回答
0
投票

工作示例:

locals {
  input_maps = [
    {
      "e-p" : {
        "a-emea" : {
          "[email protected]" : {
            "role" : "READER"
          }
        }
        "c-emea" : {
          "[email protected]" : {
            "role" : "READER"
          }
        }
      }
      "g-p" : {
        "a-global" : {
          "[email protected]" : {
            "role" : "READER"
          }
        }
      }
    },
    {},
    {
      "g-p" : {
        "a-global" : {
          "[email protected]" : {
            "role" : "READER"
          }
        }
        "d-global" : {
          "[email protected]" : {
            "role" : "READER"
          }
        }
      }
      "u-p" : {
        "a-us" : {
          "[email protected]" : {
            "role" : "READER"
          }
        }
      }
    }
  ]

  # Flatten the input maps into a list of maps
  # Each map contains the map_key, zone_key, and roles
  flatten_maps = flatten([
    for _, input_map in local.input_maps : [
      for map_key, zones in input_map : [
        for zone_key, roles in zones : {
          map_key  = map_key,
          zone_key = zone_key,
          value    = roles
        }
      ]
    ]
  ])

  # Merge the maps into a single map
  # Key consists of the map_key and zone_key
  # Value consists of roles grouped by zone_key and map_key
  merged_maps = {
    for map in local.flatten_maps :
    "${map.map_key}|${map.zone_key}" => map.value...
  }

  # Output the merged maps
  output_maps = merge([
    for _, input_map in local.input_maps : {
      for map_key, zones in input_map : map_key => {
        for zone_key, roles in zones : zone_key =>
        local.merged_maps["${map_key}|${zone_key}"]
      }
    }
  ]...)
}

output "flatten_maps" {
  value = local.flatten_maps
}

output "merged_maps" {
  value = local.merged_maps
}

output "output_maps" {
  value = local.output_maps
}

跑步

terraform plan

Changes to Outputs:
  + flatten_maps = [
      + {
          + map_key  = "e-p"
          + value    = {
              + "[email protected]" = {
                  + role = "READER"
                }
            }
          + zone_key = "a-emea"
        },
      + {
          + map_key  = "e-p"
          + value    = {
              + "[email protected]" = {
                  + role = "READER"
                }
            }
          + zone_key = "c-emea"
        },
      + {
          + map_key  = "g-p"
          + value    = {
              + "[email protected]" = {
                  + role = "READER"
                }
            }
          + zone_key = "a-global"
        },
      + {
          + map_key  = "g-p"
          + value    = {
              + "[email protected]" = {
                  + role = "READER"
                }
            }
          + zone_key = "a-global"
        },
      + {
          + map_key  = "g-p"
          + value    = {
              + "[email protected]" = {
                  + role = "READER"
                }
            }
          + zone_key = "d-global"
        },
      + {
          + map_key  = "u-p"
          + value    = {
              + "[email protected]" = {
                  + role = "READER"
                }
            }
          + zone_key = "a-us"
        },
    ]
  + merged_maps  = {
      + "e-p|a-emea"   = [
          + {
              + "[email protected]" = {
                  + role = "READER"
                }
            },
        ]
      + "e-p|c-emea"   = [
          + {
              + "[email protected]" = {
                  + role = "READER"
                }
            },
        ]
      + "g-p|a-global" = [
          + {
              + "[email protected]" = {
                  + role = "READER"
                }
            },
          + {
              + "[email protected]" = {
                  + role = "READER"
                }
            },
        ]
      + "g-p|d-global" = [
          + {
              + "[email protected]" = {
                  + role = "READER"
                }
            },
        ]
      + "u-p|a-us"     = [
          + {
              + "[email protected]" = {
                  + role = "READER"
                }
            },
        ]
    }
  + output_maps  = {
      + e-p = {
          + a-emea = [
              + {
                  + "[email protected]" = {
                      + role = "READER"
                    }
                },
            ]
          + c-emea = [
              + {
                  + "[email protected]" = {
                      + role = "READER"
                    }
                },
            ]
        }
      + g-p = {
          + a-global = [
              + {
                  + "[email protected]" = {
                      + role = "READER"
                    }
                },
              + {
                  + "[email protected]" = {
                      + role = "READER"
                    }
                },
            ]
          + d-global = [
              + {
                  + "[email protected]" = {
                      + role = "READER"
                    }
                },
            ]
        }
      + u-p = {
          + a-us = [
              + {
                  + "[email protected]" = {
                      + role = "READER"
                    }
                },
            ]
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.