首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有多个磁盘GCP的Terraform多个虚拟机

具有多个磁盘GCP的Terraform多个虚拟机
EN

Stack Overflow用户
提问于 2020-06-26 17:20:00
回答 3查看 3.4K关注 0票数 2

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

在下面的示例中,我必须使用3个磁盘test-d01-data和test-d01-data-disk创建test-d01Compute,并使用2个磁盘test-d02-data-01和test-d02-data-02创建test-d01-commitlog-disk。

例如,下面的示例中,VM_info表示所需的配置,它将

代码语言:javascript
运行
复制
    {
      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"
        }
        ]
    },
  ]
EN

回答 3

Stack Overflow用户

发布于 2020-08-04 14:40:36

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

  ]
}
票数 1
EN

Stack Overflow用户

发布于 2020-07-26 03:34:25

Terraform by HashiCorp > Compute Engine > Resources > google_compute_attached_disk

可以使用计算实例配置中的attached_disk部分将

永久磁盘连接到计算实例。但是,在某些情况下,通过计算实例配置来管理所连接的磁盘是不可取或不可能的,例如使用count变量来连接动态磁盘数量

因此,创建具有attached_disk属性的google_compute_instance的简单方法在这种情况下可能不适用。

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

1.可以独立创建 Persistent disks google_compute_disk。为了简单起见,根文件my_instances.tf中使用了5个文字块。

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

binding objects Create a VM instance google_compute_instance;

  • Use
  • google_compute_attached_disk将新的空磁盘附加到新创建的VM实例。

要处理磁盘列表,需要使用for_each元参数。

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

Terraform by HashiCorp > Compute Engine > Data Sources > google_compute_instance

Terraform by HashiCorp > Compute Engine > Resources > google_compute_disk

Terraform by HashiCorp > Compute Engine > Resources > google_compute_attached_disk

Terraform by HashiCorp > Configuration language > Resources > lifecycle.ignore_changes

Terraform by HashiCorp > Configuration language > Resources > When to Use for_each Instead of count

Terraform by HashiCorp > Configuration language > Resources > The each Object

Terraform by HashiCorp > Configuration language > Resources > Using Sets

代码语言:javascript
运行
复制
$ cat my_instances.tf
resource "google_compute_disk" "test-d01-data" {
  name  = "test-d01-data"
  type  = "pd-ssd"
  size = 60
  zone = "europe-west3-c"
}
resource "google_compute_disk" "test-d01-data-disk" {
  name  = "test-d01-data-disk"
  type  = "pd-standard"
  size = 15
  zone = "europe-west3-c"
}
resource "google_compute_disk" "test-d01-commitlog-disk" {
  name  = "test-d01-commitlog-disk"
  type  = "pd-ssd"
  size = 30
  zone = "europe-west3-c"
}

resource "google_compute_disk" "test-d02-data" {
  name  = "test-d02-data"
  type  = "pd-ssd"
  size = 60
  zone = "europe-west3-c"
}
resource "google_compute_disk" "test-d02-data-disk" {
  name  = "test-d02-data-disk"
  type  = "pd-standard"
  size = 15
  zone = "europe-west3-c"
}

module "test-d01" {
  source           = "./instance"
  instance_name    = "test-d01"
  disks = [
    google_compute_disk.test-d01-data.name,
    google_compute_disk.test-d01-data-disk.name,
    google_compute_disk.test-d01-commitlog-disk.name
  ]
}
module "test-d02" {
  source           = "./instance"
  instance_name    = "test-d02"
  disks = [
    google_compute_disk.test-d02-data.name,
    google_compute_disk.test-d02-data-disk.name
  ]
}

$ cat instance/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" {}

resource "google_compute_instance" "vm_instance" {
  name         = var.instance_name
  zone         = var.instance_zone
  machine_type = var.instance_type
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
      }
  }
  network_interface {
    subnetwork = "${var.instance_subnetwork}"
    access_config {
      # Allocate a one-to-one NAT IP to the instance
    }
  }
  lifecycle {
    ignore_changes = [attached_disk]
  }
}

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

$ terraform fmt
$ terraform init 
$ terraform plan 
$ terraform apply
票数 0
EN

Stack Overflow用户

发布于 2020-09-30 03:40:11

您还可以使用以下命令获得附加的磁盘:

代码语言:javascript
运行
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62591713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档