مهاجرت از Terraform به OpenTofu: راهنمای کامل
خلاصهٔ کاملتر
بعد از اینکه HashiCorp در اواخر ۲۰۲۳ لایسنس Terraform رو از MPL-2.0 به Business Source License (BSL) تغییر داد، جامعه DevOps دست به کار شد. شرکتهایی مثل Gruntwork، Spacelift، Harness، Env0 و Scalr با هم OpenTofu رو راه انداختن. این پروژه از Terraform نسخه ۱.۵x فورک شده، زیر لایسنس Mozilla Public License v2.0 کار میکنه و از آوریل ۲۰۲۵ رسماً زیر چتر CNCF (Cloud Native Computing Foundation) قرار داره. یعنی دیگه هیچ وندوری بهتنهایی کنترلش نداره و تصمیمها توسط یه کمیته راهبری فنی و جامعه گرفته میشه.
دلایل مهاجرت فقط به لایسنس ختم نمیشن. OpenTofu قابلیتهایی داره که سالها توی backlog Terraform خاک میخورد. مثلاً نسخه ۱.۷ رمزنگاری state file رو اضافه کرد؛ قابلیتی که از ۲۰۱۶ درخواستش بود. با این قابلیت دیگه لازم نیست نگران اطلاعات حساسی مثل پسورد دیتابیس، توکنها و IPها که بهصورت متن ساده توی state ذخیره میشن باشی.
یکی دیگه از قابلیتهای جذاب، ارزیابی زودهنگام متغیرها (early variable evaluation) در نسخه ۱.۸ هست. توی Terraform نمیشه توی بلوک terraform از متغیر استفاده کرد، ولی OpenTofu این محدودیت رو برداشته:
terraform {
backend "s3" {
bucket = var.bucket_name
}
}این یعنی میتونی backend رو داینامیک کنی و کانفیگهای multi-environment رو تمیزتر مدیریت کنی. OpenTofu 1.9 هم provider iteration با for_each رو اضافه کرد که برای زیرساختهای multi-region و multi-account خیلی به کار میاد:
provider "aws" {
for_each = var.regions
region = each.value
}چالشهای مهاجرت بیشتر عملیاتی هستن. اگه یه کانفیگ داری کار راحته، ولی وقتی صدها یا هزاران کانفیگ در محیطهای مختلف داری، باید اتوماسیون بنویسی. یه چالش رایج دیگه اینه که رفرنسهای hard-code شده به ریجستری HashiCorp رو پیدا و جایگزین کنی. مثلاً registry.terraform.io/hashicorp/aws باید بشه hashicorp/aws. اگه این کار رو نکنی، هر بار که tofu اجرا میکنی، پرووایدرها از ریجستری HashiCorp دانلود میشن.
برای اینکه بتونی Terraform و OpenTofu رو موازی نگه داری (مثلاً تیمهایی که هنوز مهاجرت نکردن)، میتونی از فایلهای .tofu استفاده کنی. اگه main.tf داری و بخوای قابلیت اختصاصی OpenTofu توش باشه، یه فایل main.tofu بساز. Terraform فایلهای .tofu رو نادیده میگیره و OpenTofu هم وقتی فایل .tofu با همون نام وجود داره، فایل .tf رو نادیده میگیره.
قبل از شروع مهاجرت یه چکلیست داری که باید اجراش کنی: اول با terraform version نسخهات رو شناسایی کن. اگه روی Terraform ۱.۵x یا قدیمیتری، اول به OpenTofu ۱.۶x برو بعد به نسخه هدف. بعدش با terraform plan تغییرات pending رو بررسی کن و همهشون رو با terraform apply اعمال کن تا state تمیز باشه. حتماً state file رو بکاپ بگیر (اگه از S3 استفاده میکنی versioning رو فعال کن)، کدها رو به version control commit کن، رفرنسهای ریجستری رو آدیت کن و پایپلاینهای CI/CD رو آپدیت کن تا بهجای terraform از tofu استفاده کنن.
نکات کلیدی:
- OpenTofu فورک اوپنسورس Terraform 1.5x هست و زیر چتر CNCF قرار داره
- مهاجرت اساساً یه جابجایی باینریه؛ HCL، پرووایدرها و فرمت state یکسانه
- رمزنگاری state file، early variable evaluation و provider for_each از قابلیتهای انحصاری OpenTofu هستن
- حتماً قبل از مهاجرت state رو بکاپ بگیر و محیط non-production رو اول تست کن
- رفرنسهای
registry.terraform.ioرو در کد و پایپلاینها حذف کن - از فایلهای
.tofuبرای نگهداشتن سازگاری موازی Terraform/OpenTofu استفاده کن - اگه نسخه Terraform قدیمیتر از 1.5x داری، مهاجرت رو مرحلهبهمرحله انجام بده




