我有一个模块,用于控制少量相似的资源,并且这些资源中的许多设置是相同的;因此,我创建了全局默认值,模块中的所有资源均可引用。
我想在我的模块中有一组默认变量,并且如果我的模块的调用者决定传递这些变量,则这些变量可以覆盖默认值。下面是我一直在使用的字符串(这些是全部都放在我模块中的同一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 = ""
}
与""
不兼容。
我还能怎么做?
答案 0 :(得分:3)
在Terraform中,关键字null
表示缺少任何值。
鉴于此,为了区分true
,false
和根本没有设置,您可以定义如下变量:
variable "x_lock" {
type = bool
default = null
}
请注意,这并不是“等同于布尔值的空字符串”。空字符串不等于null
,因此,如果要明确表示缺少 string ,通常最好也使用null
:< / p>
variable "x_env" {
type = string
default = null
}
...以这种方式,您可以将一个空字符串与根本没有字符串区别开来,类似于将false
与根本没有布尔值区分开。
null
在default
的上下文中的含义与其他地方略有不同。设置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
}