我试图创建google_container_node_pool与自动缩放块并使用以下属性之一:
min_node_count and
max_node_count
或
total_min_node_count and
total_max_node_count
由于每个区域节点计数(min_node_count)和总节点计数不能同时使用,因此我需要一些选项来使用此资源作为模块,然后使用给定的任何属性/变量。
例如,我有两个不同的环境,其中一个使用每个区域节点计数,另一个使用总节点计数。我希望能够使用相同的资源作为一个模块,以避免创建另一个几乎相同的模块。如果我然后使用这个模块并使用min_node_count属性,那么模块应该忽略total_min_node_count属性等等。我不知道这是可能的,但我挣扎了很长时间,找不到一个解决方案。
有没有人知道如何解决这个问题,或者如果它甚至可能没有太复杂的设置?
我希望我已经充分解释了我的问题,但如果需要更多的细节,请告诉我
Thanks in advance
我尝试了类似下面的东西,但它不起作用,原因很明显,仍然自动缩放块具有属性"min_node_count"并且将使用给定的任何值作为该属性的值,而不改变属性本身。
locals {
node_pool_min_node_count = var.total_min_node_count != null ? var.total_min_node_count : var.min_node_count
}
resource "google_container_node_pool" "example" {
name = "example-node-pool"
location = var.region
cluster = google_container_cluster.example.name
autoscaling {
min_node_count = local.node_pool_min_node_count
max_node_count = same config
}
在resource
块中为null
设置特定于资源类型的参数完全等同于完全不设置该参数:
min_node_count = null
文字null
不是很有用,但是如果你确保你的本地值是null
,在你不想设置它的情况下,那么Terraform将把它解释为未设置的参数。您的var.total_min_node_count
在未设置时似乎已经是null
,因此您可以直接像这样分配它:
min_node_count = var.total_min_node_count
这个参数属于嵌套块autoscaling
,有时提供者有验证规则,禁止在嵌套块中保留未设置的参数。
如果这个资源类型需要在autoscaling
块出现时设置min_node_count
,那么当节点计数被取消时,你也需要省略autoscaling
块的声明。
要动态选择要生成多少特定类型的块,可以使用dynamic
块。在dynamic
块中,你需要提供一个for_each
参数,这是一个你想要声明的块中有一个元素的集合,所以要在0个或1个块之间进行选择,你需要一个包含0个或1个元素的集合。
splat操作符[*]
可以应用于任何可能为空的非列表值,以自动将其转换为零元素或一个元素的列表:
- 如果
var.total_min_node_count
是null
则var.total_min_node_count[*]
是[]
- 如果
var.total_min_node_count
为2,则var.total_min_node_count[*]
为[2]
因此,您可以使用此操作符来简洁地使用相同的可能为null的输入变量来决定是否声明零或一个autoscaling
块:
dynamic "autoscaling" {
for_each = var.total_min_node_count[*]
content {
min_node_count = autoscaling.value
}
}
autoscaling.value
表示for_each
中当前元素的值,因此在上面的例子中,var.total_min_node_count[*]
产生[2]
,这将导致autoscaling.value
成为2
。
谢谢大家的帮助!似乎资源/模块的工作方式如下:
dynamic "autoscaling" {
for_each = var.min_node_count != null && var.max_node_count != null ? [1] : []
content {
min_node_count = var.min_node_count
max_node_count = var.max_node_count
}
}
dynamic "autoscaling" {
for_each = var.total_min_node_count != null && var.total_max_node_count != null ? [1] : []
content {
total_min_node_count = var.total_min_node_count
total_max_node_count = var.total_max_node_count
}
}
或简单的:
autoscaling {
min_node_count = var.min_node_count
max_node_count = var.max_node_count
total_min_node_count = var.total_min_node_count
total_max_node_count = var.total_max_node_count
}
但是在这两种情况下,我都需要在调用模块时使用所有的属性/变量,否则会导致错误:"Missing required argument"这是一种击败脉冲的方法。然而,当我使用所有这些变量,但设置变量"null"我不想用。
module "cluster" {
...
min_node_count = var.min_node_count # (2)
max_node_count = var.max_node_count # (6)
total_min_node_count = var.total_min_node_count # (null)
total_max_node_count = var.total_max_node_count # (null)
}
或
module "cluster" {
...
min_node_count = var.min_node_count # (null)
max_node_count = var.max_node_count # (null)
total_min_node_count = var.total_min_node_count # (2)
total_max_node_count = var.total_max_node_count # (6)
}