Как работает Terraform под капотом и кто такой OpenTofu

Рейтинг: 67.6% · 8 голосов
Подробный курс по Terraform и OpenTofu на примерах Yandex Cloud: ресурсы и провайдеры, состояние и бэкенды, модули, циклы и условия HCL, секреты и Lockbox, тестирование, CI/CD и командная работа. С актуализацией на 2026 (Terraform 1.3-1.10, OpenTofu).
Ответить
Аватара пользователя
Vlad_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Как работает Terraform под капотом и кто такой OpenTofu

Сообщение Vlad_DevOps »

Оглавление курса (47)
  1. Что такое инфраструктура как код и зачем она нужна
  2. Категории инструментов IaC: чем отличаются Ansible, Packer, Kubernetes и Terraform
  3. Чем Terraform отличается от Ansible, Pulumi и CloudFormation
  4. Как работает Terraform под капотом и кто такой OpenTofu (вы здесь)
  5. Установка Terraform и OpenTofu, подготовка Yandex Cloud
  6. Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud
  7. Веб-сервер на ВМ: метаданные, user-data и группы безопасности
  8. Переменные ввода и выходные значения в Terraform
  9. Кластер ВМ: группа экземпляров Yandex Compute Instance Group
  10. Балансировщик нагрузки: Application Load Balancer в Yandex Cloud
  11. Состояние Terraform: что такое tfstate и чем опасен локальный файл
  12. Удалённое хранилище состояния: бэкенд на Yandex Object Storage
  13. Изоляция состояния: рабочие области против раскладки по папкам
  14. Источники данных и terraform_remote_state: связываем компоненты
  15. Модули Terraform: переиспользуем инфраструктуру
  16. Входные, локальные и выходные переменные модуля
  17. Версионирование модулей и подводные камни
  18. Циклы в Terraform: параметр count
  19. Циклы в Terraform: for_each по множествам и картам
  20. Выражения for и строковые директивы
  21. Условная логика: count-трюк, for_each и директива if
  22. Встроенные функции, типы и выражения HCL
  23. Развёртывание без простоя: create_before_destroy
  24. Подводные камни Terraform и рефакторинг с блоком moved
  25. Управление секретами: основы и типы
  26. Инструменты управления секретами: Yandex Lockbox, Vault, SOPS
  27. Аутентификация провайдера и секреты: сервисные аккаунты и OIDC
  28. Секреты в ресурсах и состоянии, ephemeral-значения
  29. Провайдеры Terraform: установка, версии, required_providers
  30. Несколько копий одного провайдера: alias и мультизона
  31. Несколько провайдеров и аккаунтов: configuration_aliases
  32. Terraform, Docker и Kubernetes: Managed Kubernetes в Yandex Cloud
  33. Код Terraform промышленного уровня: почему это долго
  34. Мелкие компонуемые модули вместо монолита
  35. Тестируемые модули и проверки: validation, precondition, postcondition
  36. Версионирование, публикация модулей и Terragrunt
  37. Ручное тестирование Terraform и очистка ресурсов
  38. Автоматические тесты на Terratest: модульные тесты
  39. Интеграционные и сквозные тесты, пирамида тестирования
  40. Нативный terraform test и статический анализ
  41. Внедрение Terraform в команде: процессы и культура
  42. Конвейер развёртывания прикладного кода
  43. Конвейер инфраструктурного кода и золотое правило Terraform
  44. Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code
  45. Что нового в Terraform 1.3-1.10: моды, импорт, провайдер-функции, Stacks
  46. OpenTofu в 2026: чем живёт форк и как мигрировать
  47. Сертификация HashiCorp Terraform Associate и карьера
Ты уже писал свои первые .tf файлы и видел магию: пишешь пару строк, говоришь apply - и в облаке появляется виртуалка. Но "магия" в инфраструктуре - это слово, после которого обычно следует ночной инцидент. Пока ты не понимаешь, что именно происходит между твоим кодом и API облака, ты не отлаживаешь проблемы, а гадаешь. А ещё в 2026 нельзя честно учить Terraform и не объяснить, почему половина команд в РФ пишет не terraform apply, а tofu apply. Этот урок ровно про две вещи: как устроен механизм инфраструктуры как кода изнутри и кто такой OpenTofu, который внезапно стал стандартом по умолчанию.

