从Terraform的列表中选择元素范围

时间:2018-07-29 18:15:30

标签: terraform

是否可以从Terraform的列表中选择一系列元素?

例如-如果我们有:

[a, bb, ccc, dddd, eeeee]

如何选择前三个元素?

a, bb, ccc

然后是第4和第5个元素?

dddd, eeeee

2 个答案:

答案 0 :(得分:2)

要查找的列表子集通常称为切片。 Terraform为此提供了一个内置功能,称为slice,自0.8.8版本开始可用。您正在寻找

slice(<put_reference_to_list_here, 0, 3)
slice(<put_reference_to_list_here, 3, 5)

从文档中:

  

slice(list,from,to)-返回介于from(包括)和to(不包括)之间的列表部分。

最显着的是sliceto参数很挑剔,该参数必须小于或等于列表的长度,否则TF会抱怨。 这些fromIndex,toIndex界面对我而言并不直观,因此我开始保留我(必须)使用的每种语言的代码片段。这是我的Terraform助手:

variable "mylist" { default = [ 101, 102, 103, 104, 105 ] }

locals{
    everything = "${slice(var.mylist, 0                   , length(var.mylist)  )}"
    butlast    = "${slice(var.mylist, 0                   , length(var.mylist)-1)}"
    thelast    = "${slice(var.mylist, length(var.mylist)-1, length(var.mylist)  )}"
  }


data "null_data_source" "slices" {
  inputs {
    everything = "${join(",",local.everything)}"
    butlast    = "${join(",",local.butlast)}"
    thelast    = "${join(",",local.thelast)}"
  }
}

output "slices" {
  value = "${data.null_data_source.slices.outputs}"
}

为您节省terraform init; terraform refresh的精力:

data.null_data_source.slices: Refreshing state...

Outputs:

slices = {
  butlast = 101,102,103,104
  everything = 101,102,103,104,105
  thelast = 105
}

答案 1 :(得分:0)

使用slice function。该页面描述了您可以使用的完整表达语言。

根据该列表的来源,您可能会发现将其拆分为源更加方便。例如,与其声明5个aws_instance资源,然后尝试以这种方式对它们的输出进行切片,不如分别有两个分别声明3个实例和2个实例的aws_instance声明,然后处理整个输出列表。