Google cloud platform 具有多磁盘GCP的Terraform多VM

Google cloud platform 具有多磁盘GCP的Terraform多VM,google-cloud-platform,virtual-machine,terraform,disk,terraform-provider-gcp,Google Cloud Platform,Virtual Machine,Terraform,Disk,Terraform Provider Gcp,我正在尝试创建虚拟机列表,每个虚拟机都有需要创建和连接的磁盘列表 在下面的示例中,我必须使用3个磁盘test-d01-data和test-d01-data-disk以及test-d01-commitlog-disk创建test-d01计算 类似地,test-d02使用2个磁盘test-d02-data-01和test-d02-data-02进行计算 对于expample,下面的VM_信息表示所需的配置,它将 { name = "test-d01"

我正在尝试创建虚拟机列表,每个虚拟机都有需要创建和连接的磁盘列表

在下面的示例中,我必须使用3个磁盘test-d01-data和test-d01-data-disk以及test-d01-commitlog-disk创建test-d01计算 类似地,test-d02使用2个磁盘test-d02-data-01和test-d02-data-02进行计算

对于expample,下面的VM_信息表示所需的配置,它将

    {
      name       = "test-d01"
      zone       = "us-east1-b"    
      disk = [
        {
          disk_name = "test-d01-data"
          disk_type = "pd-ssd"
          disk_size = "60"
        },
        {
          disk_name = "test-d01-data-disk"
          disk_type = "pd-standard"
          disk_size = "15"
        },
        {
          disk_name = "test-d01-commitlog-disk"
          disk_type = "pd-ssd"
          disk_size = "30"
        }
      ]
    },
    {
      name       = "test-d02"
      zone       = "us-east1-b"
           
        disk=[
        {
        disk_name = "test-d02-data"
        disk_type = "pd-ssd"
        disk_size = "60"
        },
        {
        disk_name = "test-d02-data-disk"
        disk_type = "pd-standard"
        disk_size = "15"
        }
        ]
    },
  ]
:

可以使用 计算实例配置中的附加磁盘部分。 但是,在某些情况下,可能会通过 compute实例配置不可取或不可能,例如 使用
count
变量附加动态磁盘数

因此,在这种情况下,创建带有属性的
google\u compute\u实例
的简单方法可能不适用

简而言之,这个想法是先创建持久磁盘,然后创建VM实例,并将新磁盘附加到新创建的实例上。此测试部署由根配置文件
my_instances.tf
和可重用模块
/instance/main.tf
组成

1.可以独立创建持久磁盘
google\u compute\u disk
。为了简单起见,在根文件
my_instances.tf
中使用了5个文本块

2.调用可重用模块
instance/main.tf
并将VM属性和磁盘列表传递给模块,以便:

  • 创建一个VM实例
    google_compute_实例
    
    
  • 使用binding objects
    google\u compute\u attached\u disk
    将新的空磁盘附加到新创建的VM实例
要处理磁盘列表,请使用每个元参数的

由于
for_each
只接受一个映射或一组字符串,因此
toset
函数用于将磁盘列表转换为一组







:

可以使用 计算实例配置中的附加磁盘
部分。 但是,在某些情况下,可能会通过 compute实例配置不可取或不可能,例如 使用
count
变量附加动态磁盘数

因此,在这种情况下,创建带有属性的
google\u compute\u实例
的简单方法可能不适用

简而言之,这个想法是先创建持久磁盘,然后创建VM实例,并将新磁盘附加到新创建的实例上。此测试部署由根配置文件
my_instances.tf
和可重用模块
/instance/main.tf
组成

1.可以独立创建持久磁盘
google\u compute\u disk
。为了简单起见,在根文件
my_instances.tf
中使用了5个文本块

2.调用可重用模块
instance/main.tf
并将VM属性和磁盘列表传递给模块,以便:

  • 创建一个VM实例
    google_compute_实例
    
    
  • 使用binding objects
    google\u compute\u attached\u disk
    将新的空磁盘附加到新创建的VM实例
要处理磁盘列表,请使用每个元参数的

由于
for_each
只接受一个映射或一组字符串,因此
toset
函数用于将磁盘列表转换为一组








好主意。当我用这个的时候,我会得到一个

terraform plan
var.disks
  Enter a value: 2

var.instance_name
  Enter a value: DDVE5


Error: Reference to undeclared resource

  on main.tf line 39, in resource "google_compute_attached_disk" "vm_attached_disk":
  39:   instance = google_compute_instance.vm_instance.self_link

A managed resource "google_compute_instance" "vm_instance" has not been
declared in the root module.
cat main.tf

variable "instance_name" {}
variable "instance_zone" {
  default = "europe-west3-c"
}
variable "instance_type" {
  default = "n1-standard-1"
}
variable "instance_subnetwork" {
  default = "default"
}
variable "disks" {}

provider "google" {
  credentials = file("key.json")
  project     = "ddve50"
  region      = "europe-west3"
  zone        = "europe-west3-a"
}

