Является ли непустая строка достоверной в терраформе? - PullRequest
1 голос
/ 10 июля 2019

В документации или в базе данных ошибок оба автора предпочитают записывать выражение следующим образом:

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

Значение явнопроверяется, чтобы быть не равным пустой строке, затем делается двоичный выбор.

Однако, это тоже работает?

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

Я не нашел это явно указано в любом случае.

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Pre 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 не может набрать coerce для логического значения, тогда он просто не сможет разобрать и выдаст ошибку:

$ 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 голос
/ 11 июля 2019

Обработка преобразований типов, подобных этим, всегда является компромиссом при проектировании языка, и разные языки здесь делают разные компромиссы.

В частности, для языка Terraform философия «явный лучше, чем неявный»: идея в том, что в идеале тот, кто не знаком с конфигурацией и, возможно, не знаком даже с самой Terraform, может прочитать конфигурацию Terraform и сделать правильное предположение, так как к тому, что это значит, без необходимости запоминать много неявных правил преобразования.

С учетом сказанного, Terraform имеет автоматическое преобразование из строки в логическое значение, но не так, чтобы пустая строка преобразовывалась в false. Вместо этого строковые значения "true" и "false" отображаются на true и false соответственно, и любая другая строка вызовет ошибку преобразования.

Допуск преобразования этих конкретных строковых значений в основном мотивирован обратной совместимостью: до Terraform 0.12 не было без логического типа, и поэтому строки, содержащие эти значения, были единственным способом представления логических значений.

При проверке, является ли строка пустой, Terraform требует, чтобы ее явно записали как var.string == "" или var.string != "", чтобы намерение было явным и понятным для читателя.


(Я один из авторов документации, связанной с вопросом, и автор комментария, связанной с вопросом. На момент написания статьи я работал над Terraform в HashiCorp.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...