Terraform 如何使用null和其他值代替默认值

Terraform 如何使用null和其他值代替默认值,terraform,Terraform,我知道,如果未指定var,可以像这样使用null来设置默认行为: variable "override_private_ip" { type = string default = null } resource "aws_instance" "example" { # ... (other aws_instance arguments) ... private_ip = var.override_private_ip } 但是如果没有指定,我想设置自己的默认行为 我正在

我知道,如果未指定var,可以像这样使用null来设置默认行为:

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

resource "aws_instance" "example" {
  # ... (other aws_instance arguments) ...
  private_ip = var.override_private_ip
}
但是如果没有指定,我想设置自己的默认行为

我正在这样做:

#### if user sets an id use that but if not get id from data source
resource "aws_instance" "myserver" {
  ami = var.ami_id != null ? var.ami_id : data.aws_ami.getami.id

这似乎有效,但这是正确的方法吗?我想确保我没有错过这个功能。我刚刚试过
var.ami\u id?var.ami\u id:data.aws\u ami.getami.id
但是null没有转换成bool,因此不起作用

像您展示的那样的条件表达式确实是在Terraform中表达这一点的正确方法。正如您所看到的,Terraform不认为<代码> null >代码是一个布尔错误。
对于这种特殊情况,似乎没有必要这样做,但如果您有在许多地方使用的输入变量,在这些地方所有的使用都需要相同的规范化/准备逻辑,那么您可以将表达式分解为a,以便多次使用它:

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

data "aws_ami" "example" {
  count = var.ami_id == null ? 1 : 0

  # ...
}

locals {
  ami_id = var.ami_id != null ? var.ami_id : data.aws_ami.example[0].id
}

resource "aws_instance" "example" {
  # ... (other aws_instance arguments) ...
  ami = local.ami_id
}

然后,您可以在模块中多次使用
local.ami\u id
,而无需复制处理默认值查找的逻辑。

我认为您可以默认为
“false”
,并根据Terraform的类型强制来获得更短的三元语句(如果需要)。我不认为有一个字符串类型的默认布尔值,并且依赖于未指定的类型强制来工作,这有点混乱。在许多语言中,
null
被认为是
false
,所以有趣的是,这在Terraform DSL中不是真的。也就是说,这里的问题基本上是“如何为必需的参数进行可选输入”。你可以考虑做一个
local
。您还可以将一个空的默认值与一个
coalesce
函数相结合,这就是我在<0.12中通常处理这个问题的方式。我会发布一个答案,但这个问题是开放式的。