Terraform - 如何使用导出的属性?
Terraform - how to use exported attributes?
我正在学习 terraform,在下面的示例中,第一部分放置了一个 VM 和 returns 该 VM 的 ID。第二部分向 vm 添加一个额外的磁盘。我必须在 virtual_machine_id 参数中输入一个 id,但我不知道如何(cloudstack_instance.worker[$name].id 不起作用)。
有人可以给点提示吗?
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)
从您的配置来看,您的意图似乎是为每个虚拟机声明一个磁盘,每个磁盘都连接到相应的虚拟机。
这种情况很好用 Chaining for_each
Between Resources,这意味着直接使用上游资源作为下游资源的 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
包含对该资源的引用。
我正在学习 terraform,在下面的示例中,第一部分放置了一个 VM 和 returns 该 VM 的 ID。第二部分向 vm 添加一个额外的磁盘。我必须在 virtual_machine_id 参数中输入一个 id,但我不知道如何(cloudstack_instance.worker[$name].id 不起作用)。 有人可以给点提示吗?
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)
从您的配置来看,您的意图似乎是为每个虚拟机声明一个磁盘,每个磁盘都连接到相应的虚拟机。
这种情况很好用 Chaining for_each
Between Resources,这意味着直接使用上游资源作为下游资源的 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
包含对该资源的引用。