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

Mal*_*amy 4 terraform

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

[
  {
    "name": "abc"
    "id": "123"
  },
  {
    "name": "bcd"
    "id": "345"
  }
] 
Run Code Online (Sandbox Code Playgroud)

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

这是我的数据源:

data "ibm_is_images" "custom_images" {}

locals {
  isexists = "return true/false based on above condition"
}
Run Code Online (Sandbox Code Playgroud)

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

resource "ibm_is_image" "my_image" {
  count = local.isexists == "true" ? 0 : 1
}
Run Code Online (Sandbox Code Playgroud)

yda*_*coR 7

您可以使用该contains函数来检查是否在列表中找到了某个值。

所以现在您只需要能够将您的地图列表转换为与name键匹配的值列表。在 Terraform 0.12 中,您可以像这样使用广义 splat 运算符

variable "foo" {
  default = [
    {
      "name": "abc"
      "id": "123"
    },
    {
      "name": "bcd"
      "id": "345"
    }
  ]
}

output "names" {
  value = var.foo[*].name
}
Run Code Online (Sandbox Code Playgroud)

应用它会得到以下输出:

names = [
  "abc",
  "bcd",
]
Run Code Online (Sandbox Code Playgroud)

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

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")
}
Run Code Online (Sandbox Code Playgroud)

应用此方法后,我们将得到以下结果:

bcd_found = true
names = [
  "abc",
  "bcd",
]
xyz_found = false
Run Code Online (Sandbox Code Playgroud)