如何根据条件从Terraform 0.12中的地图列表中获取值

时间:2019-12-18 17:35:03

标签: terraform

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

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

如何遍历此地图列表的数据源并查找是否存在具有键“名称”和值“ 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
}

2 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:0)

如果要验证,如果同一映射包含名称“ bcd”和ID为“ 345”,则上述程序可能无法正常工作。在这种情况下,应将条件更改为

git push origin master