terraform plan и apply
Тема дорожной карты · Terraform
terraform plan и terraform apply — это две основные команды Terraform CLI, управляющие жизненным циклом изменений IaC: terraform plan вычисляет и отображает разницу между текущим terraform.tfstate и желаемой HCL-конфигурацией, тогда как terraform apply выполняет эти изменения против целевой инфраструктуры на AWS, Azure, GCP, Kubernetes, Yandex Cloud или любом другом провайдере. Запуск terraform plan -out=tfplan.json сохраняет план выполнения в файл, чтобы terraform apply tfplan.json применял ровно те изменения, которые были проверены — не больше и не меньше — что обязательно для production CI/CD-конвейеров. terraform plan завершается с кодом 2 при наличии ожидающих изменений, обеспечивая автоматическое gating в GitHub Actions и других CI-инструментах, проверяющих незапланированный дрейф. Всегда тщательно проверяйте вывод terraform plan перед запуском terraform apply, уделяя особое внимание ресурсам, отмеченным для удаления (-) или принудительной замены (-/+), поскольку эти операции могут быть необратимы.
Как это работает
terraform plan и apply — один Go-бинарник (terraform или tofu). Установка: tfenv / tfswitch (версионник — рекомендуется, проекты пинят версии), официальный tarball, пакетные менеджеры (Homebrew, apt). Раскладка проекта: *.tf конфиги, terraform.tfvars (или *.auto.tfvars) для значений переменных, .terraform/ (в gitignore — плагины провайдеров + lockfile), terraform.tfstate (state-файл — НИКОГДА не коммитьте, если содержит секреты; используйте remote backend). Команды: init, plan, apply, destroy, validate, fmt.
Когда применять
Всегда закрепляйте версию Terraform / OpenTofu (required_version = ">= 1.5") и провайдеров (required_providers { ... version = "~> 5.0" }) — иначе у разных членов команды разное поведение. tfenv/tfswitch — чтобы per-project версии не конфликтовали. Коммитьте .terraform.lock.hcl (этот — да), версии провайдеров детерминированы. Всегда terraform fmt перед коммитом; CI должна enforce.
Типичные ошибки
Ловушки terraform plan и apply: нет пиннинга версий → "работает на моём ноуте" / breaking change в CI; удаление .terraform/ и init без lockfile (можете получить другую patch-версию провайдера); terraform apply с ноута в production (нет audit trail — используйте CI); переключение Terraform на OpenTofu в середине проекта без тестов миграции (мелкие, но реальные расхождения).