Terraform -如何使用导出的属性?



我正在学习terraform,在下面的示例中,第一部分放置一个VM并返回该VM的id。第二部分为虚拟机增加磁盘。我必须在virtual_machine_id参数中输入一个id,但我不知道如何(cloudstack_instance.worker[$name])。我不工作)。有人能给点提示吗?

resource "cloudstack_instance" "worker" {
for_each = {
for name, machine in var.machines :
name => machine
if machine.node_type == "worker"
}
name = "${var.prefix}-${each.key}"
service_offering = "K8S-RBD"
network_id = var.network_id
template = var.template_id
zone = var.zone
project = var.project_id
expunge = true
group = var.prefix
keypair = var.keypair
tags = {
name = "Terraform-VM"
}
}
resource "cloudstack_disk" "worker" {
for_each = {
for name, machine in var.machines :
name => machine
if machine.node_type == "worker"
}
name = "${var.prefix}-${each.key}"
attach = "true"
disk_offering = "Custom-RBD"
size = 50
virtual_machine_id = cloudstack_instance.worker[$name].id
zone = var.zone
project = var.project_id
depends_on = [cloudstack_instance.worker]
}

cloudstack_instance的输出可以包含多个元素。如果有多个输出,则需要一些逻辑。但是对于这个用例,我们假设cloudstack_instance的输出是1个元素。

试试这个:

virtual_machine_id = join(", ", cloudstack_instance.worker.*.id)

从您的配置来看,您的意图似乎是在每个虚拟机声明一个磁盘,每个磁盘连接到相应的虚拟机。

这种情况是在资源之间链接for_each的一个很好的用途,这意味着将上游资源直接用作下游资源的for_each,从而非常字面地声明磁盘与vm相关:

resource "cloudstack_disk" "worker" {
for_each = cloudstack_instance.worker
name               = "${var.prefix}-${each.key}"
attach             = "true"
disk_offering      = "Custom-RBD"
size               = 50
virtual_machine_id = each.value.id
zone               = var.zone
project            = var.project_id
}

因为cloudstack_instance资源也声明了for_each,所以cloudstack_instance.worker的计算结果是从实例键到对象的映射。这意味着在上面的示例中,each.value指的是cloudstack_instance.worker中与键each.key对应的任何元素值。

我还删除了depends_on参数,因为它是多余的:Terraform已经可以看到依赖关系,因为for_each包含对该资源的引用。

最新更新