Ядро и провайдеры: кто здесь главный

Главное заблуждение новичка: думать, что Terraform "знает" про Yandex Cloud, AWS и сотню других облаков. Не знает. Бинарник terraform (или tofu) - это маленькое тупое ядро (core), которое умеет ровно три вещи: читать твой HCL-код, строить из него граф зависимостей и сравнивать желаемое состояние с фактическим. Всё. Ни одной строчки про конкретное облако в ядре нет.

Вся работа с реальным миром вынесена в провайдеры (providers) - это отдельные плагины. Когда ты пишешь в коде блок provider "yandex", при первом terraform init ядро скачивает плагин terraform-provider-yandex из реестра и кладёт рядом. Дальше ядро общается с плагином по локальному gRPC-протоколу, а плагин уже сам ходит в API Yandex Cloud по HTTPS и дёргает нужные ручки.

Зачем такая матрёшка? Чтобы команда Yandex могла выпускать обновления своего провайдера независимо от релизов самого Terraform. Появился новый тип диска или новая зона ru-central1-d - вышла новая версия провайдера, а ядро трогать не надо. Один и тот же бинарник ядра управляет и облаком, и DNS-провайдером, и даже базой PostgreSQL - просто плагины разные.

Изображение

Жизненный цикл: от HCL до state

Разберём по шагам, что происходит, когда ты жмёшь plan, а потом apply. Это сердце terraform plan apply, и понимать его надо до автоматизма.
  • Парсинг кода. Ядро читает все .tf файлы в папке (не один - все сразу), склеивает их в единую конфигурацию. Порядок файлов и блоков в них не важен, HCL декларативен.
  • Граф зависимостей. Ядро строит направленный граф (DAG). Если диск ссылается на сеть, а виртуалка - на диск и сеть, ядро само понимает: сначала сеть, потом диск, потом ВМ. Ты нигде не пишешь "сделай это после того" - зависимости выводятся из ссылок между ресурсами. Независимые ресурсы создаются параллельно.
  • Чтение state. Ядро открывает файл состояния (terraform state) - это JSON, где записано, что уже реально создано и с какими параметрами. На первом запуске он пустой.
  • Refresh и сравнение. Через провайдер ядро спрашивает у облака: "а эта ВМ ещё жива, у неё всё ещё 2 ядра?". Полученное сравнивается с желаемым (твой код) и с записанным (state).
  • План. Ядро выдаёт разницу (diff): что создать (+), что изменить (~), что удалить (-). Это и есть terraform plan - сухой отчёт "что я собираюсь сделать". Он ничего не меняет, его не страшно гонять хоть сто раз.
  • Apply. При apply ядро идёт по графу и для каждого ресурса вызывает у провайдера нужную CRUD-операцию: Create, Read, Update или Delete. Провайдер переводит это в конкретные вызовы API облака. После успеха ядро записывает новые данные в state.
Вот ключевая идея, которую надо вбить в голову: state - это не просто кэш, это источник правды для Terraform. Удалишь файл состояния - и инструмент решит, что в облаке ничего нет, и при следующем apply попробует создать всё заново (привет, дубли и конфликты имён). Поэтому в реальных проектах state хранят не локально, а в удалённом бэкенде, например в Yandex Object Storage. Но это тема отдельного урока, пока просто запомни: береги state как зеницу ока.

Маленький, но честный пример с реальными ресурсами провайдера yandex, чтобы было видно, откуда берутся зависимости в графе:

Код: Выделить всё

provider "yandex" {
  token     = var.yc_token
  cloud_id  = var.cloud_id
  folder_id = var.folder_id
  zone      = "ru-central1-d"
}

resource "yandex_vpc_network" "net" {
  name = "lesson-net"
}

