Terraformer - کوڈ کے لئے بنیادی ڈھانچہ

Terraformer - کوڈ کے لئے بنیادی ڈھانچہ
میں آپ کو نئے CLI ٹول کے بارے میں بتانا چاہتا ہوں جو میں نے ایک پرانے مسئلے کو حل کرنے کے لیے لکھا تھا۔

مسئلہ

Devops/Cloud/IT کمیونٹی میں Terraform طویل عرصے سے ایک معیار رہا ہے۔ کوڈ کے طور پر بنیادی ڈھانچے سے نمٹنے کے لئے چیز بہت آسان اور مفید ہے۔ ٹیرافارم میں بہت سے لذتوں کے ساتھ ساتھ بہت سے کانٹے، تیز چاقو اور ریک ہیں۔
Terraform کے ساتھ نئی چیزیں بنانا اور پھر ان کا نظم کرنا، تبدیل کرنا یا حذف کرنا بہت آسان ہے۔ وہ لوگ کیا کریں جن کے پاس کلاؤڈ میں بہت بڑا انفراسٹرکچر ہے اور ٹیرافارم کے ذریعے نہیں بنایا گیا؟ پورے کلاؤڈ کو دوبارہ لکھنا اور دوبارہ بنانا کسی نہ کسی طرح مہنگا اور غیر محفوظ ہے۔
مجھے یہ مسئلہ 2 ملازمتوں میں پیش آیا، اس کی سب سے آسان مثال یہ ہے کہ جب آپ چاہتے ہیں کہ ہر چیز ٹیرافارم فائلوں کی شکل میں گٹ میں ہو، لیکن آپ کے پاس 250+ بالٹیاں ہیں اور انہیں ہاتھ سے ٹیرافارم میں لکھنا بہت کچھ ہے۔
ہے مسئلہ ٹیرفوم میں 2014 سے جو کہ 2016 میں اس امید کے ساتھ بند کر دیا گیا تھا کہ درآمد ہو گی۔

عام طور پر، سب کچھ صرف دائیں سے بائیں تصویر میں ہے

انتباہ: مصنف اپنی آدھی زندگی روس میں نہیں رہتا اور روسی زبان میں بہت کم لکھتا ہے۔ املا کی غلطیوں سے ہوشیار رہیں۔

حل

1. AWS کے لیے ایک ریڈی میڈ اور پرانا حل موجود ہے۔ ٹیرافارمنگ. جب میں نے اس کے ذریعے اپنی 250+ بالٹیاں حاصل کرنے کی کوشش کی تو مجھے احساس ہوا کہ وہاں سب کچھ خراب ہے۔ AWS طویل عرصے سے بہت سارے نئے آپشنز متعارف کروا رہا ہے، لیکن ٹیرافارمنگ ان کے بارے میں نہیں جانتی ہے اور عام طور پر یہ روبی ہے ٹیمپلیٹ بہت کم لگ رہا ہے. شام کے 2 بجے کے بعد میں نے بھیجا۔ کھینچنے کی درخواست وہاں مزید خصوصیات شامل کریں اور محسوس کیا کہ اس طرح کا حل بالکل مناسب نہیں ہے۔
ٹیرافارمنگ کیسے کام کرتی ہے: یہ AWS SDK سے ڈیٹا لیتا ہے اور ٹیمپلیٹ کے ذریعے tf اور tfstate تیار کرتا ہے۔
یہاں 3 مسائل ہیں:
1. اپ ڈیٹس میں ہمیشہ وقفہ رہے گا۔
2. tf فائلیں کبھی کبھی ٹوٹی ہوئی نکل آتی ہیں۔
3. tfstate کو tf سے الگ سے جمع کیا جاتا ہے اور ہمیشہ آپس میں نہیں ہوتا ہے۔
عام طور پر، ایسا نتیجہ حاصل کرنا مشکل ہے جس میں 'ٹیرافارم پلان' کہے کہ کوئی تبدیلیاں نہیں ہیں۔

