Terraformer - البنية التحتية للتعليمات البرمجية

Terraformer - البنية التحتية للتعليمات البرمجية
أود أن أخبركم عن أداة CLI الجديدة التي كتبتها لحل مشكلة قديمة.

مشكلة

لقد كان Terraform منذ فترة طويلة معيارًا في مجتمع Devops/Cloud/IT. الشيء مناسب جدًا ومفيد للتعامل مع البنية التحتية كرمز. هناك العديد من المسرات في Terraform بالإضافة إلى العديد من الشوك والسكاكين الحادة والمكابس.
مع Terraform، من السهل جدًا إنشاء أشياء جديدة ثم إدارتها أو تغييرها أو حذفها. ما الذي يجب أن يفعله أولئك الذين لديهم بنية تحتية ضخمة في السحابة ولم يتم إنشاؤها من خلال Terraform؟ تعد إعادة كتابة السحابة بأكملها وإعادة إنشائها أمرًا مكلفًا وغير آمن إلى حدٍ ما.
لقد واجهت هذه المشكلة في وظيفتين، وأبسط مثال هو عندما تريد أن يكون كل شيء في شكل git كملفات terraform، ولكن لديك أكثر من 2 مجموعة، ومن الصعب كتابتها يدويًا في terraform.
هنالك قضية منذ عام 2014 في تيرافوم الذي تم إغلاقه في عام 2016 على أمل أن يكون هناك استيراد.

بشكل عام، كل شيء كما في الصورة فقط من اليمين إلى اليسار

تحذيرات: لا يعيش المؤلف نصف حياته في روسيا ويكتب القليل باللغة الروسية. احذر من الأخطاء الإملائية.

حلول

1. هناك حلول جاهزة وقديمة لـ AWS يبدو استصلاح. عندما حاولت الحصول على أكثر من 250 دلوًا من خلاله، أدركت أن كل شيء كان سيئًا هناك. تقدم AWS الكثير من الخيارات الجديدة منذ فترة طويلة، لكن شركة Terraforming لا تعرف شيئًا عنها وبشكل عام فهي روبية يبدو القالب متناثرًا. بعد الساعة الثانية مساء أرسلت طلب سحب لإضافة المزيد من الميزات هناك وأدركت أن مثل هذا الحل غير مناسب على الإطلاق.
كيف يعمل الاستصلاح: فهو يأخذ البيانات من AWS SDK وينشئ tf وtfstate من خلال قالب.
هناك 3 مشاكل هنا:
1. سيكون هناك دائمًا تأخير في التحديثات
2. أحيانًا تخرج ملفات tf مكسورة
3. يتم جمع tfstate بشكل منفصل عن tf ولا يتقارب دائمًا
بشكل عام، من الصعب الحصول على نتيجة تقول فيها "خطة التضاريس" أنه لا توجد تغييرات

2. ``استيراد terraform`` هو أمر مضمن في terraform. كيف يعمل؟
تكتب ملف TF فارغًا باسم المورد ونوعه، ثم تقوم بتشغيل "استيراد Terraform" وتمرير معرف المورد. يتصل terraform بالمزود ويتلقى البيانات ويقوم بإنشاء ملف tfstate.
هناك 3 مشاكل هنا:
1. نحصل فقط على ملف tfstate، وtf فارغ، تحتاج إلى كتابته يدويًا أو تحويله من tfstate
2. يمكن العمل مع مورد واحد فقط في كل مرة ولا يدعم جميع الموارد. وماذا علي أن أفعل مرة أخرى مع أكثر من 250 دلوًا؟
3. أنت بحاجة إلى معرفة معرف الموارد - أي أنك تحتاج إلى تغليفه بكود يحصل على قائمة الموارد
بشكل عام، النتيجة جزئية ولا تتسع بشكل جيد

قراري