resource "google_compute_instance" "vm-instance" {
  name         = "ddve-gcp-5-7-2-0-20-65"
  machine_type = "f1-micro"
  tags         = ["creator", "juergen"]
  boot_disk {
    initialize_params {
      image = "ddve"
      type  = "pd-ssd"
    }
  }
  network_interface {
    network = "default"
  }
}

resource "google_compute_attached_disk" "vm_attached_disk" {
  for_each = toset(var.disks)
  disk     = each.key
  instance = google_compute_instance.vm_instance.self_link
}
cat../my_instances.tf

resource "google_compute_disk" "ddve-gcp-5-7-2-0-20-65-nvram" {
  name = "ddve-gcp-5-7-2-0-20-65-nvram"
  type = "pd-ssd"
  size = 10
}

resource "google_compute_disk" "ddve-gcp-5-7-2-0-20-65-m1" {
  name = "ddve-gcp-5-7-2-0-20-65-m1"
  type = "pd-standard"
  size = 1024
}

module "ddve-test-d01" {
  source        = "./instance"
  instance_name = "ddve-test-d01"
  disks = [
    google_compute_disk.ddve-gcp-5-7-2-0-20-65-nvram,
    google_compute_disk.ddve-gcp-5-7-2-0-20-65-m1

  ]
}

好主意。当我用这个的时候,我会得到一个

terraform plan
var.disks
  Enter a value: 2

var.instance_name
  Enter a value: DDVE5


Error: Reference to undeclared resource

  on main.tf line 39, in resource "google_compute_attached_disk" "vm_attached_disk":
  39:   instance = google_compute_instance.vm_instance.self_link

A managed resource "google_compute_instance" "vm_instance" has not been
declared in the root module.
cat main.tf

variable "instance_name" {}
variable "instance_zone" {
  default = "europe-west3-c"
}
variable "instance_type" {
  default = "n1-standard-1"
}
variable "instance_subnetwork" {
  default = "default"
}
variable "disks" {}

provider "google" {
  credentials = file("key.json")
  project     = "ddve50"
  region      = "europe-west3"
  zone        = "europe-west3-a"
}

resource "google_compute_instance" "vm-instance" {
  name         = "ddve-gcp-5-7-2-0-20-65"
  machine_type = "f1-micro"
  tags         = ["creator", "juergen"]
  boot_disk {
    initialize_params {
      image = "ddve"
      type  = "pd-ssd"
    }
  }
  network_interface {
    network = "default"
  }
}

resource "google_compute_attached_disk" "vm_attached_disk" {
  for_each = toset(var.disks)
  disk     = each.key
  instance = google_compute_instance.vm_instance.self_link
}
cat../my_instances.tf

resource "google_compute_disk" "ddve-gcp-5-7-2-0-20-65-nvram" {
  name = "ddve-gcp-5-7-2-0-20-65-nvram"
  type = "pd-ssd"
  size = 10
}

resource "google_compute_disk" "ddve-gcp-5-7-2-0-20-65-m1" {
  name = "ddve-gcp-5-7-2-0-20-65-m1"
  type = "pd-standard"
  size = 1024
}

module "ddve-test-d01" {
  source        = "./instance"
  instance_name = "ddve-test-d01"
  disks = [
    google_compute_disk.ddve-gcp-5-7-2-0-20-65-nvram,
    google_compute_disk.ddve-gcp-5-7-2-0-20-65-m1

  ]
}

您可以将磁盘连接到:

resource "google_compute_disk" "default" {
  name = "test-disk"
  type = "pd-ssd"
  zone = var.instance_zone
  # image = "debian-9-stretch-v20200805"
  labels = {
    environment = "dev"
  }
  physical_block_size_bytes = 4096
}

resource "google_compute_attached_disk" "vm_attached_disk" {
  count    = var.disks
  disk     = google_compute_disk.default.id
  instance = google_compute_instance.vm-instance.id
}

您可以将磁盘连接到:

resource "google_compute_disk" "default" {
  name = "test-disk"
  type = "pd-ssd"
  zone = var.instance_zone
  # image = "debian-9-stretch-v20200805"
  labels = {
    environment = "dev"
  }
  physical_block_size_bytes = 4096
}

resource "google_compute_attached_disk" "vm_attached_disk" {
  count    = var.disks
  disk     = google_compute_disk.default.id
  instance = google_compute_instance.vm-instance.id
}

你怎么回事啊?你的错误是什么?我们能提供什么帮助?基本上我需要创建terraform共享模块,以实现上述要求。现在我可以用相同数量的磁盘创建虚拟机。但是现在我需要用不同数量的磁盘更新模块,比如第一个虚拟机有3个磁盘,第二个虚拟机有2个磁盘,然后继续…那么在terraform中是否可以使用任何集合或任何其他方式…需要帮助吗?你有什么问题?你的错误是什么?我们能提供什么帮助?基本上我需要创建terraform共享模块,以实现上述要求。现在我可以用相同数量的磁盘创建虚拟机。但现在我需要用不同数量的磁盘更新模块,比如第一个虚拟机有3个磁盘,第二个虚拟机有2个磁盘,然后继续…所以在terraform中是否可以使用任何集合或任何其他方式…需要帮助吗