Где Terraform читает настройки
Поведение CLI настраивается в двух местах:
- Файл
~/.terraformrc(Linux/macOS) или%APPDATA%\terraform.rc(Windows). HCL-формат. Читается один раз при запуске любой команды. - Переменные окружения
TF_*. Читаются при каждом запуске terraform. Имеют приоритет надterraformrcтам, где значения пересекаются.
Эти файлы, про CLI, не про конфигурацию проекта. В них нет ресурсов и нет state. Это «как мне удобно работать с terraform», а не «что terraform создаёт».
~/.terraformrc, что туда обычно кладут
plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"
disable_checkpoint = true
credentials "app.terraform.io" {token = "..."
}
plugin_cache_dir, общая папка для скачанных плагинов на все проекты. Без неё каждыйterraform initскачивает провайдеры заново в локальную.terraform/, и у тебя дублируются гигабайты. С кешемinitдля нового проекта занимает секунды.disable_checkpoint = trueотключает фоновую проверку «есть ли новая версия Terraform». Не критично, но в офлайн-сетях избавляет от шума.credentials, токен для приватных registry (Terraform Cloud, Spacelift). В учебном курсе обычно не нужно.
Папку под plugin_cache_dir нужно создать самому: mkdir -p ~/.terraform.d/plugin-cache.
Переменные окружения
Управление выводом и поведением
TF_LOG, уровень логирования. Значения:TRACE,DEBUG,INFO,WARN,ERROR. ПриDEBUGвидны все HTTP-вызовы к провайдеру. Главный инструмент дебага, когдаapplyпадает с непонятной ошибкой:bashTF_LOG=DEBUG terraform apply 2> debug.log
TF_LOG_PATH, куда писать лог. Если не задан, лог идёт в stderr.TF_INPUT=0, отключить интерактивные вопросы (для CI).TF_IN_AUTOMATION=true, сообщает terraform, что он в pipeline. Сокращает вывод и убирает подсказки про следующие шаги.
Передача переменных в HCL
TF_VAR_имя, задать значение переменнойvariable "имя"из HCL. Пример:bashexport TF_VAR_bucket_name="my-bucket-from-env"
terraform plan
TF_CLI_ARGS, добавить флаги к любой команде. Пример: чтобы всегда передавать-input=falseв любой запуск, не дописывая в каждом вызове:bashexport TF_CLI_ARGS="-input=false"
TF_CLI_ARGS_plan,TF_CLI_ARGS_applyи т.д. То же самое, но только для конкретной команды.
Управление кешем и backend
TF_DATA_DIR, где терраформ создаёт.terraform/. По умолчанию, рядом с.tf-файлами; можно вынести в/tmp/, если проект на read-only ФС.TF_CLI_CONFIG_FILE, путь к альтернативномуterraformrc-файлу. Полезно, если в CI нужен один файл конфигурации, а локально, другой.
TF_LOG, как пользоваться
Самый ходовой сценарий: terraform apply падает с
«Error: failed to get versions...» без подробностей. Запускаешь
то же самое с DEBUG:
TF_LOG=DEBUG TF_LOG_PATH=./tf.log terraform apply
В tf.log будет полный HTTP-разговор: на какой URL пошёл, какой
ответ получил, на каком этапе провайдер сломался. Часто видно, что
упёрся в прокси, упёрся в DNS или получил 429 от регистра.
Уровни:
| Уровень | Когда использовать |
|---|---|
ERROR | только ошибки. Дефолт без флага. |
WARN | + warnings (deprecated, retries). |
INFO | + базовые шаги (init, plan, apply фазы). |
DEBUG | + HTTP-вызовы. Самый полезный для повседневной отладки. |
TRACE | + внутренности (раскрытие graph, parsing). Многословный, нужен редко. |
Подводные камни
TF_VAR_имячувствителен к регистру.TF_VAR_Regionподставится в переменнуюRegion, а неregion. Лучше держать имена переменных строчными.TF_CLI_ARGSсклеивается с реальными флагами. Если в env стоитTF_CLI_ARGS="-no-color", и ты запускаешьterraform plan -no-color, провайдер увидит два-no-color, это обычно безвредно, но при дубликате значимых флагов поведение непредсказуемо.plugin_cache_dirне лочит версии. Кеш просто избавляет от скачивания. Версии всё равно фиксирует [[tf-lockfile|lockfile]].- TF_LOG может вывести секреты. В DEBUG-логе видны заголовки и
тела HTTP-запросов. Не публикуй сырой лог в issue, фильтруй
Authorization,*_token,*_key. ~/.terraformrcи проектнаяprovider-конфигурация, про разное. В terraformrc нет регионов и не указываются ресурсы; регион ставится в [[tf-provider-block|блок provider]].