الأدلة التقنية

Terraform أم OpenTofu؟ قصة تغيير الترخيص وما يعنيه لك

لماذا غير Terraform رخصته في 2023 فولد منه OpenTofu، وأين يختلف المشروعان اليوم، وكيف تختار بينهما.

Terraform أم OpenTofu؟ قصة تغيير الترخيص وما يعنيه لك

إذا بحثت عن أي دليل للبنية كشيفرة Infrastructure as Code فسوف تجد اسم Terraform في كل مكان، ثم تجد بجانبه منذ 2023 اسماً آخر هو OpenTofu، والأمر في الاثنين واحد تقريباً، فالملفات نفسها بلغة HCL، والمزودات Providers نفسها، والأوامر نفسها مع تغيير terraform إلى tofu، فيسأل المبتدئ: لماذا يوجد مشروعان؟ وأيهما أتعلم؟ وهل استخدام Terraform في شركتي مسموح؟ والإجابة على هذه الأسئلة الثلاثة في قصة تغيير ترخيص واحدة بدأت في أغسطس 2023، ولم تنته بعد.

وقد ذكرنا هذه القصة باختصار في مقال الرخص مفتوحة المصدر كمثال على الرخص التي تتغير، وفتحنا هناك ملف رخصة Terraform لنرى صاحبها وتاريخ تغييرها، فلن نعيد شرح الفرق بين الرخص هنا، وإنما نتعمق في هذه القصة بالذات لأنها تخصك مباشرة إذا كنت سوف تكتب بنيتك في ملفات، وهذا هو المقال الثاني في مرحلة البنية كشيفرة IaC والأتمتة بعد مصطلحات IaC للمبتدئين الذي شرح معنى State وPlan وDrift، وسوف نناقش في هذا المقال ما يلي:

  • القصة بالتواريخ: من Terraform 0.1 برخصة MPL إلى BUSL، ثم بيان OpenTF والنسخة البديلة Fork، ثم OpenTofu في Linux Foundation وCNCF، ثم شراء IBM لشركة HashiCorp.
  • ماذا يقول نص رخصة BUSL في Terraform حرفياً، وما الذي تسمح به وما الذي تمنعه.
  • أين يتطابق المشروعان اليوم وأين يختلفان، ومنها تشفير ملف الحالة State Encryption وسجل المزودات Registry.
  • كيف تنتقل من Terraform إلى OpenTofu، وكيف تختار بينهما.

Terraform قبل القصة

أصدرت HashiCorp أول نسخة من Terraform، وهي 0.1، في 28 يوليو 2014 كما في وسم الإصدار في مستودعه، وكانت برخصة Mozilla Public License 2.0، واختصاراً MPL 2.0، وهي رخصة مفتوحة من نوع Copyleft الضعيفة Weak Copyleft التي شرحناها في مقال الرخص. ووخلال تسع سنوات أصبح Terraform من أشهر أدوات تجهيز البنية Provisioning، وبنيت حوله منظومة كاملة: مزودات لكل سحابة وخدمة تقريباً، وشركات تبيع منصات لتشغيله للفرق مثل Spacelift وenv0 وScalr، وآلاف الوحدات Modules الجاهزة. وهذه المنظومة هي التي جعلت تغيير الرخصة قضية كبيرة، فالأمر لم يعد يخص شركة واحدة وإنما يخص كل من بنى عملاً على الأداة.

القصة بالتواريخ

الصورة التالية تبين الأحداث الرئيسية من أول إصدار حتى اليوم، ثم نشرح كل حدث بمصدره:

خط زمني من يوليو 2014 حيث صدر Terraform 0.1 برخصة MPL 2.0، ثم 10 أغسطس 2023 إعلان BUSL 1.1، ثم 25 أغسطس 2023 إعلان نسخة OpenTF البديلة بعد البيان، ثم 20 سبتمبر 2023 OpenTofu في Linux Foundation، ثم 10 يناير 2024 أول إصدار مستقر OpenTofu 1.6، ثم 24 أبريل 2024 إعلان IBM شراء HashiCorp، ثم 30 أبريل 2024 OpenTofu 1.7 مع تشفير الحالة، ثم 27 فبراير 2025 إتمام الصفقة، ثم 23 أبريل 2025 قبول OpenTofu في CNCF بمستوى Sandbox، ثم أكتوبر 2026 Terraform 1.16 وOpenTofu 1.13
قرابة ستة أسابيع فقط بين تغيير الرخصة ووصول النسخة البديلة إلى مؤسسة محايدة

10 أغسطس 2023: HashiCorp تنتقل إلى BUSL

