В документация или в их база данных ошибок оба автора, похоже, предпочитают записывать выражение следующим образом:
var.a != "" ? var.a : "default-a"
Значение явно проверяется на то, чтобы оно не было равно пустой строке, затем делается соответствующий двоичный выбор.
Однако работает ли и это?
var.a ? var.a : "default-a"
Я не нашел, что это явно указано в любом случае.





До 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" }
Обработка подобных преобразований типов всегда является компромиссом при проектировании языка, и разные языки идут здесь на разные компромиссы.
Для языка Terraform, в частности, философия такова: «явное лучше, чем неявное»: идея состоит в том, что в идеале кто-то, кто не знаком с конфигурацией и, возможно, даже не знаком с самим Terraform, может прочитать конфигурацию Terraform и сделать хорошее предположение о том, что это такое. означает, что не нужно запоминать множество неявных правил преобразования.
При этом Terraform делает имеет автоматическое преобразование строки в логическое значение, но не такое, чтобы пустая строка преобразовывалась в ложь. Вместо этого строковые значения "true" и "false" сопоставляются с true и false соответственно, и любая другая строка вызовет ошибку преобразования.
Разрешение на преобразование этих конкретных строковых значений в основном мотивировано обратной совместимостью: до Terraform 0.12 не существовало логического типа было, и поэтому строки, содержащие эти значения, были единственным способом представления логических значений.
При проверке того, является ли строка пустой, Terraform требует, чтобы она была явно записана как var.string == "" или var.string != "", чтобы намерение было явным и понятным читателю.
(Я являюсь одним из авторов документации, связанной с вопросом, и автором комментария, связанного с вопросом. На момент написания я работал над Terraform в HashiCorp.)