我如何在 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

这似乎非常适合转换 listmap 类型并存在于许多其他类型中的 collectmap 方法或函数语言,但这些在 Terraform 中尚不存在。因此,我们使用 for 表达式等价的 lambda。