如何使用 Terraform 0.11 访问包含地图的列表列表?



我有几个 EKS 节点组。我正在尝试访问所有节点组的autoscaling_groupsname(例如name = eks-e214c586716a(。在 0.12 中要容易得多,但我们仍在使用 0.11。

[
[
{
"autoscaling_groups" = [
{
"name" = "eks-e214c586716a"
},
]
"remote_access_security_group_id" = "sg-name1"
},
],
[
{
"autoscaling_groups" = [
{
"name" = "eks-c866f3f2edb5"
},
]
"remote_access_security_group_id" = "sg-name2"
},
],
]

这有效:aws_eks_node_group.node-group.resources.0.autoscaling_groups.0.name

但是,当我迭代时,我没有成功。

count = "${length(var.nodegroups)}"
autoscaling_group_name    = "${element(aws_eks_node_group.node-group.resources.*.autoscaling_groups.*.name, count.index)}"

看起来你误读了那里的复杂数据结构。

您有一个节点组列表,而节点组又包含另一个列表,该列表始终具有一个元素,该元素是具有键autoscaling_groupsremote_access_security_group_id的对象。然后,autoscaling_groups键也是另一个列表,其中包含一个元素,该元素包含一个键name的对象。

您尝试这样做是使用:

"${element(aws_eks_node_group.node-group.resources.*.autoscaling_groups.*.name, count.index)}"

也就是说,循环访问最外层的列表,然后尝试从那里的对象获取autoscaling_groups键,此时它是一个包含 1 个元素的列表。然后,您还尝试遍历最内部的列表,该列表只有一个元素,因此如果您使用:

"${element(aws_eks_node_group.node-group.resources.*.*.autoscaling_groups.*.name, count.index)}"

由于element允许环绕,因此在尝试访问 1 元素列表的第二个元素时,您不会在此处获得越界索引,但是 Terraform 不允许您使用嵌套的 splat 表达式:

Error: Nested splat expression not allowed
on main.tf line 33, in resource "local_file" "asg_names":
33:   content  = "${element(local.eks_node_group.*.*.autoscaling_groups.*.name, count.index)}"
A splat expression (*) cannot be used inside another attribute-only splat
expression.

因此,若要获取自动缩放组名称,要遍历最外层的列表,然后获取该列表的第一个元素,获取autoscaling_groups键,获取该列表的第一个元素,最后从name键获取值。

下面是访问此数据结构的基本工作示例,使用局部变量作为输入,使用local_file资源作为输出,以允许我们使用count循环它:

locals {
eks_node_group = [
[
{
"autoscaling_groups" = [
{
"name" = "eks-e214c586716a"
},
]
"remote_access_security_group_id" = "sg-name1"
},
],
[
{
"autoscaling_groups" = [
{
"name" = "eks-c866f3f2edb5"
},
]
"remote_access_security_group_id" = "sg-name2"
},
],
]
}
resource "local_file" "asg_names" {
count    = "${length(local.eks_node_group)}"
filename = "${count.index}.output"
content  = "${element(local.eks_node_group.*.0.autoscaling_groups.0.name, count.index)}"
}

运行计划将显示以下预期输出:

# local_file.asg_names[0] will be created
+ resource "local_file" "asg_names" {
+ content              = "eks-e214c586716a"
+ directory_permission = "0777"
+ file_permission      = "0777"
+ filename             = "0.output"
+ id                   = (known after apply)
}
# local_file.asg_names[1] will be created
+ resource "local_file" "asg_names" {
+ content              = "eks-c866f3f2edb5"
+ directory_permission = "0777"
+ file_permission      = "0777"
+ filename             = "1.output"
+ id                   = (known after apply)
}

请注意,除非你想要如上所述的element的环绕功能,否则你实际上应该使用更直接的索引语法,如list[index]

resource "local_file" "asg_names" {
count    = "${length(local.eks_node_group)}"
filename = "${count.index}.output"
content  = "${local.eks_node_group[count.index].0.autoscaling_groups.0.name}"
}

相关内容

  • 没有找到相关文章

最新更新