Terraform - 如何将输入变量限制为可能的选项列表



我有一个用户将在运行时输入的变量。假设变量名称是区域。但是,我希望仅当用户从列表/选项中定义的值之一中选择一个值时,执行才会成功。

如何限制它,以便用户的选择必须与变量定义中认为可接受的值匹配?

偶然发现了这个问题。

从 v0.13.0 开始,可以直接通过输入变量进行输入验证。因此,您实际上可以使用如下所示的代码片段来实现这一点。

variable "test_variable" {
type        = string
description = "some test value"
validation {
condition     = contains(["item1", "item2", "item3"], var.test_variable)
error_message = "Valid values for var: test_variable are (item1, item2, item3)."
} 
}

在此处阅读更多内容 - https://www.hashicorp.com/blog/custom-variable-validation-in-terraform-0-13

一种解决方案:

variable "values_list" {
description = "acceptable values"
type = "list"
default = ["true", "false"]
}
variable "somevar" {
description = "must be true or false"
}
resource "null_resource" "is_variable_value_valid" {
count = "${contains(var.values_list, var.somevar) == true ? 0 : 1}"
"ERROR: The somevar value can only be: true or false" = true
}
如果为">

somevar"变量传递的值不同于"true"或"false",Terraform将抛出错误并停止。缺点是您必须列出values_listdefault块中的所有值。

来源: https://stackoverflow.com/a/54256780/1364793

您的问题仍然是许多 Terraform 用户可能面临的有效情况。因此,我将提供更新的答案。

为了将输入变量限制为可能的选项列表,您现在可以执行以下操作:

variable "create_mode" {
type = string
description = "Some description"
default = "Default"
validation {
condition = contains(["Default", "PointInTimeRestore", "Replica"], var.create_mode)
error_message = "Valid values for create_mode are (Default, PointInTimeRestore, Replica)"
}
}

在上面的例子中,我有变量create_mode.有效选项包括:"默认"、"时间还原点"、"副本"。因此,为了限制输入,我添加了验证块,其中包含条件和错误消息,以防有人尝试对变量使用无效值。

现在,如果我尝试启动此变量,假设create_mode = "Random"当我执行terraform planterraform validate时,我将收到以下错误。

daniel:~$tfplan
╷
│ Error: Invalid value for variable
│ 
│   on main.tf line 91, in module "pg_fs_database":
│   91:   create_mode = "Random"
│     ├────────────────
│     │ var.create_mode is "Random"
│ 
│ Valid values for create_mode are (Default, PointInTimeRestore, Replica)
│ 
│ This was checked by the validation rule at ../postgresql-flexible-server/variables.tf:56,3-13.

查看此处了解更多详情。

如果您认为我的回答有帮助,请投赞成票。

Terraform目前没有一流的功能,但您可以通过要求 Terraform 在地图上查找值来达到所需的效果(尽管带有不太有用的错误消息):

variable "example" {
description = "must be a, b, or c"
}
locals {
allowed_example_values = { for v in ["a", "b", "c"] : v => v }
checked_example = local.allowed_example_values[var.example] # will fail if var.example is invalid
}

由于allowed_example_values映射中的值与键相同,因此可以使用local.checked_example代替模块中其他任何位置的var.example来设置依赖项关系图,以便无法使用无效值。

一些警告/限制:

  • 您无法自定义 Terraform 在值无效时返回的错误消息。相反,Terraform 将返回有关键与地图中的任何元素不匹配的一般错误。但是,它将在错误消息中包含受影响行的源代码片段(在 Terraform 0.12 或更高版本中),因此该行末尾的注释应该在错误消息中可见,从而为用户提供有关可能出错的额外线索。

  • 这仅适用于字符串值,因为地图键在 Terraform 中始终是字符串。使用其他基元类型可以作为 Terraform 从 bool 和数字到字符串的自动转换的结果,但您应该确保显式声明变量的类型(例如使用type = number),以确保 Terraform 在地图中查找传入值之前将传入值规范化为预期类型。此技术根本不适用于集合和结构类型。

  • 我不建议使用字符串"true""false",因为 Terraform 有一个可以更直观地表示它的bool类型。如果您使用的是 Terraform 0.11 及更早版本,则无法约束为 bool,但在 Terraform 0.12 及更高版本中,您可以将变量声明为type = bool然后 Terraform 将自动处理验证。

最新更新