List Terraform-将列表列表转换为新列表
在Terraform中,我需要转换输入数据结构,例如:List Terraform-将列表列表转换为新列表,list,terraform,transform,hcl,List,Terraform,Transform,Hcl,在Terraform中,我需要转换输入数据结构,例如: vip_lists = [ ["1.0.1.1", "1.0.1.2", "1.0.1.3", "1.0.1.4"] ["1.0.2.1", "1.0.2.2", "1.0.2.3", "1.0.2.4"] ["1.0.0.1", &quo
vip_lists = [
["1.0.1.1", "1.0.1.2", "1.0.1.3", "1.0.1.4"]
["1.0.2.1", "1.0.2.2", "1.0.2.3", "1.0.2.4"]
["1.0.0.1", "1.0.0.2", "1.0.0.3", "1.0.0.4"]
]
要产生如下输出:
vip_sets = [
["1.0.1.1", "1.0.2.1", "1.0.0.1"]
["1.0.1.2", "1.0.2.2", "1.0.0.2"]
["1.0.1.3", "1.0.2.3", "1.0.0.3"]
["1.0.1.4", "1.0.2.4", "1.0.0.4"]
]
因此,本质上,我需要获取列表的输入列表,并创建一个输出,该输出同样是列表列表的列表,但其第0个列表是输入中每个列表的第0个元素的列表……然后第1个列表也是如此,以此类推。
我无法预先知道输入中会有多少个列表,或者它们会有多长,但是如果有帮助的话,我们可以假设这些列表都是相同的长度
我已经尝试了几乎所有我能想到的东西,并在网上搜索过,但从那以后就没有运气了。欢迎提出所有建议 这有点可怕,但它可以工作(尽管我还没有测试如果
vip\u列表
为空,它会做什么。可能会崩溃,因为我正在索引vip\u列表[0]
,而没有检查):
我曾经为一个模块编写过这个版本的列表,这些列表的长度不同,我们在其中使用了这样的转换,使用
count
创建了二维资源集。(当我们将它们转换为地图以与每个的ressource level一起使用时,它们没有在atm中使用)
它可以处理动态列表大小,并以压缩或填充null
值的方式输出:
Outputs:
compact = [
[ "1.0.1.1", "1.0.2.1", "1.0.0.1" ],
[ "1.0.1.4", "1.0.2.2", "1.0.0.3" ],
[ "1.0.2.3", "1.0.0.4" ],
[ "1.0.2.4" ],
]
matrix = [
[ "1.0.1.1", "1.0.2.1", "1.0.0.1" ],
[ "1.0.1.4", "1.0.2.2", "1.0.0.3" ],
[ null, "1.0.2.3", "1.0.0.4" ],
[ null, "1.0.2.4", null ],
]
我知道答案已经被接受了,但也许有些人仍然可以使用这个动态版本。太好了,非常感谢@carr0t,我真的很感激
$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
vip_sets = [
[
"1.0.1.1",
"1.0.2.1",
"1.0.0.1",
],
[
"1.0.1.2",
"1.0.2.2",
"1.0.0.2",
],
[
"1.0.1.3",
"1.0.2.3",
"1.0.0.3",
],
[
"1.0.1.4",
"1.0.2.4",
"1.0.0.4",
],
]
locals {
matrix = [
["1.0.1.1", "1.0.1.4"],
["1.0.2.1", "1.0.2.2", "1.0.2.3", "1.0.2.4"],
["1.0.0.1", "1.0.0.3", "1.0.0.4"]
]
row_lengths = [
for row in local.matrix : length(row)
]
max_row_length = max(0, local.row_lengths...)
output = [
for i in range(0, local.max_row_length) : [
for j, _ in local.matrix : try(local.matrix[j][i], null)
]
]
output_compact = [
for i in range(0, local.max_row_length) : compact([
for j, _ in local.matrix : try(local.matrix[j][i], null)
])
]
}
output "matrix" {
value = local.output
}
output "compact" {
value = local.output_compact
}
Outputs:
compact = [
[ "1.0.1.1", "1.0.2.1", "1.0.0.1" ],
[ "1.0.1.4", "1.0.2.2", "1.0.0.3" ],
[ "1.0.2.3", "1.0.0.4" ],
[ "1.0.2.4" ],
]
matrix = [
[ "1.0.1.1", "1.0.2.1", "1.0.0.1" ],
[ "1.0.1.4", "1.0.2.2", "1.0.0.3" ],
[ null, "1.0.2.3", "1.0.0.4" ],
[ null, "1.0.2.4", null ],
]