我如何在 terraform 中设置 for_each 中的计数
How can i set a count in for_each in terraform
我正在通过构建模板来学习 Terraform,以在 hetzner 云中创建我的基础设施。为此,我正在使用 hcloud 提供商。
我创建了一个映射变量 hosts 以创建 >1 个具有不同配置的服务器。
variable "hosts" {
type = map(object({
name = string
serverType = string
serverImage = string
serverLocation = string
serverKeepDisk = bool
serverBackup = bool
ip = string
}))
}
这工作正常。但我还需要配置卷。我只需要 2 个服务器的额外卷,terraform 必须检查变量卷是否为真。如果为真,则应创建具有给定详细信息的新卷并将其附加到服务器。
为此,我编辑我的变量 hosts:
variable "hosts" {
type = map(object({
name = string
serverType = string
serverImage = string
serverLocation = string
serverKeepDisk = bool
serverBackup = bool
ip = string
volume = bool
volumeName = string
volumeSize = number
volumeFormat = string
volumeAutomount = bool
volumeDeleteProtection = bool
}))
}
在 main.tf 中,卷块看起来像这样,但它不起作用,因为 for_each 和计数不能一起使用。我怎样才能得到我要找的东西?这可能吗?
resource "hcloud_volume" "default" {
for_each = var.hosts
count = each.value.volume ? 1 : 0
name = each.value.volumeName
size = each.value.volumeSize
server_id = hcloud_server.default[each.key].id
automount = each.value.volumeAutomount
format = each.value.volumeFormat
delete_protection = each.value.volumeDeleteProtection
}
以前的迭代元参数 count
不会为您提供此处所需的功能,因为您需要在每个 var.hosts
迭代中访问 volume
bool 类型地图。为此,您可以在 for_each
元参数中的 for
表达式中添加条件。
for_each = { for host, values in var.hosts: host => values if values.volume }
这将为 for_each
元参数的值构造一个映射。它将包含 var.hosts
的每个键值对,其中 volume
对象键是 true
。
这似乎非常适合转换 list
和 map
类型并存在于许多其他类型中的 collect
或 map
方法或函数语言,但这些在 Terraform 中尚不存在。因此,我们使用 for
表达式等价的 lambda。
我正在通过构建模板来学习 Terraform,以在 hetzner 云中创建我的基础设施。为此,我正在使用 hcloud 提供商。
我创建了一个映射变量 hosts 以创建 >1 个具有不同配置的服务器。
variable "hosts" {
type = map(object({
name = string
serverType = string
serverImage = string
serverLocation = string
serverKeepDisk = bool
serverBackup = bool
ip = string
}))
}
这工作正常。但我还需要配置卷。我只需要 2 个服务器的额外卷,terraform 必须检查变量卷是否为真。如果为真,则应创建具有给定详细信息的新卷并将其附加到服务器。 为此,我编辑我的变量 hosts:
variable "hosts" {
type = map(object({
name = string
serverType = string
serverImage = string
serverLocation = string
serverKeepDisk = bool
serverBackup = bool
ip = string
volume = bool
volumeName = string
volumeSize = number
volumeFormat = string
volumeAutomount = bool
volumeDeleteProtection = bool
}))
}
在 main.tf 中,卷块看起来像这样,但它不起作用,因为 for_each 和计数不能一起使用。我怎样才能得到我要找的东西?这可能吗?
resource "hcloud_volume" "default" {
for_each = var.hosts
count = each.value.volume ? 1 : 0
name = each.value.volumeName
size = each.value.volumeSize
server_id = hcloud_server.default[each.key].id
automount = each.value.volumeAutomount
format = each.value.volumeFormat
delete_protection = each.value.volumeDeleteProtection
}
以前的迭代元参数 count
不会为您提供此处所需的功能,因为您需要在每个 var.hosts
迭代中访问 volume
bool 类型地图。为此,您可以在 for_each
元参数中的 for
表达式中添加条件。
for_each = { for host, values in var.hosts: host => values if values.volume }
这将为 for_each
元参数的值构造一个映射。它将包含 var.hosts
的每个键值对,其中 volume
对象键是 true
。
这似乎非常适合转换 list
和 map
类型并存在于许多其他类型中的 collect
或 map
方法或函数语言,但这些在 Terraform 中尚不存在。因此,我们使用 for
表达式等价的 lambda。