Terraformer - Infrastructure To Code

Terraformer - Infrastructure To Code
می خواهم در مورد ابزار جدید CLI که برای حل یک مشکل قدیمی نوشتم به شما بگویم.

مشکل

Terraform برای مدت طولانی یک استاندارد در جامعه Devops/Cloud/IT بوده است. این چیز برای برخورد با زیرساخت به عنوان کد بسیار راحت و مفید است. لذت های زیادی در Terraform و همچنین چنگال ها، چاقوهای تیز و چنگک ها وجود دارد.
با Terraform ایجاد چیزهای جدید و سپس مدیریت، تغییر یا حذف آنها بسیار راحت است. کسانی که زیرساخت عظیمی در فضای ابری دارند و از طریق Terraform ایجاد نشده اند چه باید بکنند؟ بازنویسی و ایجاد مجدد کل ابر به نوعی گران و ناامن است.
من در 2 کار با این مشکل مواجه شدم، ساده ترین مثال زمانی است که می خواهید همه چیز در Git به شکل فایل های terraform باشد، اما شما بیش از 250 سطل دارید و نوشتن آنها در terraform با دست زیاد است.
وجود دارد موضوع از سال 2014 در terrafom که در سال 2016 بسته شد با این امید که واردات وجود داشته باشد.

به طور کلی، همه چیز مانند تصویر فقط از راست به چپ است

هشدار: نویسنده نیمی از عمر خود را در روسیه زندگی نمی کند و به زبان روسی کم می نویسد. مراقب اشتباهات املایی باشید.

راه حل ها

1. راه حل های آماده و قدیمی برای AWS وجود دارد زمین سازی. وقتی سعی کردم بیش از 250 سطل خود را از آن عبور دهم، متوجه شدم که همه چیز در آنجا بد است. AWS مدت‌هاست که گزینه‌های جدید زیادی را معرفی می‌کند، اما terraforming از آنها اطلاعی ندارد و به طور کلی یاقوت است. قالب پراکنده به نظر می رسد. بعد از ساعت 2 شب فرستادم درخواست کشش برای اضافه کردن ویژگی های بیشتر وجود دارد و متوجه شدم که چنین راه حلی اصلا مناسب نیست.
نحوه عملکرد زمین‌سازی: داده‌ها را از AWS SDK می‌گیرد و tf و tfstate را از طریق یک الگو تولید می‌کند.
در اینجا 3 مشکل وجود دارد:
1. همیشه تاخیر در به روز رسانی وجود دارد
2. فایل های tf گاهی اوقات شکسته بیرون می آیند
3. tfstate جدا از tf جمع آوری می شود و همیشه همگرا نمی شود
به طور کلی، به دست آوردن نتیجه ای که در آن «طرح ترافورم» بگوید هیچ تغییری وجود ندارد دشوار است

2. 'terraform import' یک دستور داخلی در 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. آن را متن باز کنید - همه همین مشکل را دارند

زبان Go به همین دلیل است که من آن را دوست دارم و دارای کتابخانه ای برای ایجاد فایل های HCL است که در terraform استفاده می شود + کدهای زیادی در terraform که می تواند مفید باشد.

مسیر

اولین تلاش
من با یک نسخه ساده شروع کردم. تماس با ابر از طریق SDK برای منبع مورد نیاز و تبدیل آن به فیلدهایی برای terraform. تلاش بلافاصله در گروه امنیتی از بین رفت زیرا من دوست نداشتم 1.5 روز فقط گروه امنیتی را تبدیل کنم (و منابع زیادی وجود دارد). برای مدت طولانی و سپس زمینه ها را می توان تغییر / اضافه کرد

تلاش دوم
بر اساس ایده شرح داده شده اینجا. فقط tfstate را بگیرید و به tf تبدیل کنید. تمام داده ها وجود دارد و فیلدها یکسان هستند. چگونه می توان tfstate کامل را برای بسیاری از منابع دریافت کرد؟ اینجاست که دستور "terraform refresh" به کمک آمد. terraform همه منابع را در tfstate می گیرد و با ID، داده ها را از آنها بیرون می کشد و همه چیز را در tfstate می نویسد. یعنی یک tfstate خالی با نام و شناسه ایجاد کنید، «terraform refresh» را اجرا کنید و سپس 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 worker دریافت کنید، فقط جادو است. و سپس grep/replace/git و غیره.

آن را شانه کردم و مرتبش کردم، اجازه گرفتم. در GitHub برای همه در روز پنجشنبه (02.05.19/XNUMX/XNUMX) منتشر شد. github.com/GoogleCloudPlatform/terraformer
قبلاً 600 ستاره دریافت کرده است، 2 درخواست کشش برای اضافه کردن پشتیبانی برای openstack و kubernetes. بازخورد خوب به طور کلی، این پروژه برای مردم مفید است
من به همه کسانی که می خواهند با Terraform شروع به کار کنند توصیه می کنم و همه چیز را برای این کار بازنویسی نکنند.
من خوشحال خواهم شد که درخواست ها، مسائل، ستاره ها را ارائه دهم.

نسخه ی نمایشی
Terraformer - Infrastructure To Code

منبع: www.habr.com

اضافه کردن نظر