resource "yandex_vpc_subnet" "subnet" {
  name           = "lesson-subnet"
  zone           = "ru-central1-d"
  network_id     = yandex_vpc_network.net.id
  v4_cidr_blocks = ["10.5.0.0/24"]
}

resource "yandex_compute_instance" "vm" {
  name        = "lesson-vm"
  platform_id = "standard-v3"

  resources {
    cores  = 2
    memory = 2
  }

  boot_disk {
    initialize_params {
      image_id = "fd80mrhj8fl2oe87o4e1"
    }
  }

  network_interface {
    subnet_id = yandex_vpc_subnet.subnet.id
    nat       = true
  }
}
Обрати внимание на ссылки network_id = yandex_vpc_network.net.id и subnet_id = yandex_vpc_subnet.subnet.id. Ты не писал ни одной инструкции о порядке - но граф уже знает: сеть -> подсеть -> ВМ. Это и есть та самая декларативность инфраструктуры как кода (iac).

Что случилось в августе 2023 и кто такой OpenTofu

Теперь самое важное для 2026 года. До августа 2023 Terraform был полностью открытым (лицензия MPL 2.0) - бери, форкай, встраивай в свой продукт, никаких вопросов. В августе 2023 HashiCorp внезапно сменила лицензию на BSL 1.1 (Business Source License). Это так называемая лицензия terraform bsl: код видно, но коммерчески конкурировать с HashiCorp на нём запрещено. Для обычного юзера вроде бы ничего не поменялось, но для компаний, строивших платформы поверх Terraform (Spacelift, Env0, Scalr, Gruntwork), это был удар под дых.

Реакция сообщества была быстрой и злой. Уже осенью 2023 появился форк - OpenTofu. Его взяли под крыло Linux Foundation, а в 2025 проект приняли в CNCF (туда же, где живут Kubernetes и Prometheus). OpenTofu остался на старой свободной лицензии MPL 2.0. Бинарник называется tofu, команды те же: tofu init, tofu plan, tofu apply.

Чтобы два раза не вставать, по фактам на 2026 год:
  • Лицензия. Terraform - BSL 1.1 (source-available, не open source). OpenTofu - MPL 2.0 (настоящий open source).
  • Кто управляет. Terraform теперь под IBM: в феврале 2025 IBM закрыла сделку по покупке HashiCorp за 6.4 млрд долларов. OpenTofu - под Linux Foundation и CNCF, развивается силами сообщества.
  • Совместимость. Полная. Тот же синтаксис HCL, тот же формат state, те же провайдеры (включая yandex - один и тот же бинарник плагина работает в обоих движках). Можно взять существующий проект и просто заменить terraform на tofu.
  • Версии. Стабильный OpenTofu - ветка 1.12.x (1.12.1 на июнь 2026). Terraform держится около 1.10.
  • Фичи. Тут форк уже заметно разошёлся. В OpenTofu раньше появились вещи, которых в открытом бинарнике Terraform нет: встроенное шифрование state, ранний расчёт переменных, for_each для провайдеров, флаг -exclude, поддержка OCI-реестров для модулей.
Закономерный вопрос - terraform или opentofu, что выбрать в 2026, и почему многие в РФ берут именно OpenTofu. Причин несколько. Во-первых, лицензия: MPL 2.0 предсказуема и не связана с конкретным вендором. Во-вторых, после покупки HashiCorp компанией IBM остаётся открытым вопрос доступности сервисов и регистрации - а OpenTofu можно тянуть из публичного реестра без привязки к одному вендору. В-третьих, фичи реально выходят быстрее. Если ты только начинаешь - бери OpenTofu, ты ничего не потеряешь в знаниях: 99% того, что ты учишь в этом курсе, идентично для обоих. В тексте я пишу "Terraform" как название технологии и подхода, но на практике смело подставляй tofu вместо terraform в командах.

