ADG Оставить заявку
Блог DevOps 5 мин чтения

OpenTofu: берём форк Terraform в руки и смотрим, что с ним делать

Linux Foundation выпустила OpenTofu - форк Terraform под открытой лицензией. Проверяем совместимость на тестовом проекте и составляем план перехода.

Контекст момента

OpenTofu запущен Linux Foundation как форк Terraform с полной совместимостью с Terraform 1.5, октябрь 2023

Две недели назад Linux Foundation выпустила первую публичную сборку OpenTofu - форка Terraform. Мы писали про смену лицензии HashiCorp и появление OpenTF Foundation в октябре, тогда же пообещали взять форк в руки как только будет что щупать. Обещание выполняем.

Коротко про предысторию для тех, кто пропустил: в августе HashiCorp перевела Terraform на Business Source License 1.1, сообщество форкнуло проект под именем OpenTofu, Linux Foundation взяла его под крыло. OpenTofu основан на кодовой базе Terraform 1.5, то есть до смены лицензии. Лицензия OpenTofu - Mozilla Public License 2.0.

Что мы проверяли

Брать в качестве подопытного клиентский проект в продакшне - очевидно, плохая идея. Поэтому мы подняли отдельный тестовый стенд: небольшой кластер в облаке с несколькими модулями - сеть, группы безопасности, пара виртуальных машин, S3-бакет. Набор компактный, но покрывает типичную структуру проектов под управляемой инфраструктурой.

Задача была простая: взять существующий Terraform-проект под версию 1.5, поставить OpenTofu, прогнать init, plan, apply - и посмотреть, что сломается.

Установка и первый запуск

OpenTofu поставляется через собственный репозиторий пакетов, есть сборки под Linux x86_64, arm64 и macOS. Бинарник называется tofu, не terraform. Это важно: если в скриптах CI прибито terraform <команда> - надо либо переименовывать, либо делать алиас или обёртку.

# Debian/Ubuntu
curl -fsSL https://get.opentofu.org/install-opentofu.sh | sh -s -- --install-method deb

После установки запускаем tofu version - получаем версию OpenTofu. Идём в каталог с проектом.

tofu init прошёл без замечаний. Провайдеры подтянулись из registry - и вот здесь первый приятный момент: OpenTofu использует тот же Terraform Registry. Провайдеры не надо нигде переписывать, не надо менять источники в required_providers. Всё то же самое.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

Этот блок работает в OpenTofu без изменений. tofu init скачал провайдер, tofu plan показал план - идентичный тому, что показывал terraform plan на той же кодовой базе.

Что совместимо, что нет

После нескольких часов работы с тестовым проектом выводы такие.

Синтаксис HCL - полная совместимость. Ни одного .tf-файла не пришлось трогать. Ресурсы, data-источники, переменные, outputs, locals - всё читается без изменений.

Провайдеры - работают. Это, пожалуй, ключевой момент: протокол взаимодействия между бинарником OpenTofu и провайдерами остался тем же. Провайдеры не знают, кто их вызывает - Terraform или OpenTofu. Это значит, что весь зоопарк провайдеров, который накопился в проектах, не требует замены.

Стейт - формат совместим. Мы взяли существующий стейт-файл от Terraform 1.5 и передали его OpenTofu. tofu plan корректно увидел уже созданные ресурсы и показал пустой план изменений. Конвертации, ручных правок, ничего лишнего.

Terraform Cloud / HCP Terraform - сюда не ходили, не смотрели. OpenTofu использует собственный state backend без привязки к облакам HashiCorp. S3-бэкенд, HTTP-бэкенд, локальный файл - всё работает.

terraform блок в коде - ключевое слово остаётся terraform, не меняется на tofu. Это правильное решение: минимальные изменения при миграции.

Где натолкнулись на шероховатости

Первая - это CI. Наши пайплайны зашиты на образ hashicorp/terraform. Придётся либо переключаться на ghcr.io/opentofu/opentofu, либо делать свой образ. Не страшно, но это работа.

Вторая - tflint. Популярный линтер для Terraform работает с OpenTofu, но плагины под конкретные провайдеры иногда выдают предупреждения об несовместимом бинарнике. На практике это не мешает работе, но выглядит некрасиво в логах.

Третья - документация. Документация OpenTofu пока дублирует Terraform-документацию с минимальными правками. Для 1.6 - нормально, инструмент и не должен отличаться. Но если хочется понять, что именно изменено или добавлено относительно Terraform, ответ найти не всегда просто.

План перехода для production-проектов

Мы не торопимся переводить всё немедленно. OpenTofu - первый публичный pre-release, проекту несколько недель. Взвешенный подход выглядит так.

Первый шаг - новые проекты. Новые инфраструктурные проекты, которые стартуют после выхода стабильного релиза, запускаем на OpenTofu. Стейт с самого начала в OpenTofu, привыкаем к tofu как к основной команде.

Второй шаг - внутренние проекты. Инфраструктура самой команды - стенды, мониторинг, CI - переводится в ближайшие пару месяцев. Это даст реальный опыт с реальной нагрузкой без рисков для клиентов.

Третий шаг - клиентские проекты по согласованию. Переход только при плановых работах, не как самоцель. Объясняем ситуацию с лицензией, предлагаем план. Оба инструмента сейчас совместимы, поэтому спешить незачем - но и откладывать на год тоже не хочется.

Что в итоге

OpenTofu технически делает именно то, что обещает: это Terraform 1.5 под открытой лицензией. Синтаксис идентичен, провайдеры работают, стейт совместим. Никакого магического нового функционала нет - это не цель первого релиза.

Главный вопрос сейчас - не «работает ли OpenTofu», а «что будет с экосистемой через полгода-год». Темп коммитов в репозитории приличный, за проектом стоит Linux Foundation, несколько крупных компаний объявили о поддержке. Это обнадёживает, но не гарантирует ничего.

Пока что OpenTofu выглядит как рабочая альтернатива, а не как сырой эксперимент. Мы начинаем переходить - осторожно, по плану.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.