将 terraform 输出从列表列表打印到字符串列表

问题描述 投票:0回答:1

我正在 AWS 上使用 terraform(v1.0.9) 作为基础设施即代码进行虚拟机部署。我有 Terraform output.tf 来打印两个 lan a ip 和代码打印,列表列表如 [["ip_a",],["ip_b",]] 但我想要一个像这样的列表 ["ip_a", "ip_b" ].

输出.tf代码

output "foo" {
  value = {
    name = "xyz"
    all_ips = tolist(aws_network_interface.vm_a_eni_lan_a.*.private_ips)
  }
}

印刷

“名称”=“xyz” “lan_a_ips”= 列表([ 设置([ “10.0.27.116”,]), 设置([ “10.0.28.201”,]), ])

但我想要

“lan_a_ips”= [“10.0.27.116”,“10.0.28.201”]

我相信调整output.tf 会有所帮助。如有任何帮助,我们将不胜感激。

amazon-web-services terraform terraform-provider-aws
1个回答
4
投票

在您的情况下,您刚刚将 splat 表达式 [1] 设置在错误的位置,即,您没有设置

aws_network_interface.vm_a_eni_lan_a.private_ips[*]
,而是将其设置为
aws_network_interface.vm_a_eni_lan_a.*.private_ips
。所以你只需要改变输出值:

output "foo" {
 value = {
  name = "xyz"
  all_ips = aws_network_interface.vm_a_eni_lan_a.private_ips[*]
 }
}

编辑:当仅创建

aws_network_interface
资源的单个实例时,上述内容适用。对于使用
count
元参数创建此资源的多个实例的情况,可以使用以下命令获取 IP 列表:

output "foo" {
  value = {
    name    = "xyz"
    all_ips = flatten([for i in aws_network_interface.test[*] : i.private_ips[*]])
  }
}

这里,

for
[2] 循环用于迭代资源的所有实例,因此在引用它们时使用 splat 表达式
aws_network_interface.test[*]
。此外,由于这将创建一个列表列表(因为
private_ips[*]
返回一个列表),因此
flatten
[3] 内置函数可用于创建单个 IP 地址列表。


[1] https://www.terraform.io/language/expressions/splat

[2] https://www.terraform.io/language/expressions/for

[3] https://www.terraform.io/language/functions/flatten

© www.soinside.com 2019 - 2024. All rights reserved.