【问题标题】:GCP Terraform error creating multiple VMs from Instance Template with "additional_disks"GCP Terraform 使用“additional_disks”从实例模板创建多个虚拟机时出错
【发布时间】:2022-08-02 12:23:35
【问题描述】:

我需要使用位于此处的实例模板模块在 GCP 中创建多个虚拟机: https://github.com/terraform-google-modules/terraform-google-vm/tree/master/modules/instance_template

我的实例模板代码如下所示:

module \"db_template\" {
  source               = \"terraform-google-modules/vm/google//modules/instance_template\"
  version              = \"7.8.0\"
  name_prefix          = \"${var.project_short_name}-db-template\"
  machine_type         = var.app_machine_type
  disk_size_gb         = 20
  source_image         = \"debian-10-buster-v20220719\"
  source_image_family  = \"debian-10\"
  source_image_project = \"debian-cloud\"
  
  additional_disks     = var.additional_disks
  labels = {
    costing   = \"db\",
    inventory = \"gcp\",
  }
  network       = var.network
  subnetwork    = var.subnetwork
  access_config = []
  service_account = {
    email  = var.service_account_email
    scopes = [\"cloud-platform\"]
  }
  tags = [\"compute\"]
}

在我的 tfvars 我有这个:

additional_disks = [
    { disk_name     = \"persistent-disk-1\"
      device_name   = \"persistent-disk-1\"
      auto_delete   = true
      boot          = false
      disk_size_gb  = 50
      disk_type     = \"pd-standard\"
      interface     = \"SCSI\"
      disk_labels   = {}
    }
]

但是,当我的代码使用此模板部署多个 VM 时,只会部署 1 个 VM(第一个 VM),随后的 VM 会出现以下错误消息:

Error: Error creating instance: googleapi: Error 409: The resource \'projects/<PATH>/persistent-disk-1\' already exists, alreadyExists

我明白发生了什么,但我不知道如何解决它。无法创建后续 VM,因为 additional_disk 名称已被第一个 VM 占用。我认为使用实例模板的全部意义在于其中内置了逻辑,您可以在其中使用相同的模板并创建多个该类型的虚拟机。

但似乎我必须做一些额外的编码才能使用这个模板部署多个虚拟机。

谁能建议如何做到这一点?

  • 您如何尝试部署多个实例?
  • 使用类似disk_name = \"$disk-{random_id.id.hex}\" registry.terraform.io/providers/hashicorp/random/latest/docs/…
  • 那将必须是一个不同的变量并且以不同的方式编写,但这是一个好主意。
  • 我应该提到我扩展实例的方法是for_each,这可能会影响您的 cmets。我确实尝试了random_id 资源的各种化身,但也发现很难做到这一点。最终,我得到了它与for_each 的合作,并分两步创建和附加磁盘。

标签: templates google-cloud-platform terraform google-compute-engine terraform-provider-gcp


【解决方案1】:

最终得到了这个与各种for_each 构造一起使用:

locals {
  app_servers = ["inbox", "batch", "transfer", "tools", "elastic", "artemis"]
  db_servers  =  ["inboxdb", "batchdb", "transferdb", "gatewaydb", "artemisdb"]
}

resource "google_compute_disk" "db_add_disk" {
  for_each = toset(local.db_servers)
  name  = "${each.value}-additional-disk"
  type  = "pd-standard" // pd-ssd
  zone  = var.zone
  size  = 50
  // interface     = "SCSI"
  labels = {
    environment = "dev"
  }
  physical_block_size_bytes = 4096
}
module "db_template" {
  source               = "terraform-google-modules/vm/google//modules/instance_template"
  version              = "7.8.0"
  name_prefix          = "${var.project_short_name}-db-template"
  machine_type         = var.app_machine_type
  disk_size_gb         = 20
  source_image         = "debian-10-buster-v20220719"
  source_image_family  = "debian-10"
  source_image_project = "debian-cloud"
  

  labels = {
    costing   = "db",
    inventory = "gcp",
  }
  network       = var.network
  subnetwork    = var.subnetwork
  access_config = []
  service_account = {
    email  = var.service_account_email
    scopes = ["cloud-platform"]
  }
  tags = ["compute"]
}

resource "google_compute_instance_from_template" "db_server-1" {
  for_each =  toset(local.db_servers)
  name = "${var.project_short_name}-${each.value}-1"
  zone = var.zone

  source_instance_template =  module.db_template.self_link
 

  // Override fields from instance template
  labels = {
    costing   = "db",
    inventory = "gcp",
    component = "${each.value}"
  }
  lifecycle {
    ignore_changes = [attached_disk]
  }
}

resource "google_compute_attached_disk" "db_add_disk" {
  for_each = toset(local.db_servers)
  disk     = google_compute_disk.db_add_disk[each.key].id
  instance = google_compute_instance_from_template.db_server-1[each.key].id
}

【讨论】:

    猜你喜欢
    • 2018-09-24
    • 1970-01-01
    • 2020-01-19
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多