Создание динамических/условных ресурсов 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.