المتطلبات:
1. القدرة على إنشاء ملفات tf و tfstate للموارد. على سبيل المثال، قم بتنزيل جميع المجموعات/مجموعة الأمان/موازن التحميل وأرجعت "خطة Terraform" تلك عدم وجود تغييرات
2. أنت بحاجة إلى سحابتين GCP + AWS
3. حل عالمي يسهل تحديثه في كل مرة ولا يضيع الوقت على كل مورد لمدة 3 أيام عمل
4. اجعله مفتوح المصدر - الجميع لديه نفس المشكلة

لغة Go هي سبب حبي لها، وهي تحتوي على مكتبة لإنشاء ملفات HCL المستخدمة في terraform + الكثير من الأكواد البرمجية في terraform التي يمكن أن تكون مفيدة

مسار

المحاولة الأولى
لقد بدأت مع نسخة بسيطة. الاتصال بالسحابة عبر SDK للحصول على المورد المطلوب وتحويله إلى حقول للتضاريس. انتهت المحاولة على الفور على مجموعة الأمان لأنني لم أحب 1.5 يوم لتحويل مجموعة الأمان فقط (وهناك الكثير من الموارد). لفترة طويلة ومن ثم يمكن تغيير/إضافة الحقول

محاولة ثانية
بناء على الفكرة الموضحة هنا. ما عليك سوى أخذ tfstate وتحويله إلى tf. جميع البيانات موجودة والحقول هي نفسها. كيفية الحصول على tfstate الكامل للعديد من الموارد؟؟ هذا هو المكان الذي جاء فيه أمر "terraformfresh" للإنقاذ. يأخذ terraform جميع الموارد الموجودة في tfstate، ويسحب البيانات الخاصة بها عن طريق المعرف ويكتب كل شيء إلى tfstate. وهذا يعني، إنشاء حالة tfstate فارغة بالأسماء والمعرفات فقط، وتشغيل "تحديث Terraform"، ثم نحصل على حالات tfstate كاملة. مرحا!
الآن دعونا نجري عملية إباحية متكررة تتمثل في كتابة محول من tfstate إلى tf. بالنسبة لأولئك الذين لم يقرؤوا tfstate أبدًا، فهو JSON، ولكنه مميز.
وهنا سمات جزء مهم

 "attributes": {
                            "id": "default/backend-logging-load-deployment",
                            "metadata.#": "1",
                            "metadata.0.annotations.%": "0",
                            "metadata.0.generate_name": "",
                            "metadata.0.generation": "24",
                            "metadata.0.labels.%": "1",
                            "metadata.0.labels.app": "backend-logging",
                            "metadata.0.name": "backend-logging-load-deployment",
                            "metadata.0.namespace": "default",
                            "metadata.0.resource_version": "109317427",
                            "metadata.0.self_link": "/apis/apps/v1/namespaces/default/deployments/backend-logging-load-deployment",
                            "metadata.0.uid": "300ecda1-4138-11e9-9d5d-42010a8400b5",
                            "spec.#": "1",
                            "spec.0.min_ready_seconds": "0",
                            "spec.0.paused": "false",
                            "spec.0.progress_deadline_seconds": "600",
                            "spec.0.replicas": "1",
                            "spec.0.revision_history_limit": "10",
                            "spec.0.selector.#": "1",

هنالك:
1. معرف - سلسلة
2. البيانات الوصفية - مصفوفة بالحجم 1 وفيها كائن به حقول موصوفة أدناه
3. المواصفات - تجزئة الحجم 1 والمفتاح والقيمة فيه
باختصار، شكل ممتع، كل شيء يمكن أن يكون عميقًا على عدة مستويات

                   "spec.#": "1",
                            "spec.0.min_ready_seconds": "0",
                            "spec.0.paused": "false",
                            "spec.0.progress_deadline_seconds": "600",
                            "spec.0.replicas": "1",
                            "spec.0.revision_history_limit": "10",
                            "spec.0.selector.#": "1",
                            "spec.0.selector.0.match_expressions.#": "0",
                            "spec.0.selector.0.match_labels.%": "1",
                            "spec.0.selector.0.match_labels.app": "backend-logging-load",
                            "spec.0.strategy.#": "0",
                            "spec.0.template.#": "1",
                            "spec.0.template.0.metadata.#": "1",
                            "spec.0.template.0.metadata.0.annotations.%": "0",
                            "spec.0.template.0.metadata.0.generate_name": "",
                            "spec.0.template.0.metadata.0.generation": "0",
                            "spec.0.template.0.metadata.0.labels.%": "1",
                            "spec.0.template.0.metadata.0.labels.app": "backend-logging-load",
                            "spec.0.template.0.metadata.0.name": "",
                            "spec.0.template.0.metadata.0.namespace": "",
                            "spec.0.template.0.metadata.0.resource_version": "",
                            "spec.0.template.0.metadata.0.self_link": "",
                            "spec.0.template.0.metadata.0.uid": "",
                            "spec.0.template.0.spec.#": "1",
                            "spec.0.template.0.spec.0.active_deadline_seconds": "0",
                            "spec.0.template.0.spec.0.container.#": "1",
                            "spec.0.template.0.spec.0.container.0.args.#": "3",

بشكل عام، إذا أراد أي شخص مشكلة برمجية لمقابلة ما، فما عليه سوى أن يطلب منه كتابة محلل لهذه المهمة :)
وبعد محاولات عديدة لكتابة محلل بدون أخطاء، وجدت جزءًا منه في كود terraform، والجزء الأهم. ويبدو أن كل شيء يعمل بشكل جيد

