【问题标题】:How to fetch a value from list of maps in terraform 0.12 based on condition如何根据条件从 terraform 0.12 中的地图列表中获取值
【发布时间】:2019-12-20 19:04:09
【问题描述】:

我使用的是 Terraform 0.12。我有一个返回地图列表的数据源。这是一个例子:

[
  {
    "name": "abc"
    "id": "123"
  },
  {
    "name": "bcd"
    "id": "345"
  }
] 

如何遍历这个地图列表的数据源并查找是否存在键为“name”和值为“bcd”的地图?

这是我的数据源:

data "ibm_is_images" "custom_images" {}

locals {
  isexists = "return true/false based on above condition"
}

如果存在,我想创建计数为 0 的资源,否则为 1

resource "ibm_is_image" "my_image" {
  count = local.isexists == "true" ? 0 : 1
}

【问题讨论】:

    标签: terraform


    【解决方案1】:

    您可以使用contains function 检查是否在列表中找到值。

    所以现在您只需能够将映射列表转换为与name 键匹配的值列表。在 Terraform 0.12 中,您可以像这样使用 generalised splat operator

    variable "foo" {
      default = [
        {
          "name": "abc"
          "id": "123"
        },
        {
          "name": "bcd"
          "id": "345"
        }
      ]
    }
    
    output "names" {
      value = var.foo[*].name
    }
    

    应用它会产生以下输出:

    names = [
      "abc",
      "bcd",
    ]
    

    所以,结合这些我们可以做到:

    variable "foo" {
      default = [
        {
          "name": "abc"
          "id": "123"
        },
        {
          "name": "bcd"
          "id": "345"
        }
      ]
    }
    
    output "names" {
      value = var.foo[*].name
    }
    
    output "bcd_found" {
      value = contains(var.foo[*].name, "bcd")
    }
    
    output "xyz_found" {
      value = contains(var.foo[*].name, "xyz")
    }
    

    当它被应用时,我们得到以下结果:

    bcd_found = true
    names = [
      "abc",
      "bcd",
    ]
    xyz_found = false
    

    【讨论】:

    • 谢谢。这适用于单一条件。如果我想验证同一张地图是否包含名称“bcd”和 id 为“345”,则该程序可能无法运行。在这种情况下应该如何改变条件?
    • 您需要用 and 链接条件。如果您对此感到困惑,也许可以提出一个单独的问题,这样您的问题就会非常集中,并且对可能没有相同问题组合的其他人有用。
    • 这是答案:locals { isexists = contains([for x in foo: "true" if x.name == "bcd" && x.id == "345"], "true ") }
    【解决方案2】:

    如果要验证,如果同一个地图包含名称“bcd”和id为“345”,上述程序可能无法运行。在这种情况下,条件应更改为

     locals { 
    isexists = contains([for x in foo: "true" if x.name == "bcd" && x.id == "345"], "true") 
    }
    
    output "abc" {
    value="${local.isexists}"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2020-08-11
      • 1970-01-01
      • 2019-11-05
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多