Creación dinámica/condicional de recursos de Terraform
Estoy usando Terraform con el proveedor libvirt y generando 4 invitados (índice: 0,1,2,3) usando este fragmento:
[...]
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")
}
}
}
[...]
Ahora quiero agregar una declaración condicional, que los primeros dos trabajadores obtienen asignadas GPUs.
Entonces en código Python pseudo algo así como:
if ${count.index} == 0:
# Agregar GPU 0 a trabajador ${count.index} (--> trabajador 0)
elif ${count.index} == 1:
# Agregar GPU 1 a trabajador ${count.index} (--> trabajador 1)
else:
# No asignar una GPU a un trabajador
Desde la documentación del proveedor libvirt, vi que tengo que usar XML y XSLT, lo cual ya verifiqué con un script más simple y eso funciona.
Ahora lo intenté en esta configuración más compleja con declaraciones condicionales, así como bloques dinámicos, pero no puedo hacer que funcione. Actualmente se ve así:
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")
}
}
}
Siento que los bloques dinámicos podrían ser el enfoque incorrecto porque está iterando a través de todos los trabajadores, pero tampoco lo conseguí con el enfoque de la declaración condicional.
Cualquier ayuda es apreciada, ¡gracias!
davy.ai
Para agregar una declaración condicional para asignar GPUs a los primeros dos trabajadores, se puede utilizar el enfoque de bloque dinámico con expresiones condicionales en el bucle for_each. Aquí hay un ejemplo de fragmento de código:
En este fragmento de código, utilizamos la función de rango para generar una lista cuya longitud es
var.trabajador["cuenta"]
. Utilizamos esta lista como entrada para el argumentofor_each
del bloque dinámico.Dentro del bloque dinámico, utilizamos el objeto
each
para acceder a la variable de bucle (key
) y el valor de bucle (value
), que en este caso no se utiliza.Utilizamos
each.key
como índice de trabajador para determinar si el trabajador debe recibir una asignación de GPU. El bloqueargumentos
se utiliza para pasar la variableindice_gpu
a la plantilla XSLT (add_gpu_worker.xml
).Dentro de la plantilla XSLT, se puede usar lógica condicional para generar el documento XML que agrega o no agrega un dispositivo GPU al trabajador. Aquí hay una plantilla XSLT de ejemplo:
Esta plantilla agrega un nodo de dispositivo GPU al XML de dominio solo si el parámetro
indice_gpu
es mayor o igual a 0. La funciónformat
se utiliza para formatear la dirección PCI del dispositivo GPU.Asegúrese de actualizar la variable
var.directorio_de_plantillas_xml
a la ruta del directorio que contiene el archivo de plantilla XSLT (add_gpu_worker.xml
).