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 的分配。
我将 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 的分配。