Terraform - 指定变量的多个可能值

10

CloudFormation提供了AllowedValues参数,可以告诉我们参数的可能值来自于哪个列表。那么我该如何在Terraform变量中实现这一功能呢?由于列表类型的变量并没有提供这种功能,所以如果我想要让我的变量只能取两个可能的值中的一个,我该怎么办呢?以下是我想要复制的CloudFormation脚本:

"ParameterName": {
        "Description": "desc",
        "Type": "String",
        "Default": true,
        "AllowedValues": [
            "true",
            "false"
        ]
   }
3个回答

16

我不知道是否有官方方法,但是有一种有趣的技术在Terraform问题中描述:

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
}

更新:

Terraform 0.13现在提供自定义验证规则

variable "somevar" {
  type = string
  description = "must be true or false"

  validation {
    condition     = can(regex("^(true|false)$", var.somevar))
    error_message = "Must be true or false."
  }
}

那么如果变量不在列表中,Terraform会引发错误并停止进一步的处理吗?如果变量在列表中,计数的值将为零?当计数为1时,将抛出错误? - seou1

8

自定义验证规则 绝对是你应该采用的方式。如果你想保持简单,只需检查提供的值是否在有效列表中,你可以在variables.tf配置文件中使用以下代码:

variable "environment" {
  type = string
  description = "Deployment environment"
  validation {
    condition = contains(["dev", "prod"], var.environment)
    error_message = "Valid value is one of the following: dev, prod."
  }
}

1

以上答案的变化是使用数组/列表。

variable "appservice_sku" {

    type        = string 
    description = "AppService Plan SKU code"
    default     = "P1v3"

    validation {
        error_message = "Please use a valid AppService SKU."
        condition = can(regex(join("", concat(["^("], [join("|", [ 
            "B1", "B2", "B3", "D1", "F1", 
            "FREE", "I1", "I1v2", "I2", "I2v2", 
            "I3", "I3v2", "P1V2", "P1V3", "P2V2", 
            "P2V3", "P3V2", "P3V3", "PC2", 
            "PC3", "PC4", "S1", "S2", "S3", 
            "SHARED", "WS1", "WS2", "WS3"
        ])], [")$"])), var.appservice_sku))
    }
}

我不确定我是否正确理解了这段代码,但如果我理解正确的话,contains(['b1','b2',...'ws3'], var.appservice_sku) 不是更容易理解吗? - 4c74356b41

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接