通过Terraform/GCP使用多区域资源调配
我正在尝试使用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 = [
节点变量的外观:
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_一起使用。您是否有机会为我介绍一个类似的工作示例?这是我第一次在这里潜水进入地形