terraform中的非空字符串是否正确?

时间:2019-07-10 09:47:10

标签: terraform terraform-0.11.7

documentation或他们的bug database中,两位作者似乎都喜欢这样写表达式:

var.a != "" ? var.a : "default-a"

明确测试该值不等于空字符串,然后相应地进行二进制选择。

但是,这也可以吗?

var.a ? var.a : "default-a"

我还没有找到明确指出的任何一种方式。

2 个答案:

答案 0 :(得分:2)

在Terraform 0.12之前,Terraform在幕后使用强制类型对布尔值和整数进行了一些有趣的处理,因为从技术上讲,它仅支持字符串,列表和映射。

因此,如果您执行以下操作:

variable "foo" {
  default = "true"
}

output "truthiness" {
  value = "${var.foo ? var.foo : "default-foo" }"
}

那么您可以期待以下输出:

$ terraform apply
Using temporary credentials from master-read-only profile...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

truthiness = true
$ TF_VAR_foo=false terraform apply
Using temporary credentials from master-read-only profile...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

truthiness = default-foo

这甚至适用于01

$ TF_VAR_foo=1 terraform apply
Using temporary credentials from master-read-only profile...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

truthiness = 1
$ TF_VAR_foo=0 terraform apply
Using temporary credentials from master-read-only profile...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

truthiness = default-foo

但是,如果您尝试使用Terraform无法将强制类型输入为布尔值的字符串,则它将无法解析并且会出错:

$ TF_VAR_foo="" terraform apply
Using temporary credentials from master-read-only profile...

Error: output.truthiness: __builtin_StringToBool: strconv.ParseBool: parsing "": invalid syntax in:

${var.foo ? var.foo : "default-foo" }
$ TF_VAR_foo="bar" terraform apply
Using temporary credentials from master-read-only profile...

Error: output.truthiness: __builtin_StringToBool: strconv.ParseBool: parsing "bar": invalid syntax in:

${var.foo ? var.foo : "default-foo" }
$ TF_VAR_foo=2 terraform apply
Using temporary credentials from master-read-only profile...

Error: output.truthiness: __builtin_StringToBool: strconv.ParseBool: parsing "2": invalid syntax in:

${var.foo ? var.foo : "default-foo" }

答案 1 :(得分:1)

处理此类类型转换始终是语言设计中的一个折衷,不同的语言在这里会做出不同的折衷。

特别是对于Terraform的语言,其哲学是“显式胜于隐式”:理想情况是,一个不熟悉配置,甚至可能不熟悉Terraform本身的人都可以阅读Terraform配置并做出很好的猜测意味着什么,而无需记住很多隐式转换规则。

话虽如此,Terraform 确实具有从字符串自动转换为布尔值的功能,但不能将空字符串转换为false。相反,字符串值"true""false"分别映射到truefalse,其他任何字符串都会产生转换错误。

允许转换这些特定字符串值的主要原因是向后兼容:在Terraform 0.12之前,没有 布尔类型,因此包含这些值的字符串是表示布尔值的唯一方法。 / p>

在测试字符串是否为空时,Terraform要求将其显式写为var.string == ""var.string != "",以便读者可以清楚地看到其意图。


(我是从问题链接到文档的作者之一,还是从问题链接到评论的作者。在撰写本文时,我在HashiCorp从事Terraform的工作。)