Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Terraform/GCP使用多区域资源调配_Terraform_Terraform Provider Gcp - Fatal编程技术网

通过Terraform/GCP使用多区域资源调配

通过Terraform/GCP使用多区域资源调配,terraform,terraform-provider-gcp,Terraform,Terraform Provider Gcp,我正在尝试使用Terraform在GCP中为集群提供跨多个区域的实例。这就是节点变量的外观: variable "nodes" { type = list(object({ machine_type = string nvme_count = number node_count = number zone = string disk_size = number })) default = [

我正在尝试使用Terraform在GCP中为集群提供跨多个区域的实例。这就是
节点
变量的外观:


variable "nodes" {
  type = list(object({
    machine_type = string
    nvme_count   = number
    node_count   = number
    zone         = string
    disk_size    = number
  }))
  default = [
    {
      zone = "us_east1-b"
      machine_type = "n1-standard-4"
      nvme_count = 3
      node_count = 3
      disk_size = 20
    },
    {
      zone = "us_central1-a"
      machine_type = "n1-standard-4"
      nvme_count = 3
      node_count = 3
      disk_size = 20
    }
  ]

}
这意味着我希望在us-east1-b中保留3个节点,在us-central1-a中保留3个节点,每个区域都有一些额外的参数

以下是我尝试运行此功能的方式:

resource "google_compute_instance" "node-instance" {
  for_each = var.nodes
  name = "${var.cluster_name}-node-${each.value.zone}"
  machine_type = each.value.machine_type
  count = each.value.node_count
  zone = each.value.zone
  tags=["${var.cluster_name}-node"]
  boot_disk {
    initialize_params {
      size = each.value.disk_size
      image = data.google_compute_image.g_image.self_link
    }
  }

  metadata = {
    sshKeys = "${var.ssh_user}:${file(var.ssh_public_key)}"
  }

  network_interface {
    network = "${var.cluster_name}-vpc"
    access_config {

    }
  }
}

这不起作用,因为显然,
count
for_
彼此冲突。有解决办法吗?我真的不想为每个区域硬编码单独的资源

您的代码中有几个问题

首先,对于_,每个仅接受
set
map
。它不适用于列表。您可以尝试以下方法:

for_each = {for node in var.nodes:  node.zone => node}
但即使这样也不够。在资源级别上,使用多维对象几乎做不到什么。为了实现您想要的,您可能需要展开节点的定义,或者使用模块向上一级

locals {
   nodes = flatten([ for node in var.nodes: 
                           [ for i in range(node.node_count): 
                               {
                               zone = node.zone
                               machine_type = node.machine_type
                               nvme_count = node.nvme_count
                               disk_size = node.disk_size
                               } 
                           ] 
                       ])
}

然后您将此节点列表
local.nodes
与count=length(local.nodes)一起使用,或者将其转换为set或map,并与for_一起使用。

您是否有机会为我介绍一个类似的工作示例?这是我第一次在这里潜水进入地形