是否可以创建具有可选属性的地形资源?



我试图创建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_countnullvar.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)
}

最新更新