在documentation或他们的bug database中,两位作者似乎都喜欢这样写表达式:
var.a != "" ? var.a : "default-a"
明确测试该值不等于空字符串,然后相应地进行二进制选择。
但是,这也可以吗?
var.a ? var.a : "default-a"
我还没有找到明确指出的任何一种方式。
答案 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
这甚至适用于0
和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
但是,如果您尝试使用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"
分别映射到true
和false
,其他任何字符串都会产生转换错误。
允许转换这些特定字符串值的主要原因是向后兼容:在Terraform 0.12之前,没有 布尔类型,因此包含这些值的字符串是表示布尔值的唯一方法。 / p>
在测试字符串是否为空时,Terraform要求将其显式写为var.string == ""
或var.string != ""
,以便读者可以清楚地看到其意图。
(我是从问题链接到文档的作者之一,还是从问题链接到评论的作者。在撰写本文时,我在HashiCorp从事Terraform的工作。)