【问题标题】:Terraform - GCP VM - provision Multiple VMs with Multiple extra disksTerraform - GCP VM - 使用多个额外磁盘配置多个 VM
【发布时间】:2021-10-19 11:43:01
【问题描述】:

我正在尝试使用少量额外磁盘创建多个 VM。我给了 2 个额外的磁盘并想创建 2 个虚拟机。似乎只为一个虚拟机创建了额外的磁盘,而不是为另一个虚拟机创建了额外的磁盘,并且它抛出了该额外的磁盘名称已经存在。

Error: Error creating instance: googleapi: Error 400: The disk resource 'projects/xxxxxxx/zones/us-central1-a/disks/extra-disk-1-ab23e8823b41ac18' is already being used by 'projects/xxxxxxx/zones/us-central1-a/instances/xxxxxx', resourceInUseByAnotherResource
│ 
│   with module.compute_vm.google_compute_instance.vm_instance[1],
│   on ../../main.tf line 66, in resource "google_compute_instance" "vm_instance":
│   66: resource "google_compute_instance" "vm_instance" {

示例文件夹中的Main.tf(调用模块)

module "compute_vm" {
  source              = "../../"
  num_instances       = 2
  boot_disk_size_gb   = "10"
  disk2_type          = "pd-ssd"
  os_distro           = "ubuntu"
  extra_disks = [{ name = "extra-disk-1", disk2_size_gb = "16" }, { name = "extra-disk-2", disk2_size_gb = "15" }]
}

在模块 Main.tf 中

resource "google_compute_disk" "disk2" {
  project = var.project_id
  count   = length(var.extra_disks)
  name    = "${var.extra_disks[count.index].name}-${random_id.instance_id.hex}"
  type    = var.disk2_type
  size    = var.extra_disks[count.index].disk2_size_gb
  zone    = var.zone
  labels = {
    environment = var.environment
  }
}

resource "random_id" "instance_id" {
  byte_length = 8
}

resource "google_compute_instance" "vm_instance" {
  project      = var.gcp_project_id
  count        = var.num_instances
  name         = "vm-${random_id.instance_id.hex}-${count.index + 1}"
  machine_type = var.machine_type
  zone         = var.zone

  boot_disk {
    initialize_params {
      image = lookup(var.image, var.os_distro)
      size  = var.boot_disk_size_gb
    }
  }

  dynamic "attached_disk" {
    for_each = google_compute_disk.disk2
    content {
      source      = attached_disk.value.self_link
      device_name = attached_disk.value.name
    }
  }
  # attached_disk {
  #   source      = element(google_compute_disk.disk2.*.self_link, count.index)
  #   device_name = element(google_compute_disk.disk2.*.name, count.index)
  # }

  network_interface {
    subnetwork = data.google_compute_subnetwork.subnet.self_link
    network_ip = element(google_compute_address.static.*.address, count.index)
  }

  lifecycle {
    ignore_changes = [attached_disk]
  }

}

【问题讨论】:

    标签: google-cloud-platform terraform


    【解决方案1】:

    @Gopalakrishnan 为社区其他人回答这个问题。

    为什么会这样?

    vm_instance 中的计数基于 var.num_instances,而磁盘计数基于 var.extra_disks。作为配置的一部分,第一个 VM 将附加 extra_disks,第二个 VM 也将尝试附加相同的磁盘,但会失败,因为这些磁盘已附加到 VM1。

    我们需要做什么? :

    我们需要确保为每个创建的实例创建新磁盘并将其附加到实例,而不是重复使用相同的磁盘。

    我们怎么做? (其中一种方式)
    1. google_compute_instance 块中删除计数变量。
    2. 将此 terraform 代码作为另一个文件夹中的模块调用。 [Creating a terraform module]
    3. 在模块中使用 count 创建多个 VM,其中包含多个磁盘。
    其他方式:
    • google_compute_disk 中进行计数 = 所需磁盘数 * 虚拟机数量,并包含一个逻辑,以根据正在创建的虚拟机的 count.index 调用 google_compute_instance 中的 google_compute_disk.disk2 的特定元素。

    【讨论】:

    • 您好 - 我在示例模块中使用了Count=<num>,它工作正常。但问题出在这里我有我的本地提供者,我们需要在提供者块中提供一些值作为变量。因此,我们强制在 root main.tf file.d 中使用 Error: Module module.compute_vm contains provider configuration Providers cannot be configured within modules using count, for_each or depends_on. 这是必须在 root main.tf 中使用的提供程序块 provider "testprovkider" { service_account = var.sa pnumber = var.projnum } 请提供您的帮助。谢谢!!
    • 道歉,我应该清楚地提到..它用于额外的磁盘分区而不是引导磁盘。
    猜你喜欢
    • 2020-10-16
    • 2021-05-30
    • 2022-01-18
    • 2017-06-18
    • 2022-11-25
    • 2021-04-22
    • 2021-08-14
    • 2022-01-20
    • 2019-03-14
    相关资源
    最近更新 更多