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

时间:2019-07-24 19:30:09

标签: terraform

我有一个供用户在运行时输入的变量。可以说变量名是region。但是,我希望仅当用户从列表/选项中定义的值中选择一个值时,执行才能成功。

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

3 个答案:

答案 0 :(得分:4)

偶然发现了这个问题。

自 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

答案 1 :(得分:0)

一种解决方案:

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将引发错误并停止。缺点是您必须在default的{​​{1}}块中列出所有值。

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

答案 2 :(得分:0)

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 = 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和number转换为字符串,因此可以使用其他原始类型,但是您应该确保明确声明变量的类型(例如使用type = number),以确保Terraform可以规范输入值进入预期的类型,然后在地图上查找它们。对于集合和结构类型,此技术根本不起作用。

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