0

我正在学习 terraform,在下面的示例中,第一部分放置了一个 VM 并返回该 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]
}

4

2 回答 2

1

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

试试这个:

 virtual_machine_id = join(", ", cloudstack_instance.worker.*.id)
于 2021-10-18T16:45:23.850 回答
0

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

这种情况对资源之间的链接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与 key 对应的任何元素值each.key

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

于 2021-10-18T22:35:52.637 回答