【问题标题】:Terraform - how to use exported attributes?Terraform - 如何使用导出的属性?
【发布时间】:2021-12-05 16:50:16
【问题描述】:

我正在学习 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]
}

【问题讨论】:

标签: attributes terraform terraform0.12+ terraform-template-file terraform-provider


【解决方案1】:

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

试试这个:

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

【讨论】:

  • 对于单实例,此解决方案非常出色:-)
【解决方案2】:

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

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

【讨论】:

  • 按预期工作,感谢您的帮助:-)
猜你喜欢
  • 1970-01-01
  • 2021-07-06
  • 2019-09-22
  • 2020-11-19
  • 2017-10-05
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多