我开始将 Terraform (0.12) 与不同类型的服务器结合使用,每个服务器都与不同的映像相关联。我试图简单地输出所有私有 IP(在运行之前我不知道 IP 号码),但找不到一种简单的方法来做到这一点(我找到了一种更复杂的方法)。
我正在 scaleway 提供商上尝试 TF,并且我有一些像这样的服务器声明(简化)
# INPUT
variable "srv1" {
type = number
default = 0
}
variable "srv2" {
type = number
default = 0
}
# IMAGES
data "scaleway_instance_image" "srv1" {
name = "srv1"
}
data "scaleway_instance_image" "srv2" {
name = "srv2"
}
# SERVERS
resource "scaleway_instance_server" "srv1" {
name = "srv1_${count.index}"
image = data.scaleway_instance_image.srv1.id
count = var.srv1
}
resource "scaleway_instance_server" "srv2" {
name = "srv2_${count.index}"
image = data.scaleway_instance_image.srv2.id
count = var.srv2
}
要输出所有服务器的私有 IP,我这样做
# OUTPUT
output "srv1_private_ips" {
value = ["${scaleway_instance_server.srv1.*.private_ip}"]
}
output "srv2_private_ips" {
value = ["${scaleway_instance_server.srv2.*.private_ip}"]
}
它可以工作,但我需要output
为每种服务器类型创建一个部分。我希望有选项
- 循环遍历服务器类型列表并在一个输出中输出所有 IP。没有找到如何
- 仅输出
scaleway_instance_server.*.*.private_ip
除双通配符之外的所有内容似乎是不可能的
任何帮助均感激不尽。
答案1
您对“count”和 splat(“*”)语法的工作原理有些误解。使用 count,您将为服务器创建一个资源块,使用 count 来定义该实例将被复制多少次。因此:
resource "scaleway_instance_server" "srv" {
name = "srv_${count.index}"
image = data.scaleway_instance_image.srv1.id
count = 2
}
将创建两个资源:scaleway_instance_server.srv[0]
和scaleway_instance_server.srv[1]
。(是的,它们会有相同的image
- 这暗示这可能不是管理这个问题的最佳方式)
private_ip
输出所有服务器的属性列表变得非常简单:
output "srv_private_ips" {
value = scaleway_instance_server.srv[*].private_ip
}
注意:我从未在您给出的示例中使用过 scaleway 提供程序,因此我只是猜测该属性存在