محاولة ثلاثة
موفري Terraform عبارة عن ثنائيات تحتوي على تعليمات برمجية تحتوي على جميع الموارد والمنطق للعمل مع واجهة برمجة التطبيقات السحابية. كل سحابة لها مزودها الخاص ولا تقوم terraform نفسها باستدعاءها إلا من خلال بروتوكول RPC الخاص بها بين عمليتين.
قررت الآن الاتصال بموفري Terraform مباشرة عبر مكالمات RPC. لقد اتضح بشكل جميل وأتاح تغيير موفري Terraform إلى موفري خدمات أحدث والحصول على ميزات جديدة دون تغيير الكود. كما اتضح أنه ليس كل الحقول في tfstate يجب أن تكون في tf، ولكن كيف يمكنك معرفة ذلك؟ فقط اسأل مزود الخدمة الخاص بك عن هذا. ثم بدأت عملية إباحية متكررة أخرى لتجميع التعبيرات العادية، والبحث عن الحقول داخل tfstate على جميع المستويات بعمق.

في النهاية، حصلنا على أداة CLI مفيدة تحتوي على بنية تحتية مشتركة لجميع موفري Terraform ويمكنك بسهولة إضافة واحدة جديدة. كما أن إضافة الموارد لا يتطلب سوى القليل من التعليمات البرمجية. بالإضافة إلى جميع أنواع الأشياء الجيدة مثل الاتصالات بين الموارد. وبطبيعة الحال، كانت هناك العديد من المشاكل المختلفة التي لا يمكن وصفها كلها.
لقد قمت بتسمية الحيوان Terrafomer.

خاتمة

باستخدام Terrafomer، قمنا بإنشاء 500-700 ألف سطر من كود tf + tfstate من سحابتين. لقد تمكنا من أخذ الأشياء القديمة والبدء في لمسها فقط من خلال التضاريس، كما هو الحال في أفضل البنية التحتية كأفكار التعليمات البرمجية. إنه أمر سحري عندما تأخذ سحابة ضخمة وتستقبلها من خلال فريق في شكل ملفات عاملة Terraform. ثم grep/replace/git وما إلى ذلك.

لقد قمت بتمشيطها وترتيبها، وحصلت على إذن. صدر على GitHub للجميع يوم الخميس (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
لقد تلقيت بالفعل 600 نجمة وطلبين سحب لإضافة دعم لـ openstack وkubernetes. ردود فعل طيبة. بشكل عام المشروع مفيد للناس
أنصح كل من يريد البدء في العمل مع Terraform وعدم إعادة كتابة كل شيء من أجل هذا.
سأكون سعيدًا بسحب الطلبات والقضايا والنجوم.

عرض
Terraformer - البنية التحتية للتعليمات البرمجية

المصدر: www.habr.com

إضافة تعليق