في هذا اليوم كتب Armon Dadgar، الشريك المؤسس والمدير التقني في HashiCorp، إعلان انتقال الشركة إلى Business Source License 1.1، واختصاراً BUSL أو BSL، لكل الإصدارات القادمة من منتجاتها، ومنها Terraform وPacker وVault وConsul وNomad وBoundary. وذكر الإعلان أن المستخدمين يستطيعون نسخ الكود وتعديله وإعادة توزيعه للاستخدام التجاري وغير التجاري، إلا إذا كانوا يقدمون منتجاً منافساً لـ HashiCorp، وأن واجهات HashiCorp البرمجية APIs وحزم التطوير SDKs وأغلب المكتبات الأخرى تبقى برخصة MPL 2.0. وأما السبب الذي ذكرته الشركة فهو أن شركات أخرى تستفيد من المشاريع المفتوحة وتبيعها دون أن تقدم مساهمات حقيقية في المقابل، وأن نموذج المصادر المفتوحة التجاري يجب أن يتطور حتى تستمر المنظومة.

وأول إصدار من Terraform بالرخصة الجديدة هو 1.6.0، وآخر إصدار برخصة MPL هو 1.5.7، وتستطيع أن تتأكد من ذلك بنفسك من ملف الرخصة في وسم كل إصدار، فملف LICENSE في الإصدار 1.5.7 يبدأ بـ Mozilla Public License، أما ملف الإصدار 1.6.0 فيبدأ بنص Business Source License.

بيان OpenTF ثم النسخة البديلة

بعد الإعلان بأيام نشرت مجموعة من الشركات التي تعتمد على Terraform، وأغلبها شركات تبيع منصات لتشغيله، بيان OpenTF الذي طلبت فيه من HashiCorp أن تعيد Terraform إلى رخصة مفتوحة حتى يبقى للمجتمع بيت واحد محايد، وذكرت أنها سوف تنشئ نسخة بديلة إذا لم يحدث ذلك. وفي 25 أغسطس 2023 أعلنت المجموعة النسخة البديلة، وذكرت أن أكثر من 100 شركة و10 مشاريع و400 شخص تعهدوا بالمساهمة بالوقت والموارد خلال أسبوعين من نشر البيان، وأن هدفها أن يصبح المشروع في Linux Foundation ثم في Cloud Native Computing Foundation، واختصاراً CNCF. ثم فتح المستودع للجميع في 5 سبتمبر 2023.

20 سبتمبر 2023: OpenTofu في Linux Foundation

في هذا اليوم أعلنت Linux Foundation تأسيس OpenTofu، وذكر الإعلان أن اسمه السابق كان OpenTF، وأنه يبقى برخصة MPL 2.0 التي صدر بها Terraform في الأصل، وأن المشروع حصل على تعهدات رسمية من أكثر من 140 منظمة و600 شخص، وأنه يبدأ بالتزام 18 مطوراً متفرغاً على الأقل لمدة خمس سنوات على الأقل. ثم صدر أول إصدار مستقر OpenTofu 1.6.0 في 10 يناير 2024. ويدير المشروع لجنة توجيه تقنية Technical Steering Committee، واختصاراً TSC، بحسب ملف الحوكمة الذي يذكر أن العضو الجديد يرشحه عضو حالي ويضاف بأغلبية الثلثين، وأن اللجنة تجتمع كل أسبوعين في اجتماعات مفتوحة وتنشر قراراتها في المستودع، ويحدد ميثاق المشروع سقفاً لقوة التصويت، فإذا كان أكثر من عضوين من موظفي شركة واحدة أو مجموعة شركات مرتبطة، في لجنة من خمسة أعضاء أو أكثر، فأصواتهم مجتمعة لا تتجاوز صوتين، حتى لا تسيطر شركة واحدة على القرار. وفي 23 أبريل 2025 قبل المشروع في CNCF بمستوى Sandbox، وهو مستوى المشاريع الجديدة في المؤسسة.

أبريل 2024: رسالة HashiCorp ورد OpenTofu

في أبريل 2024 أرسلت HashiCorp رسالة تطالب بالتوقف Cease and Desist إلى مشروع OpenTofu، تتهم فيها أحد مطوريه بنسخ كود من Terraform المرخص بـ BUSL في تنفيذ الكتلة removed، ونشر OpenTofu رده في 11 أبريل 2024 ورفض الاتهام، وقال إن تحليله لأصل الكود بين أن الجزء المقصود جاء من كود أقدم برخصة MPL 2.0، وإن HashiCorp نفسها استخدمته في تنفيذها، ونشر رده الرسمي وتحليل أصل الكود. وهذه رواية OpenTofu كما نشرها مع وثائقه. وما يهمك أنت من هذه الحادثة شيء واحد: المشروعان أصبحا متنافسين فعلاً، وكل ميزة جديدة في أحدهما تكتب اليوم بحذر حتى لا تقترب من كود الآخر.

