terraform 中的非空字符串是否为真?

Ant*_*ong 6 terraform

文档或他们的错误数据库中,两位作者似乎更喜欢这样写出表达式:

var.a != "" ? var.a : "default-a"
Run Code Online (Sandbox Code Playgroud)

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

然而,这也有效吗?

var.a ? var.a : "default-a"
Run Code Online (Sandbox Code Playgroud)

我没有发现它以任何方式明确说明。

Mar*_*ins 10

处理像这样的类型转换总是在语言设计中进行权衡,不同的语言在这里做出不同的妥协。

特别是对于 Terraform 的语言,其理念是“显式优于隐式”:理想情况下,不熟悉配置甚至可能不熟悉 Terraform 本身的人可以读取 Terraform 配置并很好地猜测它是什么意味着,无需记住很多隐式转换规则。

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

转换那些特定字符串值的余量主要是由向后兼容性动机:事先对terraform 0.12,有没有布尔类型,因此包含这些值的字符串为表示布尔值的唯一方法。

当测试一个字符串是否为空,Terraform要求,要明确写出为var.string == ""var.string != ""使意图是明确和清晰的给读者。


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

  • 有什么参考吗?或者这只是您的愚见? (3认同)

yda*_*coR 8

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

所以如果你做这样的事情:

variable "foo" {
  default = "true"
}

output "truthiness" {
  value = "${var.foo ? var.foo : "default-foo" }"
}
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

这甚至适用于0and 1

$ 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

Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试使用 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" }
Run Code Online (Sandbox Code Playgroud)