2. 'ٹیرافارم امپورٹ' ٹیرافارم میں ایک بلٹ ان کمانڈ ہے۔ یہ کیسے کام کرتا ہے؟
آپ نام اور وسائل کی قسم کے ساتھ ایک خالی TF فائل لکھتے ہیں، پھر 'terraform import' چلائیں اور ریسورس ID پاس کریں۔ terraform فراہم کنندہ سے رابطہ کرتا ہے، ڈیٹا وصول کرتا ہے اور tfstate فائل بناتا ہے۔
یہاں 3 مسائل ہیں:
1. ہمیں صرف tfstate فائل ملتی ہے، اور tf خالی ہے، آپ کو اسے دستی طور پر لکھنا ہوگا یا اسے tfstate سے تبدیل کرنا ہوگا۔
2. ایک وقت میں صرف ایک وسائل کے ساتھ کام کر سکتا ہے اور تمام وسائل کی حمایت نہیں کرتا ہے۔ اور مجھے 250+ بالٹیوں کے ساتھ دوبارہ کیا کرنا چاہئے؟
3. آپ کو وسائل کی شناخت جاننے کی ضرورت ہے - یعنی، آپ کو اسے کوڈ میں لپیٹنے کی ضرورت ہے جس سے وسائل کی فہرست ملتی ہے
عام طور پر، نتیجہ جزوی ہے اور اچھی طرح سے پیمانہ نہیں ہوتا ہے۔

میرا فیصلہ

کے تقاضے:
1. وسائل کے لیے tf اور tfstate فائلیں بنانے کی صلاحیت۔ مثال کے طور پر، تمام بالٹیاں/سیکیورٹی گروپ/لوڈ بیلنسر ڈاؤن لوڈ کریں اور وہ 'ٹیرافارم پلان' واپس آیا کہ کوئی تبدیلیاں نہیں ہیں۔
2. آپ کو 2 GCP + AWS کلاؤڈز کی ضرورت ہے۔
3. عالمی حل جو ہر بار اپ ڈیٹ کرنا آسان ہے اور 3 دن کے کام کے لیے ہر وسائل پر وقت ضائع نہیں کرتا
4. اسے اوپن سورس بنائیں - سب کو ایک ہی مسئلہ ہے۔

گو لینگویج یہی وجہ ہے کہ میں اسے پسند کرتا ہوں، اور اس میں ایچ سی ایل فائلیں بنانے کے لیے ایک لائبریری ہے جو ٹیرافارم میں استعمال ہوتی ہے + ٹیرافارم میں بہت سارے کوڈ جو کارآمد ہو سکتے ہیں۔

راہ

پہلی کوشش
میں نے ایک سادہ ورژن کے ساتھ آغاز کیا۔ مطلوبہ وسائل کے لیے SDK کے ذریعے کلاؤڈ سے رابطہ کرنا اور اسے ٹیرافارم کے لیے فیلڈز میں تبدیل کرنا۔ سیکیورٹی گروپ پر یہ کوشش فوری طور پر ختم ہوگئی کیونکہ مجھے صرف سیکیورٹی گروپ کو تبدیل کرنے کے لئے 1.5 دن پسند نہیں تھے (اور بہت سارے وسائل موجود ہیں)۔ ایک طویل عرصے تک اور پھر فیلڈز کو تبدیل/شامل کیا جا سکتا ہے۔

دوسری کوشش
بیان کردہ خیال کی بنیاد پر یہاں. بس لیں اور tfstate کو tf میں تبدیل کریں۔ تمام ڈیٹا موجود ہے اور فیلڈز ایک جیسے ہیں۔ بہت سارے وسائل کے لئے مکمل tfstate کیسے حاصل کریں؟ یہیں سے 'ٹیرافارم ریفریش' کمانڈ بچاؤ میں آیا۔ terraform tfstate میں تمام وسائل لیتا ہے اور ID کے ذریعہ، ان پر ڈیٹا نکالتا ہے اور tfstate کو سب کچھ لکھتا ہے۔ یعنی، صرف ناموں اور IDs کے ساتھ ایک خالی 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. id - تار
2. میٹا ڈیٹا - سائز 1 کی ایک صف اور اس میں فیلڈز کے ساتھ ایک آبجیکٹ جس کی وضاحت ذیل میں کی گئی ہے۔
3. spec - سائز 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",

