how/variables
Шесть источников значения для одной variable, выстроенные в очередь. Кто кого перебивает, и почему ваш .tfvars иногда «не применяется».
У переменной в Terraform может быть шесть источников значения. Каждый из них необязателен. Если значение пришло из нескольких, выигрывает тот, что выше в иерархии.
Это не магия - порядок зафиксирован в official docs
и применяется в каждом terraform plan и apply. Если ты
правил terraform.tfvars, а Terraform упорно использует другое
значение - почти всегда причина в том, что что-то выше по
иерархии его перебивает.
Жми ▶ - посмотрим, как одно и то же значение var.region ползёт
вверх по лестнице приоритетов.
В HCL:
variable "region" {type = string
default = "us-east-1"
}
Если больше ничего нет - Terraform использует "us-east-1".
Это нижняя ступенька лестницы.
Если default не задан и значение нигде не пришло - plan упадёт
с No value for required variable. Это и есть «обязательная
variable».
итого
Что важно запомнить:
-var на CLI выигрывает у всего. Удобно для разовых
«прогони с другим значением, не правя файлы». Не складывать
такие команды в скрипты - потом не найдёшь, откуда взялось
значение.*.auto.tfvars подхватываются автоматически, в алфавитном
порядке. Часто используют для разделения по окружениям:
prod.auto.tfvars, staging.auto.tfvars - но только один
из них должен лежать в директории, иначе значения смешаются.terraform.tfvars - единственный файл с этим именем, который
Terraform подхватит без флага. Имена vars.tfvars или
config.tfvars подхватываются только через -var-file=.TF_VAR_<name> - особенно полезно для секретов в CI/CD:
TF_VAR_db_password=$(vault read …) не остаётся ни в HCL, ни в
.tfvars, ни в логах команды. См. tf-sensitive.default = ... в variable - это fallback, не «значение
по умолчанию для прода». Если variable должна быть обязательной,
убери default - Terraform упадёт с No value for required variable,
и ты сразу увидишь.Подводный камень: если значение пришло из двух разных
*.auto.tfvars файлов, выигрывает алфавитно последний.
Не «последний по mtime» и не «прочитанный во время init» - просто
сортировка по имени. z-override.auto.tfvars перебьёт
prod.auto.tfvars.
Дальше: tf-sensitive про то, как Terraform обращается с секретами в этих source'ах.