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

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 остаётся большая часть клиентских проектов - переводить всё одним махом нет смысла, это делается при плановых работах. Но пробка снята: мы знаем, что процедура работает, и знаем, на что смотреть.

Контакт

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

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