我正在使用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
}
答案 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