IBM تشتري HashiCorp

في 24 أبريل 2024 أعلنت IBM أنها سوف تشتري HashiCorp بسعر 35 دولاراً نقداً للسهم وبقيمة 6.4 مليار دولار للشركة، وأتمت الصفقة في 27 فبراير 2025. وتغيرت بعدها جهة الترخيص في ملف الرخصة من HashiCorp إلى IBM، ولكن الرخصة نفسها بقيت BUSL حتى كتابة هذا المقال، فالذي تغير هو المالك وليس الشروط. وقد يتساءل البعض: هل عاد Terraform مفتوح المصدر بعد الشراء؟ والإجابة لا، وملف LICENSE في الفرع الرئيسي هو الدليل كما سنرى في القسم التالي.

ماذا يقول نص الرخصة حرفياً؟

رخصة BUSL 1.1 نفسها نص عام كتبته MariaDB، وتجده في صفحة الرخصة، وهي تسمح لك بنسخ الكود وتعديله وإنشاء أعمال مشتقة منه وإعادة توزيعه واستخدامه استخداماً غير إنتاجي Non-production Use، ثم يضيف صاحب كل مشروع فقرة اسمها الإذن الإضافي Additional Use Grant تحدد الاستخدام الإنتاجي المسموح، لذلك لا تفهم BUSL في أي مشروع إلا من هذه الفقرة. والأمر التالي يعرض فقرات المعاملات Parameters من ملف رخصة Terraform مباشرة:

curl -s https://raw.githubusercontent.com/hashicorp/terraform/main/LICENSE | sed -n '/^Licensed Work/,/^Change License/p'

والمخرج سوف يكون كما يلي:

Licensed Work:        Terraform Version 1.6.0 or later. The Licensed Work is (c) 2024
                      IBM Corp.
