代码之家  ›  专栏  ›  技术社区  ›  MrDuk

对于地形中的布尔人来说,什么是等效的?

  •  0
  • MrDuk  · 技术社区  · 5 年前

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

    我希望在我的模块中有一组默认变量,如果模块的调用者决定传入这些变量,则可以覆盖默认变量。下面是我对字符串的用法(这些都是相同的) 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 .

    我还能怎么做呢?

    0 回复  |  直到 5 年前
        1
  •  3
  •   Martin Atkins    5 年前

    在Terraform中,没有值的情况由关键字表示 null ,它对任何类型都有效。

    鉴于此,为了区分 true , false ,并且完全不设置。您可以定义如下变量:

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

    请注意,说这“相当于布尔值的空字符串”并不是真的。空字符串不等于 无效的 ,所以如果你想显式地表示 一串 它通常是最好的使用方法 无效的 为此:

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

    ...这样,您就可以将空字符串识别为完全不同于无字符串,类似于区分空字符串 错误的 从根本没有布尔值。


    无效的 在上下文中有稍微不同的含义 default 比其他地方都好。背景 default = 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
    }