Terraform dynamic/conditional 资源创建

Terraform dynamic/conditional resource creation

我将 terraform 与 libvirt 提供程序一起使用,并使用以下代码段生成 4 个来宾(索引:0,1,2,3):

[...]
resource "libvirt_domain" "worker" {
    count   = var.worker["count"]
    name    = "${var.cluster_id}-worker-${count.index}"
    memory  = var.worker.memory
    vcpu    = var.worker.vcpu

    coreos_ignition = libvirt_ignition.worker[count.index].id

    disk {
        volume_id = libvirt_volume.worker[count.index].id
    }
    console {
        type        = "pty"
        target_port = 0
    }
    cpu = {
        mode = var.cpu_mode
    }
    network_interface {
        network_id  = var.network_id
        hostname    = "worker-${count.index}.${var.cluster_id}.${var.cluster_domain}"
        mac         = var.worker_macs[count.index]
    }
}
[...]

现在我想添加一个条件语句,即前两个工人获得 GPU 分配。 所以在python伪代码……喜欢

if ${count.index} == 0:
    # Add GPU 0 to worker ${count.index} (--> worker0)
elif ${count.index} == 1:
    # Add GPU 1 to worker ${count.index} (--> worker1)
else:
    # Don't assign a GPU to a worker

从 libvirt 提供程序文档中我看到我必须使用 XML 和 xslt,我已经用一个更简单的脚本检查过它并且可以工作。

现在我在这个更复杂的设置中使用条件语句和动态块尝试了它,但我无法让它工作。目前看起来像这样:

resource "libvirt_domain" "worker" {
    count   = var.worker["count"]
    name    = "${var.cluster_id}-worker-${count.index}"
    memory  = var.worker.memory
    vcpu    = var.worker.vcpu

    coreos_ignition = libvirt_ignition.worker[count.index].id

    disk {
        volume_id = libvirt_volume.worker[count.index].id
    }
    console {
        type        = "pty"
        target_port = 0
    }
    cpu = {
        mode = var.cpu_mode
    }
    network_interface {
        network_id  = var.network_id
        hostname    = "worker-${count.index}.${var.cluster_id}.${var.cluster_domain}"
        mac         = var.worker_macs[count.index]
    }

    dynamic "xml" {
        for_each = var.worker
        content {
            xslt = file("add_gpu_w${count.index}.xsl")
        }
    }
}

我觉得动态块可能是错误的方法,因为它循环遍历所有 worker,但我也没有让它与条件语句 appraoch 一起工作。

感谢任何帮助 - 谢谢!

这当然是一个有趣的案例,是的,我认为动态块可以满足您的需要,我们只需要一个条件,例如:

  dynamic "xml" {
    for_each = count.index < 2 ? ["1"]: []
    content {
      xslt = file("add_gpu_w${count.index}.xsl")
    }
  }

该代码的关键是:
count.index < 2 ? ["1"]: []

只是索引的一个条件,对于 0 和 1,我们给出一个包含一个元素的数组,其他所有内容都是一个空数组,这应该绕过 GPU 的分配。