linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/kb/Переменные и outputs/tf-tfvars

kb/variables ── Переменные и outputs ── beginner

.tfvars: файлы со значениями переменных

.tfvars, файлы со значениями переменных (HCL или JSON): terraform.tfvars и *.auto.tfvars читаются автоматически, остальные через -var-file. Главный механизм разделения «код vs конфигурация окружения».

view as markdown

Формат .tfvars-файла

Это просто HCL без блоков, пары имя_переменной = значение:

hcl
# prod.tfvars
env             = "prod"
region          = "us-east-1"
instance_count  = 3
enable_logging  = true
tags = {
  Project     = "my-app"
  Environment = "prod"
  ManagedBy   = "terraform"
}
azs = ["us-east-1a", "us-east-1b", "us-east-1c"]

Никаких variable {} блоков, только присваивания. Если переменной с таким именем нет в HCL, apply упадёт с ошибкой undeclared variable.

.tfvars.json, то же в JSON

Если файлы генерируются другой программой (Jenkins, шаблонизатор), удобнее JSON:

json
{
  "env": "prod",
  "region": "us-east-1",
  "instance_count": 3,
  "tags": {
    "Project": "my-app",
    "Environment": "prod"
  }
}

Имя должно заканчиваться .tfvars.json, не просто .json.

Что автоматически подгружается

Эти файлы Terraform читает без флагов, просто потому что они лежат в корне проекта:

  • terraform.tfvars
  • terraform.tfvars.json
  • *.auto.tfvars (любое имя с этим суффиксом)
  • *.auto.tfvars.json

Порядок чтения и приоритеты, в tf-variable-sources.

-var-file для конкретного окружения

В CI/CD обычно держат отдельные файлы:

envs/
  dev.tfvars
  staging.tfvars
  prod.tfvars
main.tf

Запускают так:

bash
terraform plan  -var-file=envs/prod.tfvars
terraform apply -var-file=envs/prod.tfvars

Эти файлы не подгружаются автоматически (нет суффикса auto). Только через -var-file.

Можно несколько раз:

bash
terraform plan -var-file=envs/base.tfvars -var-file=envs/prod.tfvars

Последний выигрывает при коллизии. Это удобный паттерн: base-значения общие, окружение их перекрывает.

Структуры в .tfvars

HCL-формат позволяет вкладывать сложные типы:

hcl
# databases.tfvars
databases = {
  primary = {
    engine            = "postgres"
    instance_class    = "db.t3.medium"
    allocated_storage = 100
  }
  analytics = {
    engine            = "postgres"
    instance_class    = "db.t3.small"
    allocated_storage = 200
  }
}

HCL прощает trailing-запятые и переводы строк, формат человеко-читаемый.

Подводные камни

  • terraform.tfvars часто в .gitignore. Это локальные значения разработчика, потенциально с секретами. Стандартный подход:

    gitignore
    terraform.tfvars
    *.auto.tfvars
    !envs/*.tfvars

    Окружения в envs/, коммитим (без секретов), terraform.tfvars и autо, игнорируем.

  • *.auto.tfvars грузятся ВСЕ. Если в репо есть dev.auto.tfvars и prod.auto.tfvars, оба прочитаются автоматически, и последний по алфавиту перебьёт первый. Это частая ловушка в работе с окружениями. Используйте -var-file если хотите контроль.

  • Алфавит, это a-z, не приоритет. prod.auto.tfvars придёт после dev.auto.tfvars (буква d < p в ASCII), но до qa.auto.tfvars. Это никак не связано с «важностью».

  • .tfvars не имеет переменных. Внутри нельзя писать env = var.something. Только литеральные значения и сложные структуры.

  • JSON и HCL не смешиваются в одном файле. Либо .tfvars, либо .tfvars.json. Но в одной директории могут быть оба формата. Terraform читает их по очереди.

  • -var-file не падает на отсутствующий файл. Если в CI забыли передать файл. Terraform запросит значения интерактивно (или упадёт с -input=false). Поэтому обязательно -input=false в CI.

  • .tfvars не место для секретов в open-source проектах. Даже если в .gitignore, могут случайно закоммитить, может утечь через CI-логи. Реальные секреты, в env (TF_VAR_*) или в secrets-manager.

§ команды

bash
terraform plan -var-file=envs/prod.tfvars

Загрузить значения для конкретного окружения.

bash
terraform plan -var-file=base.tfvars -var-file=overrides.tfvars

Несколько файлов: последний перебивает первый при коллизии.

bash
ls *.tfvars *.auto.tfvars 2>/dev/null

Проверить, какие файлы Terraform подхватит автоматически в текущей директории.

bash
terraform validate

Если в .tfvars есть значение для несуществующей переменной: validate ругнётся.

§ см. также

  • tf-variableБлок variable: вход в конфигурациюvariable, параметр, который принимает значение снаружи (CLI, env, .tfvars). Объявляешь в HCL: type, default, description, validation. Используешь как var.name. Нужен чтобы убрать хардкод и переиспользовать один HCL для разных окружений.
  • tf-variable-sourcesОткуда Terraform берёт значения переменныхИсточников шесть с приоритетом: -var в CLI > -var-file > *.auto.tfvars (по алфавиту) > terraform.tfvars > env TF_VAR_* > default. Если значения нет нигде. Terraform спросит интерактивно. Понимание приоритета критично для CI/CD.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки