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/lessons/tf-beginner-02-variables

lesson ── terraform-beginner ── ~10 мин ── 4 шагов

Переменные: убираем хардкод

В прошлом уроке имя бакета было захардкожено в HCL. Это плохо: для каждого окружения нужно править код. Сейчас вынесем имя в variable и научим Terraform получать значение из CLI или из файла.

Переменные. Это главный механизм, чтобы один HCL работал в dev, staging и prod. См. tf-variable и tf-variable-sources.

▶ интерактивный sandbox

Поднимется пара контейнеров: terraform 1.9 и localstack 3.8 в одной сети. В браузере откроется терминал, можно сразу terraform init. Каждый шаг проверяется автоматически. TTL 45 минут, без регистрации.

запустить sandbox →

stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Объяви переменную env

    В директории ~/tf-vars уже есть provider.tf. Создай рядом файл variables.tf с одной переменной:

    hcl
    variable "env" {
      type        = string
      description = "Окружение: dev, staging или prod"
      default     = "dev"
    }

    type = string. Terraform проверит что переданное значение действительно строка. default = "dev", если значение нигде не задано, возьмёт это.

    Подробнее про блок variable, tf-variable.

    подсказка

    Файл `variables.tf`: это конвенция, можно было бы написать всё в одном `main.tf`. Но разделение помогает читать.

    ✓ Переменная объявлена. Теперь используем её в ресурсе.

  2. 02

    Используй переменную в имени бакета

    Создай файл main.tf с бакетом, имя которого зависит от var.env:

    hcl
    resource "aws_s3_bucket" "demo" {
      bucket = "linuxlab-${var.env}-${random_id.suffix.hex}"
      tags = {
        Environment = var.env
        ManagedBy   = "terraform"
      }
    }
    resource "random_id" "suffix" {
      byte_length = 4
    }

    Префикс var. обязателен, это синтаксис ссылки на переменную. Внутри строки нужны ${...} для interpolation, в обычном аргументе, просто var.env. См. tf-references и tf-interpolation.

    подсказка

    `${var.env}` внутри строки, `var.env` в обычном аргументе типа `Environment = var.env`.

    ✓ var.env подставится в имя и теги.

  3. 03

    init и plan с default-значением

    Сделай:

    bash
    cd /home/student/tf-vars
    terraform init
    terraform plan

    Так как env не задано снаружи, Terraform возьмёт default = "dev". В plan имя бакета должно начаться с linuxlab-dev-.

    подсказка

    Если init упал: проверь что в `provider.tf` нет лишних правок.

    ✓ default подставился, имя бакета содержит 'dev'.

    То же самое на OpenTofu

    OpenTofu держит CLI и state совместимыми с Terraform по командам этого шага: миграция обычно проходит через mv .terraform .terraform.bak; tofu init -upgrade. Но при первом переходе сделай backup state и прогон на feature-branch - расхождения концентрируются в новых фичах (variables в backend, state-encryption, OCI registry-backed модули). См. tf-opentofu-parity для полной матрицы.

    • → OpenTofu parity
  4. 04

    Apply с другим значением через -var

    Теперь применим конфигурацию с окружением prod. Можно тремя способами; попробуй через -var:

    bash
    terraform apply -auto-approve -var='env=prod'

    Имя созданного бакета будет начинаться с linuxlab-prod-. Это перебивает default и без правки HCL делает совершенно другое развёртывание.

    подсказка

    Кавычки вокруг env=prod: обязательны для shell, иначе он съест знак =.

    ✓ В state: бакет с тегом Environment=prod. Переменные работают.

    Приоритет источников

    Terraform читает значения из шести мест. Если значение задано несколькими, выигрывает то что ближе к CLI:

    1. -var в CLI (самый высокий приоритет)
    2. -var-file в CLI
    3. *.auto.tfvars (по алфавиту)
    4. terraform.tfvars
    5. env TF_VAR_*
    6. default в блоке variable (самый низкий)
    • → Источники значений переменных
    • → Файлы .tfvars

Что ты узнал

Ты вынес имя бакета в variable, увидел четыре способа задать значение (CLI, env, .tfvars, default) и понял их приоритет.

команды

  • terraform plan -var='env=prod'значение через CLI
  • TF_VAR_env=prod terraform planзначение через env
  • terraform plan -var-file=prod.tfvarsзначение из файла

концепции

  • · variable: вход, output: выход, locals, внутреннее
  • · Приоритет: -var > -var-file > *.auto.tfvars > terraform.tfvars > env > default
  • · default нужен только если значение опционально

← предыдущий

CDKTF, Terraform из TypeScript

следующий →

Troubleshooting Garden: state и облако разъехались

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки