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

San*_*hra 5 terraform

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

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

Dav*_*vid 10

偶然发现了这个问题。

从 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)"
  } 
}
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多 - https://www.hashicorp.com/blog/custom-variable-validation-in-terraform-0-13

  • AFAIK,这将导致验证错误“验证错误消息必须至少是一个以大写字母开头并以句点或问号结尾的完整句子。”通过在“error_message”末尾添加“.”字符串,它应该修复它。 (2认同)

Dan*_*iel 5

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

\n

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

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

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

\n

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

\n
daniel:~$tfplan\n\xe2\x95\xb7\n\xe2\x94\x82 Error: Invalid value for variable\n\xe2\x94\x82 \n\xe2\x94\x82   on main.tf line 91, in module "pg_fs_database":\n\xe2\x94\x82   91:   create_mode = "Random"\n\xe2\x94\x82     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n\xe2\x94\x82     \xe2\x94\x82 var.create_mode is "Random"\n\xe2\x94\x82 \n\xe2\x94\x82 Valid values for create_mode are (Default, PointInTimeRestore, Replica)\n\xe2\x94\x82 \n\xe2\x94\x82 This was checked by the validation rule at ../postgresql-flexible-server/variables.tf:56,3-13.\n
Run Code Online (Sandbox Code Playgroud)\n

请查看此处了解更多详细信息。

\n


Dzh*_*eyt 4

一种解决方案:

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
}
Run Code Online (Sandbox Code Playgroud)

如果您为“somevar”变量传递的值不同于“true”或“false”,Terraform 将抛出错误并停止。缺点是您必须列出default块中的所有值values_list

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