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 包含对该资源的引用。