terraform中的boolean等于“”?

时间:2019-12-19 23:57:27

标签: terraform

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

我想在我的模块中有一组默认变量,并且如果我的模块的调用者决定传递这些变量,则这些变量可以覆盖默认值。下面是我一直在使用的字符串(这些是全部都放在我模块中的同一bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard' bind-key p run 'xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer' 文件中。

我的默认设置:

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}"}"
}

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

我尝试做:

variable "x_lock" {default=true}

但是我显然收到一个错误,指出variable "x_lock" { type = bool default = "" } ""不兼容。

我还能怎么做?

1 个答案:

答案 0 :(得分:3)

在Terraform中,关键字null表示缺少任何值。

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

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

请注意,这并不是“等同于布尔值的空字符串”。空字符串不等于null,因此,如果要明确表示缺少 string ,通常最好也使用null:< / p>

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

...以这种方式,您可以将一个空字符串与根本没有字符串区别开来,类似于将false与根本没有布尔值区分开。


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

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

还有null的另一种“特殊能力”:如果将splat运算符[*]与非列表值一起使用,则它将为非空值返回单元素列表值和一个空列表以表示空值。如果您打算使用值的“空值”来决定是创建资源还是嵌套块,这将特别有用:

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
}