首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Terraform/GCP使用多区域资源调配

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

Stack Overflow用户
提问于 2020-12-18 09:52:17
回答 1查看 151关注 0票数 1

我正在尝试使用Terraform在GCP中提供跨多个区域的实例集群。这是nodes变量的样子:

代码语言:javascript
运行
复制
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-cental1-a中保存3个节点,每个区域都有一些额外的参数。

这就是我尝试运行的方法:

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

    }
  }
}

这不起作用,因为显然countfor_each彼此冲突。有解决方案吗?我真的不想为每个专区硬编码单独的资源

EN

回答 1

Stack Overflow用户

发布于 2020-12-18 19:17:29

您的代码中有几个问题。

首先,for_each只接受setmap。它不适用于列表。您可以尝试执行以下操作:

代码语言:javascript
运行
复制
for_each = {for node in var.nodes:  node.zone => node}

但即使是这样,也是不够的。在资源级别上,对多维对象几乎无能为力。为了实现你想要的东西,你可能需要展开你的节点的定义,或者上一层的use模块。

代码语言:javascript
运行
复制
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 = length(local.nodes)一起使用,或者将其转换为set或map并与for_each一起使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65350765

复制
相关文章

相似问题

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