Создание динамических/условных ресурсов Terraform

Я использую 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]
    }
}
[...]

Теперь я хочу добавить условное утверждение, что первые два рабочих получают назначенные графические процессоры. Итак, в псевдокоде Python sth. как

      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")
        }
    }
}

Я чувствую, что динамические блоки могут быть неправильным подходом, потому что они перебирают всех рабочих, но я также не заставил его работать с подходом условного оператора.

Любая помощь приветствуется - спасибо!

1 ответ

Это, безусловно, интересный случай, и да, я думаю, что динамический блок может делать то, что вам нужно, нам просто нужно условие, что-то вроде:

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

Ключ в этом коде:
count.index < 2 ? ["1"]: []

Просто условие на индекс, для 0 и 1 мы даем массив с одним элементом внутри, все остальное получает пустой массив, который должен миновать присваивание GPU.

Другие вопросы по тегам