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 минут, без регистрации.
stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя
В директории ~/tf-vars уже есть provider.tf. Создай рядом
файл variables.tf с одной переменной:
variable "env" {type = string
description = "Окружение: dev, staging или prod"
default = "dev"
}
type = string. Terraform проверит что переданное значение действительно
строка. default = "dev", если значение нигде не задано, возьмёт это.
Подробнее про блок variable, tf-variable.
Файл `variables.tf`: это конвенция, можно было бы написать всё в одном `main.tf`. Но разделение помогает читать.
✓ Переменная объявлена. Теперь используем её в ресурсе.
Создай файл main.tf с бакетом, имя которого зависит от var.env:
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 подставится в имя и теги.
Сделай:
cd /home/student/tf-vars
terraform init
terraform plan
Так как env не задано снаружи, Terraform возьмёт default = "dev".
В plan имя бакета должно начаться с linuxlab-dev-.
Если init упал: проверь что в `provider.tf` нет лишних правок.
✓ default подставился, имя бакета содержит 'dev'.
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 для полной матрицы.
Теперь применим конфигурацию с окружением prod. Можно тремя способами;
попробуй через -var:
terraform apply -auto-approve -var='env=prod'
Имя созданного бакета будет начинаться с linuxlab-prod-. Это
перебивает default и без правки HCL делает совершенно другое
развёртывание.
Кавычки вокруг env=prod: обязательны для shell, иначе он съест знак =.
✓ В state: бакет с тегом Environment=prod. Переменные работают.
Terraform читает значения из шести мест. Если значение задано несколькими, выигрывает то что ближе к CLI:
Ты вынес имя бакета в variable, увидел четыре способа задать
значение (CLI, env, .tfvars, default) и понял их приоритет.
команды
terraform plan -var='env=prod'значение через CLITF_VAR_env=prod terraform planзначение через envterraform plan -var-file=prod.tfvarsзначение из файлаконцепции