首页 > 解决方案 > terraform中布尔值的“”等价物是什么?

问题描述

我有一个模块可以控制少量类似的资源,并且这些资源中的许多设置都是相同的;所以我创建了全局默认值,我的模块中的所有资源都可以引用。

我想在我的模块中有一组默认变量和一组可以覆盖默认值的变量,如果我的模块的调用者决定将它们传递进来。我一直在使用的字符串如下(这些都在我的模块中的相同variables.tf文件)。

我的默认值:

variable "default_env" {default="test"}

我的占位符变量允许调用资源来设置它们:

variable "x_env" {default=""}
variable "y_env" {default=""}
variable "z_env" {default=""}

我尝试引导模块用户了解哪些变量可以被覆盖:

locals {
    env = "${var.x_env != "" ? var.x_env : "${var.default_env}"}"
    env = "${var.y_env != "" ? var.y_env : "${var.default_env}"}"
    env = "${var.z_env != "" ? var.z_env : "${var.default_env}"}"
}

但是,我无法弄清楚如何使用布尔值正确执行此操作,因为我无法弄清楚如何创建一个空的布尔变量。我唯一的选择似乎是将默认值设置为我的覆盖变量的一部分:

variable "x_lock" {default=true}

有没有一种方法可以让我们不必维护两组默认值(1: variable "default_lock" {default=true}, 2: variable "x_lock" {default=true})来声明这一点?

我试过做:

variable "x_lock" {
    type = bool
    default = ""
}

但我显然得到一个""不兼容的错误bool

我还能怎么做呢?

标签: terraform

解决方案


在 Terraform 中,值的缺失由关键字 表示,该关键字null对任何类型都有效。

鉴于此,为了区分truefalse和根本不设置,您可以定义如下变量:

variable "x_lock" {
  type    = bool
  default = null
}

请注意,说这是“相当于布尔值的空字符串”并不是真的。空字符串不等于null,因此如果您想明确表示字符串的缺失,通常最好也使用null它:

variable "x_env" {
  type    = string
  default = null
}

...这样您就可以将空字符串识别为与没有字符串不同,类似于false根本没有布尔值。


null在 a 的上下文中的含义与在其他地方的含义略有不同default。设置default = null指定输入​​变量是可选的,但不为其提供默认值。或者,如果您愿意,可以说它的默认值为 null.

以这种方式使用的一个优点null是您可以按原样将该参数传递给任何可选的资源参数,并且它将被解释为好像该参数根本没有设置,而不是好像它被设置为默认值。

还有一个“特殊功能” null:如果您将 splat 运算符[*]与非列表值一起使用,那么它将为非空值返回一个单元素列表,为空值返回一个空列表。如果您打算使用值的“null-ness”来决定是否创建资源或嵌套块,这可能特别有用:

variable "subscription_id" {
  type    = string
  default = null
}

data "azurerm_subscription" "example" {
  # Will be an empty set if `var.subscription_id` is null, or
  # a single-item set if it is a non-null string.
  for_each = toset(var.subscription_id[*])

  subscription_id = each.key
}

推荐阅读