Additional Use Grant: You may make production use of the Licensed Work, provided
                      Your use does not include offering the Licensed Work to third
                      parties on a hosted or embedded basis in order to compete with
                      IBM Corp.'s paid version(s) of the Licensed Work. For purposes
                      of this license:

                      A "competitive offering" is a Product that is offered to third
                      parties on a paid basis, including through paid support
                      arrangements, that significantly overlaps with the capabilities
                      of IBM Corp.'s paid version(s) of the Licensed Work. If Your
                      Product is not a competitive offering when You first make it
                      generally available, it will not become a competitive offering
                      later due to IBM Corp. releasing a new version of the Licensed
                      Work with additional capabilities. In addition, Products that
                      are not provided on a paid basis are not competitive.

                      "Product" means software that is offered to end users to manage
                      in their own environments or offered as a service on a hosted
                      basis.

                      "Embedded" means including the source code or executable code
                      from the Licensed Work in a competitive offering. "Embedded"
                      also means packaging the competitive offering in such a way
                      that the Licensed Work must be accessed or downloaded for the
                      competitive offering to operate.

                      Hosting or using the Licensed Work(s) for internal purposes
                      within an organization is not considered a competitive
                      offering. IBM Corp. considers your organization to include all
                      of your affiliates under common control.

                      For binding interpretive guidance on using IBM Corp. products
                      under the Business Source License, please visit our FAQ.
                      (https://www.hashicorp.com/license-faq)
Change Date:          Four years from the date the Licensed Work is published.
Change License:       MPL 2.0

في المخرج أعلاه لاحظ التالي:

  • الرخصة تخص Terraform من الإصدار 1.6.0 وما بعده فقط، فالإصدارات حتى 1.5.7 تبقى برخصة MPL 2.0 كما صدرت، ولا يستطيع أحد أن يسحب رخصة أعطيت.
  • الاستخدام الإنتاجي مسموح بشرط واحد: ألا تقدم Terraform لطرف ثالث بشكل مستضاف Hosted أو مضمن Embedded لتنافس النسخ المدفوعة من IBM.
  • المنتج المنافس Competitive Offering هو منتج يقدم لطرف ثالث بمقابل مالي، ومنه الدعم المدفوع، ويتداخل بشكل كبير مع قدرات النسخ المدفوعة، والمنتج المجاني لا يعتبر منافساً بنص الرخصة.
  • الاستضافة أو الاستخدام لأغراض داخلية في المنظمة ليس منافسة، والمنظمة تشمل كل الشركات التابعة لها تحت سيطرة واحدة.
  • كل إصدار يتحول إلى MPL 2.0 بعد أربع سنوات من نشره، فالإصدار 1.6.0 الذي صدر في أكتوبر 2023 يصبح مفتوحاً في أكتوبر 2027، ولكن الإصدارات الجديدة تبقى دائماً متأخرة أربع سنوات عن المفتوح منها.
  • التفسير الملزم بحسب النص نفسه في صفحة الأسئلة الشائعة عن الرخصة، فإذا كانت حالتك قريبة من الحد فارجع إليها وإلى مستشار قانوني قبل أن تبني عليها منتجاً.

والصورة التالية تلخص ما يسمح به هذا النص وما يمنعه:

عمودان: المسموح في Terraform 1.6 وما بعده وهو تشغيل شركتك لبنيتها الداخلية، وأداة مجانية مبنية حوله، والقراءة والتعديل وإعادة التوزيع، وتحول كل إصدار إلى MPL 2.0 بعد أربع سنوات، والممنوع دون اتفاق وهو خدمة مستضافة مدفوعة تنافس نسخ IBM المدفوعة، ومنتج مدفوع يضمنه أو يحتاج إلى تنزيله ليعمل، ودعم مدفوع يتداخل مع النسخ المدفوعة
أغلب الشركات التي تستخدم Terraform لبنيتها لا يمسها المنع، والمتضرر الأول هو من يبيع منصة لتشغيله

وهذا يعني عملياً أنك إذا كنت مطوراً أو مدير أنظمة يستخدم Terraform لإنشاء سيرفرات شركته، أو جهة حكومية تدير بنيتها الداخلية به، فالرخصة لا تمنعك من شيء. وأما إذا كنت شركة تبيع منصة لتشغيل Terraform لعملائها، أو منتجاً مدفوعاً يحتاج Terraform ليعمل ويتداخل مع ما تبيعه IBM، فهنا يقع المنع، وهذا هو السبب في أن أغلب من وقعوا بيان OpenTF كانوا من هذا النوع بالذات. ولكن لاحظ أن الرخصة المفتوحة ليست أمراً قانونياً فقط، فحتى لو لم يمسك المنع اليوم، فمستقبل الأداة التي تبني عليها بنيتك كلها بيد شركة واحدة، وهذه هي نقطة الحوكمة التي نعود إليها في قسم الاختيار.

أين يتطابق المشروعان؟

بدأ OpenTofu من آخر كود Terraform برخصة MPL، أي من فرع 1.5، لذلك كان في البداية نسخة مطابقة تقريباً، وما زال يقول في إعلان الإصدار 1.7 إنه بديل مباشر Drop-in Replacement لـ Terraform 1.5 مع طرق انتقال سهلة من الإصدارات الأحدث. والصورة التالية تبين كيف انقسم الكود ثم سار كل مشروع في طريقه:

خط رمادي من Terraform 0.1 إلى 1.5.7 برخصة MPL 2.0 من 2014 إلى 2023 ينقسم إلى خطين: Terraform من 1.6 إلى 1.16 برخصة BUSL 1.1 عند IBM مع ميزات ephemeral في 1.10 وwrite-only في 1.11 وأمر stacks في 1.13 وactions وquery في 1.14، وOpenTofu من 1.6 إلى 1.13 برخصة MPL 2.0 في Linux Foundation وCNCF مع تشفير الحالة في 1.7 وملفات .tofu في 1.8 وfor_each للمزودات في 1.9 وسجل OCI في 1.10، وفي الوسط ما يشترك فيه الاثنان: لغة HCL والمزودات نفسها وصيغة الحالة نفسها عند الانقسام
كود واحد حتى الإصدار 1.5، ثم مشروعان لكل منهما ميزاته، والأفكار تنتقل بينهما أحياناً

وما يشترك فيه الاثنان حتى اليوم كثير:

  • اللغة: الملفات بامتداد .tf بلغة HCL نفسها، ومكتبة HCL نفسها ما زالت برخصة MPL 2.0.
  • المزودات Providers: المزود برنامج مستقل يتواصل مع الأداة ببروتوكول واحد، وأغلب المزودات المشهورة مثل AWS وHetzner Cloud برخصة MPL 2.0 كما في ملفات رخصها، لذلك يعمل المزود نفسه مع الأداتين.
  • ملف الحالة: الصيغة واحدة، ولذلك تقول خطوات الانتقال إنك تشغل tofu plan على الحالة نفسها فتتوقع ألا ترى تغييرات، بشرط ألا يكون الملف مشفراً بتشفير OpenTofu.
  • الأوامر: init وplan وapply وdestroy وimport بالأسماء والخيارات نفسها تقريباً.

ولكن لاحظ أن «تقريباً» هنا مهمة، فكل إصدار جديد يزيد المسافة، والملف الذي يستخدم ميزة موجودة في أحدهما فقط لن يعمل في الآخر. ولحل هذه المشكلة لمن يكتب وحدات Modules للمشروعين أضاف OpenTofu 1.8 الامتداد .tofu، فإذا وجد ملف main.tofu بجانب main.tf فإن OpenTofu يقرأ الأول ويتجاهل الثاني، وTerraform يقرأ الثاني فقط، فيكتب صاحب الوحدة ميزات OpenTofu في ملف لا يراه Terraform.

أين يختلفان؟

الجدول التالي يجمع أمثلة من سجل إصدارات كل مشروع، وليس قائمة كاملة بالفروق، والإصدار المكتوب هو الذي ظهرت فيه الميزة بحسب المصدر المرتبط:

الميزةOpenTofuTerraform
تشفير ملف الحالة والخطة داخل الأداة1.7 (أبريل 2024)لا يوجد في الأداة نفسها، والوثائق تنصح بخلفية Backend تشفر الحالة
القيم المؤقتة Ephemeral التي لا تحفظ في الحالة1.11 (ديسمبر 2025)1.10 (نوفمبر 2024)
الخصائص التي تكتب ولا تحفظ Write-only1.111.11 (فبراير 2025)
المتغيرات في مصدر الوحدة Module Source1.8 (يوليو 2024)، ومعها في إعداد ال Backend والتشفير1.15 (أبريل 2026)
for_each على المزودات، والخيار -exclude1.9 (يناير 2025)لم نجده في سجلات إصدارات Terraform حتى 1.16
توزيع المزودات والوحدات عبر سجل OCI1.10 (يونيو 2025)لم نجده في سجلات إصدارات Terraform حتى 1.16
قفل الحالة في S3 دون DynamoDB1.101.10، ثم أعلن جاهزاً للاستخدام العام في 1.11
الوسيط enabled بدلاً من حيلة count1.11لم نجده في سجلات إصدارات Terraform حتى 1.16
Stacks وActions وأمر terraform queryلا يوجد1.13 و1.14، وStacks تنشر عبر منصة HCP Terraform

وفي الجدول أعلاه لاحظ أن الأفكار تنتقل في الاتجاهين، فالمتغيرات في مصدر الوحدة ظهرت في OpenTofu قبل Terraform بسنتين تقريباً، والقيم المؤقتة ظهرت في Terraform قبل OpenTofu بسنة، ولكن الصيغة والتفاصيل قد تختلف بينهما حتى في الميزة الواحدة، لذلك لا تفترض أن الملف الذي يعمل في أحدهما بميزة جديدة سوف يعمل في الآخر، وإنما جربه بالخطة. وآخر إصدار مستقر عند كتابة هذا المقال هو OpenTofu 1.13.1 وTerraform 1.16.5، وكلاهما صدر في أول أكتوبر 2026.

سجل المزودات Registry

عندما تكتب في ملفك source = "hashicorp/aws" فهذا عنوان مختصر، والأداة تكمله بسجل افتراضي تسأله عن الإصدارات وروابط التنزيل، وTerraform يسأل registry.terraform.io وOpenTofu يسأل registry.opentofu.org. وقد شرح OpenTofu في مقال بناء سجله أن HashiCorp أغلقت سجل Terraform أمام البرامج التي ليست Terraform، فاحتاج المشروع إلى سجل مستقل، فبناه على إصدارات GitHub التي ينشرها أصحاب المزودات أنفسهم، فالمزود الذي تنزله الأداتان واحد في الغالب، والذي يختلف هو الفهرس. والصورة التالية تبين ذلك:

إصدار المزود على GitHub مع ملف zip وSHA256SUMS والتوقيع يصل إلى registry.terraform.io الذي تقصر شروطه استخدامه على Terraform فيصل إلى terraform init، ويصل إلى registry.opentofu.org أو سجل OCI فيصل إلى tofu init، والعنوان المختصر hashicorp/aws واحد في الاثنين، وملف .terraform.lock.hcl يحفظ بصمات ما ثبت
العنوان المختصر للمزود واحد في الأداتين، والذي يختلف هو السجل الافتراضي الذي تسأله كل أداة

ولاحظ أن أصحاب المزودات يوقعون إصداراتهم، فوثائق نشر المزودات في سجل Terraform تشترط إصداراً على GitHub فيه ملف SHA256SUMS وتوقيعاً له بمفتاح GPG، وبعد التثبيت تكتب الأداتان بصمات ما نزلته في ملف القفل .terraform.lock.hcl، فاحفظ هذا الملف في Git كما تحفظ ملفات القفل للحزم، والسبب شرحناه في أمن سلسلة التوريد: المزود برنامج يعمل بصلاحيات حساباتك عند المزود السحابي، وأي تغيير غير متوقع فيه يجب أن يظهر في طلب دمج.

تشفير ملف الحالة في OpenTofu

شرحنا في مقال المصطلحات أن ملف الحالة يحتوي على أسرار بنص واضح، وأن الحل التقليدي هو حفظه في خلفية Backend تشفر الملفات على القرص، والمشكلة في هذا الحل أن التشفير هنا مسؤولية مكان الحفظ، فمن يملك صلاحية القراءة من ال Bucket يقرأ الأسرار، والنسخة التي تنزلها إلى جهازك لتصلح شيئاً بنص واضح. والحل الذي أضافه OpenTofu 1.7 هو أن تشفر الأداة نفسها الحالة والخطة قبل أن تحفظهما في أي مكان، والصورة التالية تبين الفرق:

على اليسار ملف terraform.tfstate بنص JSON واضح يظهر فيه حقل result لمورد random_password بقيمته، مع علامة تحذير أن من يقرأ الملف أو ال Bucket يقرأ السر، وعلى اليمين الملف نفسه بعد تشفير OpenTofu وفيه الحقول meta وencrypted_data وencryption_version فقط، وتحته مزود المفتاح pbkdf2 أو KMS أو OpenBao ثم طريقة التشفير aes_gcm ثم الحالة والخطة
بعد التشفير لا يرى من يقرأ الملف إلا بيانات مشفرة واسم مزود المفتاح

والإعداد التالي هو المثال الذي تبدأ به وثائق تشفير الحالة كما هو، ويشتق المفتاح من عبارة مرور بخوارزمية PBKDF2 ثم يشفر بخوارزمية AES-GCM:

variable "passphrase" {
  # Change passphrase to be at least 16 characters long:
  default   = "changeme!"
  sensitive = true
}

terraform {
  encryption {
    ## Step 1: Add the desired key provider:
    key_provider "pbkdf2" "my_key_provider_name" {
      passphrase = var.passphrase
    }
    ## Step 2: Set up your encryption method:
    method "aes_gcm" "my_method_name" {
      keys = key_provider.pbkdf2.my_key_provider_name
    }

    state {
      ## Step 3: Link the desired encryption method:
      method = method.aes_gcm.my_method_name

      ## Step 4: Run "tofu apply".

      ## Step 5: Consider adding the "enforced" option:
      # enforced = true
    }

    ## Step 6: Repeat steps 3-5 for plan{} if needed.
  }
}

في الإعداد أعلاه لاحظ التالي:

  • القيمة الافتراضية changeme! للتوضيح فقط، والوثائق نفسها تطلب عبارة طولها 16 حرفاً على الأقل، ولا تقم أبداً بكتابة العبارة في الملف، وإنما مررها من متغير بيئة أو من مدير أسرار، والسبب أن الملف في Git.
  • مزود المفتاح Key Provider يمكن أن يكون PBKDF2 من عبارة مرور، أو خدمة مفاتيح مثل AWS KMS وGCP KMS، أو OpenBao، كما يذكر إعلان الإصدار 1.7، ومنذ الإصدار 1.10 يمكن أيضاً كتابة مزود مفتاح خارجي خاص بك.
  • المثال يشفر الحالة فقط، والخطوة السادسة في تعليقاته تطلب أن تكرر الشيء نفسه في كتلة plan، فلا تنسها، لأن ملف الخطة المحفوظ بالخيار -out فيه أسرار أيضاً.
  • الخيار enforced = true في الخطوة الخامسة يجعل الأداة ترفض أن تكتب الحالة بلا تشفير، فإذا حذف أحدهم الإعداد بالخطأ فشلت العملية بدلاً من أن تحفظ الأسرار بنص واضح.
  • إذا كانت عندك حالة قديمة غير مشفرة فالوثائق تشرح إضافة طريقة unencrypted كخيار احتياطي Fallback مؤقت حتى ينقل أول tofu apply الحالة إلى الصيغة المشفرة، ثم تحذفه.
⚠️
إذا فقدت مفتاح التشفير فقدت ملف الحالة نفسه، فالوثائق تحذر صراحة من أن الحالة تصبح غير قابلة للاسترجاع دون المفتاح الصحيح، وتحذر أيضاً من تغيير أسماء مزودات المفاتيح والطرق في الإعداد بعد وجود بيانات مشفرة. واعلم كذلك أن الملف المشفر لا يقرؤه Terraform، فإذا فعلت التشفير فقد اخترت OpenTofu لهذا المشروع، والعودة تحتاج إلى فك التشفير أولاً.

الانتقال من Terraform إلى OpenTofu

تصف خطوات الانتقال الرسمية العملية في ست خطوات، ونلخصها كما يلي:

  1. خذ نسخة احتياطية من الحالة: انسخ terraform.tfstate ونسخته الاحتياطية إذا كانت الحالة محلية، أو اتبع طريقة النسخ في الخلفية مثل تفعيل النسخ Versioning في S3، ثم احفظ كل التغييرات في Git ويفضل في فرع خاص بالانتقال.
  2. ثبت OpenTofu من صفحة التثبيت وتأكد من الإصدار بالأمر tofu --version.
  3. شغل tofu init لتنزيل المزودات من سجل OpenTofu وتهيئة الخلفية.
  4. شغل tofu plan، والمتوقع بحسب الوثائق أن ترى No changes أو الخطة نفسها التي كان Terraform سيعرضها.
  5. شغل tofu apply.
  6. اختبر بتغيير صغير غير مهم، مثل إضافة وسم Tag إلى مورد، ثم plan وapply.

وإذا ظهرت مشكلة فخطة التراجع في الوثائق نفسها: توقف عن استخدام OpenTofu فوراً، واسترجع النسخة الاحتياطية، ثم شغل terraform init وterraform plan. ولاحظ أن الخطوة الرابعة هي الاختبار الحقيقي، فإذا عرضت الخطة استبدال أي مورد فلا تكمل، والسبب في الغالب ميزة من Terraform بعد 1.5 لا يعرفها OpenTofu بالصيغة نفسها، وإذا كانت عندك عدة مشاريع تقرأ حالة بعضها عبر terraform_remote_state فاقرأ صفحة الانتقال لعدة إعدادات مترابطة قبل أن تبدأ.

كيف تختار؟

لا توجد إجابة واحدة لكل الناس، ولكن توجد أسئلة واضحة تقودك إلى الإجابة:

  • طريقة الاستخدام Usage: هل تستخدم الأداة لبنيتك الداخلية، أم تبني منتجاً مدفوعاً أو خدمة لعملاء حولها؟ في الحالة الثانية اقرأ الرخصة مع مستشار قانوني قبل أي شيء، وOpenTofu يزيل السؤال كله.
  • المنصة التي تعمل عليها Platform: إذا كان فريقك يعتمد على HCP Terraform وميزاته مثل Stacks، فالانتقال يعني تغيير المنصة كلها، أما إذا كنت تشغل الأداة من خط CI/CD عندك، كما سوف نفعل في مقالات المرحلة، فالانتقال سهل.
  • الحوكمة Governance: من يقرر مستقبل الأداة؟ في Terraform تقرر شركة واحدة هي IBM، وفي OpenTofu لجنة تقنية في مؤسسة محايدة، وقد شرحنا ما يعنيه كل نموذج في المشروع الذي تقوده شركة واحدة.
  • الميزات التي تحتاجها Features: تشفير الحالة داخل الأداة موجود في OpenTofu فقط، وStacks وActions في Terraform فقط، فإذا كانت ميزة منها شرطاً عندك فقد اخترت.
  • الدعم والتوظيف Support and Hiring: الشهادات الرسمية والدعم التجاري من الشركة المالكة موجودان في Terraform، أما المعرفة نفسها فتنتقل بين الأداتين كما هي، فمن يعرف أحدهما يعرف الآخر.

ونقاط القوة والضعف لكل أداة كما يلي:

TerraformOpenTofu
نقاط القوةشركة كبيرة تطوره وتدعمه تجارياً، ومنصة HCP Terraform وميزات Stacks وActions، وأغلب الدروس والأمثلة على الإنترنت مكتوبة لهرخصة MPL 2.0 مفتوحة دون شروط منافسة، وحوكمة في Linux Foundation وCNCF، وتشفير الحالة داخل الأداة، وسجل مستقل ودعم سجلات OCI
نقاط الضعفرخصة BUSL تمنع المنافسة وتجعل مستقبل الشروط بيد IBM، وتشفير الحالة مسؤولية مكان الحفظ وحدهبعض ميزات Terraform الجديدة غير موجودة أو مختلفة الصيغة، والدعم التجاري من الشركات الداعمة وليس من جهة واحدة

وفي مقالات هذه المرحلة سوف نستخدم OpenTofu، والسبب أن موقعنا يشرح الأدوات التي تستطيع أن تملكها وتشغلها دون شروط على طريقة استخدامها، ولكن كل ما سوف نكتبه من ملفات HCL وأوامر ينطبق على Terraform مع تغيير اسم الأمر، ما لم نستخدم ميزة خاصة بأحدهما، وسوف نذكر ذلك صراحة إذا حدث.

أخطاء شائعة

  • الظن أن Terraform أصبح ممنوعاً على الشركات: الاستخدام الداخلي مسموح بنص الرخصة، والمنع يخص المنتجات المنافسة المدفوعة.
  • الظن أن الرخصة تمنع الإصدارات القديمة: الإصدارات حتى 1.5.7 تبقى بـ MPL 2.0، ولكنها لا تحصل على تحديثات أمنية، فلا تبق عليها لهذا السبب.
  • خلط ملفات الأداتين في المشروع نفسه دون اتفاق: إذا شغل أحد الزملاء Terraform وآخر OpenTofu على الحالة نفسها بعد أن تباعدت الإصدارات فقد تكتب الحالة بصيغة لا يفهمها الآخر، فاتفقوا على أداة واحدة وإصدار واحد لكل مشروع، واكتبوه في ملف الإعداد.
  • تفعيل التشفير دون خطة للمفتاح: المفتاح الذي يضيع يضيع معه ملف الحالة، فاحفظه في مدير أسرار مع نسخة احتياطية قبل أن تفعل التشفير.
  • حذف ملف .terraform.lock.hcl من Git: بدونه ينزل كل جهاز وكل خط CI إصدار المزود الذي يجده، فتختلف النتائج ولا ترى التغيير في المراجعة.

الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

  • في 10 أغسطس 2023 نقلت HashiCorp إصدارات Terraform من 1.6.0 وما بعده إلى رخصة BUSL 1.1، وآخر إصدار مفتوح هو 1.5.7.
  • الرخصة تسمح بالاستخدام الإنتاجي الداخلي وبالمنتجات المجانية، وتمنع تقديم Terraform بشكل مستضاف أو مضمن في منتج مدفوع ينافس نسخ IBM المدفوعة، وكل إصدار يتحول إلى MPL 2.0 بعد أربع سنوات.
  • رد المجتمع ببيان OpenTF ثم بنسخة بديلة اسمها OpenTofu، دخلت Linux Foundation في 20 سبتمبر 2023، وصدر أول إصدار مستقر منها في 10 يناير 2024، وقبلت في CNCF في 23 أبريل 2025.
  • اشترت IBM شركة HashiCorp وأتمت الصفقة في 27 فبراير 2025، والرخصة بقيت BUSL.
  • المشروعان يتشاركان اللغة والمزودات وصيغة الحالة، ويختلفان في ميزات تزيد مع كل إصدار، وأهمها لنا تشفير الحالة في OpenTofu، والسجل الافتراضي مختلف.
  • الاختيار يعتمد على طريقة استخدامك والمنصة التي تعمل عليها ومن تريد أن يقرر مستقبل أداتك، ونحن نستخدم OpenTofu في مقالات المرحلة.
دليلمصطلحات البنية كشيفرة IaC التي تحتاجها قبل أي أداةما معنى أن تكتب بنيتك في ملفات داخل Git، ولماذا يفشل السكربت العادي عند تشغيله مرة ثانية، وما الذي تحفظه الأداة في ملف الحالة.دليلما هي البرمجيات مفتوحة المصدر؟ القصة وأشهر الرخصكيف بدأت البرمجيات الحرة والمفتوحة، وما الفرق بين الحر والمجاني، وكيف تعرف ما تسمح به رخصة أي مشروع قبل أن تبني عليه.دليلمن يدير المشروع مفتوح المصدر؟ نماذج الحوكمة Governanceمن يقرر في مشروع يساهم فيه آلاف الأشخاص، ومن يستطيع تغيير رخصته، وما الذي تفحصه قبل أن تعتمد على أي مشروع.دليلأمن سلسلة التوريد البرمجية Software Supply Chain للمبتدئينكل ما بين كود غيرك وسيرفرك قد يحمل كود المهاجم، وهنا تعرف التهديدات الحقيقية بحوادث موثقة والدفاع المناسب لكل حلقة.دليلSecrets Scanning: كيف تكتشف الأسرار المسربة في الكودكيف يخرج المفتاح من جهازك إلى تاريخ Git وخط CI، وكيف تكتشفه قبل غيرك، وماذا تفعل في الساعة الأولى بعد تسربه.

سجل التحديثات

  • أكتوبر 2026: كتابة المقال اعتماداً على إعلانات HashiCorp وOpenTofu وLinux Foundation وIBM وCNCF، وملفات الرخص في وسوم Terraform 1.5.7 و1.6.0 والفرع الرئيسي، وسجلات إصدارات المشروعين حتى Terraform 1.16.5 وOpenTofu 1.13.1، دون تشغيل أي من الأداتين، فالأمثلة من الوثائق الرسمية.
نشرة عرب رووت | ArabRoot

معرفة تستحق مكاناً في بريدك.

مقالات مختارة وأدوات مفيدة وأفكار لمشروعك القادم، في رسالة واحدة كل أسبوع.

يمكنك إلغاء الاشتراك متى شئت. الخصوصية

تم استلام طلبك. افتح بريدك واضغط رابط التأكيد لإتمام الاشتراك.