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

print terraform output from list of list to a list of strings

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

output.tf代码

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

正在打印 --> "name" = "xyz" "lan_a_ips" = tolist(\[ toset(\[ "10.0.27.116",\]), toset(\[ "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 meta-argument 创建此资源的多个实例的情况,可以使用以下方法获取 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[*] returns 列表),flatten [3] built-in 函数可用于创建单个 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