【问题标题】:Retrieving elements from a list of objects based on a criteria根据条件从对象列表中检索元素
【发布时间】:2022-09-26 04:30:44
【问题描述】:

我有返回包含idnametype 的对象列表的数据源。

data \" data_source\" \"some_source\" {
  filter = [\"env:a\"]
  ...
}

我有另一个 resource 需要一组 ID

resource \"another_rerouce\" \"bar\" {
...
set_of_ids = [for i in data.data_source.some_source.objects : i.id]
...
} 

现在我需要的只是获取对象的 ID,例如类型livepending 等。有没有办法可以在[for i in data.data_source.some_source.objects : i.id] 中加入这个要求?

我正在使用 Terraform v1.2.3。

  • 是的,在 for 循环中有一个 if,但是有一个真实的例子会很有帮助。但是,例如,它可能是[for i in data.data_source.some_source.objects : i.id if i.type == \"live\"]
  • @MarkoE 添加运算符+条件 || i.type = \"pending\" 并且相当肯定您回答了这个问题。
  • 啊,是的,我不确定是否需要逻辑or,因为它似乎可以是两个以上不同的值?你怎么看?顺便说一句,感谢您添加该部分。
  • @Maven 会有两个以上的值,即livepending

标签: terraform


【解决方案1】:

我想说答案会有所不同,具体取决于您要检查的值的数量,即,如果它只有 livepending,您可以使用 cmets 建议的解决方案(h/t:Matt Schuchard ):

set_of_ids = [ for i in data.data_source.some_source.objects : 
  i.id if (i.type == "live" || i.type == "pending")
]

或者,如果有两个以上的值,您可以创建一个 list(string) 类型的局部变量并分配所有可接受的值:

locals {
  acceptable_types = ["live", "pending"]
}

然后,在for 循环中,您可以执行以下操作:

set_of_ids = [ for i in data.data_source.some_source.objects : 
  i.id if contains(local.acceptable_types, i.type) 
]

在这里,您将使用 contains 内置函数 [1] 来检查 type 是否在可接受/允许的类型列表中。


[1]https://www.terraform.io/language/functions/contains

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多