OpenTofu 1.6 GA: переводим первый production-проект с Terraform
OpenTofu 1.6 вышел как production-ready релиз под MPL 2.0. Переводим реальный проект: миграция state-файлов занимает 20 минут, провайдеры работают без изменений.
OpenTofu 1.6 выпущен Linux Foundation как production-ready форк Terraform под открытой лицензией MPL 2.0, декабрь 2023
В октябре мы щупали OpenTofu 1.6 на тестовом стенде и осторожно писали «начинаем переходить - по плану». Декабрь - время выполнять обещания. Linux Foundation объявила OpenTofu 1.6 production-ready, и мы взяли первый реальный клиентский проект под управляемой инфраструктурой и перевели его на OpenTofu. Пишем, как это выглядело на практике.
Почему именно сейчас
В октябре главным сдерживающим фактором была осторожность: первый стабильный релиз, ему несколько недель, непонятно что с экосистемой. За два месяца картина прояснилась. Темп разработки нормальный, несколько крупных компаний публично подтвердили использование в продакшне, критических багов, о которых орало бы комьюнити, не было. Достаточно, чтобы начинать.
Для первого перехода выбрали проект с умеренной сложностью: Yandex Cloud, несколько модулей (сеть, группы безопасности, кластер Kubernetes, S3-бакеты), state в удалённом S3-бэкенде. Не самый простой, но и не самый критичный - если что пойдёт не так, есть время разобраться.
Подготовка
Перед миграцией сделали три вещи.
Первое - резервная копия state-файла. Звучит банально, но это обязательный шаг. Скопировали .tfstate из S3 в отдельный бакет с версионированием. Если что-то пойдёт плохо - откат на Terraform без потерь.
Второе - зафиксировали версию Terraform. Убедились, что все в команде работают с одной версией (1.5.7) и что terraform plan на чистом рабочем дереве показывает пустой план. Никаких скрытых отложенных изменений.
Третье - обновили .terraform.lock.hcl. Lockfile фиксирует хеши провайдеров под конкретную платформу. OpenTofu его читает, но при tofu init пересчитывает под себя. Лучше это сделать явно, а не получить сюрприз в CI.
Сама миграция
Процедура оказалась предсказуемо скучной - в хорошем смысле.
# Ставим OpenTofu (Debian/Ubuntu)
curl -fsSL https://get.opentofu.org/install-opentofu.sh | sh -s -- --install-method deb
# Проверяем
tofu version
# OpenTofu v1.6.0
# В каталоге проекта
tofu init
tofu plan
tofu init скачал провайдеры, прочитал существующий lockfile и пересоздал его под OpenTofu. Провайдер Yandex Cloud подтянулся из registry без каких-либо изменений в required_providers - source остался yandex-cloud/yandex, ничего переписывать не пришлось.
tofu plan показал пустой план. Ровно то, что мы хотели увидеть: OpenTofu прочитал state, увидел, что инфраструктура соответствует коду, и не предложил ничего трогать.
Весь процесс от начала до момента, когда мы запустили tofu apply и убедились что ничего не взорвалось - около 20 минут. Большая часть времени ушла на init с загрузкой провайдеров и на проверку плана глазами.
Что пришлось поменять
В самом Terraform-коде - ноль изменений. Ни одного .tf-файла не тронули.
Изменения были только в инфраструктуре вокруг:
- CI/CD: заменили образ
hashicorp/terraform:1.5.7наghcr.io/opentofu/opentofu:1.6.0в пайплайне. Команды остались те же, простоtofuвместоterraform. - Скрипты: два скрипта для планирования и применения изменений использовали жёстко прописанный путь к бинарнику. Заменили на
tofu. - Документация для клиента: обновили инструкцию для локального запуска. Люди, которые иногда запускают план руками, должны знать, что теперь нужен
tofu, а неterraform.
Нюансы, которые стоит знать
Два момента, о которых не написано в документации OpenTofu, но которые мы поймали на практике.
State версионирования. OpenTofu пишет в state поле terraform_version - там теперь стоит OpenTofu 1.6.0 вместо Terraform 1.5.7. Это не проблема для OpenTofu, но если попробовать открыть такой state обратно в Terraform - получите предупреждение о несовместимой версии. Обратная миграция - отдельная процедура, не мгновенная. Выбор надо делать осознанно.
tflint в CI. Линтер работает, но плагин tflint-ruleset-terraform ругается на то, что бинарник не terraform. Конкретно для этого проекта мы просто выключили проверку версии бинарника в конфиге tflint - она проверяла, что бинарник называется terraform, а не что код корректный.
Общие впечатления
Переход прошёл тише, чем мы ожидали. Для проекта с умеренной сложностью это действительно 20 минут работы плюс обновление CI. Провайдеры работают, HCL тот же, state совместим - OpenTofu делает именно то, что обещал.
Теперь у нас есть один реальный проект на OpenTofu в продакшне. Следующий шаг по плану - перевести ещё два-три проекта в январе, уже с опорой на полученный опыт. Если где-то вылезет что-то неожиданное - напишем.
На Terraform 1.5.x остаётся большая часть клиентских проектов - переводить всё одним махом нет смысла, это делается при плановых работах. Но пробка снята: мы знаем, что процедура работает, и знаем, на что смотреть.
- OpenTofu: берём форк Terraform в руки и смотрим, что с ним делать · 19 октября 2023
- HashiCorp BSL и OpenTofu: разбираемся, что это значит для наших проектов · 5 октября 2023