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

صورة
أود أن أتحدث عن أداة CLI الجديدة التي كتبت لحل مشكلة قديمة واحدة.

المشكلة


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

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


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

حلول


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

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

قراراتي

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

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

الطريق


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

المحاولة الثانية
بناء على الفكرة الموضحة هنا . فقط تأخذ وتحويل tfstate إلى TF. جميع البيانات موجودة والحقول هي نفسها. كيفية الحصول على tfstate الكامل للعديد من الموارد؟ ثم جاء الأمر "تحديث terraform". يأخذ 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 هو ثنائي يحتوي على رمز به جميع الموارد ومنطق للعمل مع API السحابية. كل سحابة لها مزودها الخاص بها ولا تستدعي terraform نفسها إلا من خلال بروتوكول RPC الخاص بها بين عمليتين.
الآن قررت الوصول إلى مقدمي خدمات terraform مباشرةً من خلال مكالمات RPC. لقد تحولت بشكل جميل وجعلت من الممكن تغيير مزودي خدمات terraform إلى مقدمي خدمات أحدث والحصول على فرص جديدة دون تغيير الكود. اتضح أنه لا ينبغي أن تكون جميع الحقول في tfstate في tf ، ولكن كيف يمكنني معرفة ذلك؟ فقط أسأل مقدم الخدمة عن هذا. ثم بدأت إباحي عودية أخرى على تجميع التعبيرات العادية بالبحث مع البحث عن الحقول داخل tfstate على جميع المستويات بعمق.

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

خاتمة


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

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

عرض


التحديثات: أصبح الحد الأدنى من دعم Openstack ودعم kubernetes جاهزًا تقريبًا ، بفضل أشخاص من PRS

Source: https://habr.com/ru/post/ar450410/


All Articles