عام طور پر، اگر کسی کو انٹرویو کے لیے پروگرامنگ کا مسئلہ درپیش ہے، تو ان سے اس کام کے لیے ایک پارسر لکھنے کو کہیں :)
کیڑے کے بغیر پارسر لکھنے کی بہت سی کوششوں کے بعد، مجھے اس کا کچھ حصہ ٹیرافارم کوڈ میں ملا، اور سب سے اہم حصہ۔ اور سب کچھ ٹھیک کام کرنے لگتا تھا۔

کوشش تین
ٹیرافارم فراہم کرنے والے بائنریز ہیں جن میں کلاؤڈ API کے ساتھ کام کرنے کے لیے تمام وسائل اور منطق کے ساتھ کوڈ ہوتا ہے۔ ہر کلاؤڈ کا اپنا فراہم کنندہ ہوتا ہے اور ٹیرافارم خود انہیں اپنے RPC پروٹوکول کے ذریعے دو عملوں کے درمیان کال کرتا ہے۔
اب میں نے آر پی سی کالز کے ذریعے ٹیرافارم فراہم کرنے والوں سے براہ راست رابطہ کرنے کا فیصلہ کیا۔ یہ خوبصورتی سے نکلا اور اس نے کوڈ کو تبدیل کیے بغیر ٹیرافارم فراہم کنندگان کو نئے میں تبدیل کرنا اور نئی خصوصیات حاصل کرنا ممکن بنایا۔ یہ بھی پتہ چلتا ہے کہ tfstate میں تمام فیلڈز tf میں نہیں ہونے چاہئیں، لیکن آپ کیسے جان سکتے ہیں؟ بس اپنے فراہم کنندہ سے اس بارے میں پوچھیں۔ پھر باقاعدہ اظہار کو جمع کرنے کی ایک اور تکراری فحش نگاری شروع ہوئی، tfstate کے اندر تمام سطحوں پر گہرائی میں فیلڈز کی تلاش۔

آخر میں، ہمیں ایک مفید CLI ٹول ملا جس میں تمام ٹیرافارم فراہم کنندگان کے لیے ایک مشترکہ بنیادی ڈھانچہ ہے اور آپ آسانی سے ایک نیا شامل کر سکتے ہیں۔ نیز، وسائل کو شامل کرنے میں تھوڑا کوڈ لگتا ہے۔ اس کے علاوہ تمام قسم کے سامان جیسے وسائل کے درمیان رابطے۔ بلاشبہ، بہت سے مختلف مسائل تھے جو سب کو بیان نہیں کیا جا سکتا.
میں نے جانور کا نام Terrafomer رکھا۔

ختم

Terrafomer کا استعمال کرتے ہوئے، ہم نے دو بادلوں سے tf + tfstate کوڈ کی 500-700 ہزار لائنیں تیار کیں۔ ہم پرانی چیزیں لینے اور صرف ٹیرافارم کے ذریعے ان کو چھونے کے قابل تھے، جیسا کہ کوڈ آئیڈیاز کے طور پر بہترین انفراسٹرکچر میں ہے۔ یہ صرف جادو ہے جب آپ ایک بہت بڑا کلاؤڈ لیتے ہیں اور اسے ٹیم کے ذریعے ٹیرافارم ورکر فائلوں کی شکل میں وصول کرتے ہیں۔ اور پھر grep/replace/git وغیرہ۔

میں نے کنگھی کرکے اسے ترتیب دیا، اجازت مل گئی۔ جمعرات (02.05.19/XNUMX/XNUMX) کو سب کے لیے GitHub پر جاری کیا گیا۔ github.com/GoogleCloudPlatform/terraformer
اوپن اسٹیک اور کبرنیٹس کے لیے سپورٹ شامل کرنے کے لیے پہلے ہی 600 ستارے، 2 پل کی درخواستیں موصول ہو چکی ہیں۔ اچھی رائے۔ عام طور پر، منصوبہ لوگوں کے لئے مفید ہے
میں ہر اس شخص کو مشورہ دیتا ہوں جو Terraform کے ساتھ کام شروع کرنا چاہتا ہے اور اس کے لیے ہر چیز کو دوبارہ نہ لکھے۔
مجھے درخواستوں، مسائل، ستاروں کو کھینچ کر خوشی ہوگی۔

Демо
Terraformer - کوڈ کے لئے بنیادی ڈھانچہ

ماخذ: www.habr.com

نیا تبصرہ شامل کریں