Типичные грабли
  • Думать, что ядро знает про облако. Нет. Все ошибки вида "unsupported argument" - это про версию провайдера, а не про ядро. Обновляй провайдер, а не Terraform.
  • Руками удалять или править state. Открыл terraform.tfstate, что-то поправил "по-быстрому" - и рассинхронизировал реальность с записями. Для правок есть команды terraform state, лезть в JSON руками не надо.
  • Менять ресурсы в облаке мимо Terraform. Зашёл в консоль, добавил ВМ диск вручную - на следующем plan увидишь "drift", и apply попытается всё откатить к коду. Облако правим только через код.
  • Путать plan и apply. plan безопасен и ничего не меняет, apply меняет. Привычка всегда смотреть план перед применением спасает от удаления прода одной командой.
  • Ставить и terraform, и tofu вперемешку в команде. State совместим, но определись с одним движком на проект, чтобы не ловить разное поведение новых фич.
Мини-лаба

Руками, без зубрёжки:
  • Возьми пример из урока, выполни terraform init (или tofu init) и посмотри, какой именно плагин provider скачался и какой у него номер версии.
  • Запусти terraform plan и прочитай вывод: найди в нём знаки +, посчитай, сколько ресурсов будет создано и в каком порядке они идут.
  • Открой получившийся terraform.tfstate после apply и найди там id своей сети - это та самая строка, на которую ссылалась подсеть.
  • Замени в командах terraform на tofu (если поставил оба) и убедись, что тот же самый state читается без проблем.
Контрольные вопросы
  • Из каких двух больших частей состоит Terraform и кто из них реально ходит в API облака?
  • Что произойдёт, если удалить файл состояния, а потом запустить apply?
  • Чем отличается terraform plan от terraform apply и почему plan можно гонять сколько угодно?
  • Почему появился OpenTofu, под чьим управлением он находится и какая у него лицензия в отличие от Terraform?
Итог

Запомни три вещи. Первое: ядро Terraform тупое и про облака ничего не знает - всю грязную работу делают провайдеры-плагины, общаясь с API. Второе: цикл всегда один - HCL -> граф зависимостей -> план (diff) -> CRUD-вызовы через провайдер -> запись в state, и state тут источник правды, а не кэш. Третье: в 2026 терраформ-мир раздвоился после смены лицензии на BSL, и OpenTofu под Linux Foundation - это та же технология на свободной лицензии MPL 2.0, которую многие, особенно в РФ, выбирают по умолчанию. Всё, что ты учишь дальше, работает в обоих - просто держи в уме, что вместо terraform можно набирать tofu.
👍1 ❤️2 🔥3 😄 🤔1
Аватара пользователя
geek_sanya
Сообщения: 1
Зарегистрирован: 15 май 2026, 22:09

Re: Как работает Terraform под капотом и кто такой OpenTofu

Сообщение geek_sanya »

Спасибо, наконец-то дошло зачем нужен init - он же плагин качает, а я думал это просто папку готовит. И теперь понятно почему ошибки про unsupported argument лечатся обновлением провайдера а не самого терраформа.
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
k8s_chan
Сообщения: 1
Зарегистрирован: 13 май 2026, 18:35

Re: Как работает Terraform под капотом и кто такой OpenTofu

Сообщение k8s_chan »

А если я весь курс пройду на terraform, а на работе у нас tofu - переучиваться придется? Из урока вроде понял что нет, но хочется убедиться, команды реально один в один?
👍1 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Чем Terraform отличается от Ansible, Pulumi и CloudFormation
Следующая глава →
Установка Terraform и OpenTofu, подготовка Yandex Cloud

Все главы курса «Terraform: инфраструктура как код на Yandex Cloud»

Поделиться темой: ✈ Telegram VK
Похожие запросы: terraform yandex cloud с чего начать новичкукак установить terraform и opentofu на linuxчто такое terraform state и tfstate простыми словамиудаленный backend terraform на object storage yandex cloudчто такое инфраструктура как код iac простыми словамиterraform plan и apply что делают и чем отличаются

Вернуться в «Terraform: инфраструктура как код на Yandex Cloud»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость