【问题标题】:Terraform: Convert a list of maps into a revised list of mapsTerraform:将地图列表转换为修改后的地图列表
【发布时间】:2020-11-17 04:03:48
【问题描述】:

我的输入是:

input = [
  {
    x = "X1"
    y = "Y1"
  },
  {
    x = "X2"
    y = "Y2"
  },
  {
    x = "X3"
    y = "Y3"
  },
]

我想要的输出是:

output = [
  {
    val         = "X1",
    description = "This is a value of X"
  },
  {
    val         = "Y1",
    description = "This is a value of Y"
  },
  {
    val         = "X2",
    description = "This is a value of X"
  },
  {
    val         = "Y2",
    description = "This is a value of Y"
  },
  {
    val         = "X3",
    description = "This is a value of X"
  },
  {
    val         = "Y3",
    description = "This is a value of Y"
  },
]

如何在 Terraform 中实现这一点?

【问题讨论】:

    标签: arrays list dictionary object terraform


    【解决方案1】:

    为此,我可以在 terraform 中使用 flatten() 函数:

    flatten([
      for a_map in var.input : [
        { val = a_map.x, description = "This is a value of X" },
        { val = a_map.y, description = "This is a value of Y" },
      ]
    ])
    

    这种方法的一个优点是它会保持值的顺序。

    所以输出将是:

    [
      {
        "description" = "This is a value of X"
        "val" = "X1"
      },
      {
        "description" = "This is a value of Y"
        "val" = "Y1"
      },
      {
        "description" = "This is a value of X"
        "val" = "X2"
      },
      {
        "description" = "This is a value of Y"
        "val" = "Y2"
      },
      {
        "description" = "This is a value of X"
        "val" = "X3"
      },
      {
        "description" = "This is a value of Y"
        "val" = "Y3"
      },
    ]
    

    【讨论】:

    • 这样做的方式很好。
    【解决方案2】:

    以下产生这样的输出:

    
    
    variable "input" {
    
      default = [
        {
          x = "X1"
          y = "Y1"
        },
        {
          x = "X2"
          y = "Y2"
        },
        {
          x = "X3"
          y = "Y3"
        },
      ]
    
    }
    
    
    
    locals  {
      part1 = [for v in var.input:
          {
            "val" = v.x,
            "description" = "This is a value of X"
          }]
          
      part2 = [for v in var.input:
          {
            "val" = v.y,
            "description" = "This is a value of Y"
          }]      
    }
    
    
    
    output "output" {
    
      value = concat(local.part1, local.part2)
    
    }
    

    我的测试输出:

    utput = [
      {
        "description" = "This is a value of X"
        "val" = "X1"
      },
      {
        "description" = "This is a value of X"
        "val" = "X2"
      },
      {
        "description" = "This is a value of X"
        "val" = "X3"
      },
      {
        "description" = "This is a value of Y"
        "val" = "Y1"
      },
      {
        "description" = "This is a value of Y"
        "val" = "Y2"
      },
      {
        "description" = "This is a value of Y"
        "val" = "Y3"
      },
    ]
    
    

    【讨论】:

    • 这会正确生成地图项。但它不保持数组项的相同顺序。
    • @Rakib 没问题。这个问题并没有说订购有任何问题。但无论如何,谢谢你让我知道。我看到你找到了答案:-)
    • 问题中提到了数组作为所需的输出。在数组中,索引是它的一部分:)
    • @Rakib 很公平。
    猜你喜欢
    • 2019-06-09
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多