我正在尝试使用Terraform在GCP中提供跨多个区域的实例集群。这是nodes变量的样子:
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个节点,每个区域都有一些额外的参数。
这就是我尝试运行的方法:
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_each彼此冲突。有解决方案吗?我真的不想为每个专区硬编码单独的资源
发布于 2020-12-18 19:17:29
您的代码中有几个问题。
首先,for_each只接受set或map。它不适用于列表。您可以尝试执行以下操作:
for_each = {for node in var.nodes: node.zone => node}但即使是这样,也是不够的。在资源级别上,对多维对象几乎无能为力。为了实现你想要的东西,你可能需要展开你的节点的定义,或者上一层的use模块。
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一起使用。
https://stackoverflow.com/questions/65350765
复制相似问题