我正在 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 会有所帮助。如有任何帮助,我们将不胜感激。
在您的情况下,您刚刚将 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