Terraformer - انفراسٹرڪچر کي ڪوڊ

Terraformer - انفراسٹرڪچر کي ڪوڊ
مان توهان کي نئين CLI ٽول بابت ٻڌائڻ چاهيان ٿو جيڪو مون هڪ پراڻو مسئلو حل ڪرڻ لاءِ لکيو آهي.

مسئلو

Terraform ڊگهي عرصي کان Devops/Cloud/IT ڪميونٽي ۾ هڪ معيار رهيو آهي. اها شيءِ تمام آسان ۽ ڪارائتي آهي بنيادي ڍانچي سان ڊيل ڪرڻ لاءِ جيئن ڪوڊ. Terraform ۾ ڪيتريون ئي نعمتون آهن ۽ گڏوگڏ ڪيترائي ڪانٽو، تيز چاقو ۽ ريڪ.
Terraform سان اهو تمام آسان آهي نيون شيون ٺاهڻ ۽ پوءِ انهن کي منظم ڪرڻ، تبديل ڪرڻ يا حذف ڪرڻ. انهن کي ڇا ڪرڻ گهرجي جن وٽ ڪلائوڊ ۾ هڪ وڏو انفراسٽرڪچر آهي ۽ ٽيرافارم ذريعي نه ٺاهيا ويا آهن؟ سڄي بادل کي ٻيهر لکڻ ۽ ٻيهر ٺاهڻ ڪنهن به طرح مهانگو ۽ غير محفوظ آهي.
مون کي 2 نوڪرين ۾ اهو مسئلو پيش آيو، ان جو آسان مثال اهو آهي جڏهن توهان چاهيو ٿا ته هر شي گٽ ۾ ٽيرافارم فائلن جي صورت ۾ هجي، پر توهان وٽ 250+ بڪيٽ آهن ۽ انهن کي هٿ سان ٽيرافارم ۾ لکڻ تمام گهڻو آهي.
ڪري سگهو ٿا مسئلو 2014 کان وٺي ٽرافوم ۾ جيڪو 2016 ۾ بند ڪيو ويو ان اميد سان ته اتي درآمد ٿيندي.

عام طور تي، سڀڪنھن شيء کي رڳو ساڄي کان کاٻي پاسي کان تصوير ۾ آهي

خبردار: ليکڪ پنهنجي اڌ زندگي روس ۾ نه ٿو رهي ۽ روسي ۾ ٿورڙي لکي ٿو. اسپيلنگ جي غلطين کان بچو.

حل

1. AWS لاءِ تيار ٿيل ۽ پراڻا حل موجود آهن terraforming. جڏهن مون ڪوشش ڪئي ته منهنجي 250+ ٻڪريون ان ذريعي حاصل ڪيون، مون محسوس ڪيو ته اتي سڀ ڪجهه خراب هو. AWS ڊگهي عرصي کان ڪيترائي نوان آپشن متعارف ڪرائي رهيو آهي، پر terraforming انهن جي باري ۾ نه ٿو ڄاڻي ۽ عام طور تي اهو روبي آهي ٽيمپليٽ گهٽ نظر اچي ٿو. شام 2 وڳي کان پوءِ مون موڪلايو ڇڪڻ جي درخواست اتي وڌيڪ خاصيتون شامل ڪرڻ ۽ محسوس ڪيو ته اهڙي حل بلڪل مناسب ناهي.
ڪيئن terraforming ڪم: اهو AWS SDK کان ڊيٽا وٺندو آهي ۽ ٽيمپليٽ ذريعي tf ۽ tfstate ٺاهي ٿو.
هتي 3 مسئلا آهن:
1. تازه ڪاري ۾ هميشه دير ٿي ويندي
2. tf فائلون ڪڏهن ڪڏهن ڀڄي نڪرنديون آهن
3. tfstate tf کان الڳ الڳ گڏ ڪيو ويو آهي ۽ هميشه گڏ نه ٿو ٿئي
عام طور تي، اهو نتيجو حاصل ڪرڻ ڏکيو آهي جنهن ۾ 'ٽرافارم پلان' چوي ٿو ته ڪا به تبديلي ناهي

2. 'ٽرافارم امپورٽ' ٽيرافارم ۾ هڪ بلٽ ان ڪمانڊ آهي. اهو ڪيئن ڪم ڪندو آهي؟
توھان ھڪڙي خالي TF فائل لکو نالي ۽ وسيلن جي قسم سان، پوءِ ھلايو 'ٽرافارم امپورٽ' ۽ پاس ڪريو وسيلن جي ID. terraform مهيا ڪندڙ سان رابطو ڪري ٿو، ڊيٽا وصول ڪري ٿو ۽ tfstate فائل ٺاهي ٿو.
هتي 3 مسئلا آهن:
1. اسان کي صرف هڪ tfstate فائل ملي ٿي، ۽ tf خالي آهي، توهان کي ان کي دستي طور لکڻو پوندو يا ان کي tfstate مان تبديل ڪرڻو پوندو.
2. ھڪڙي وقت ھڪڙي وسيلن سان ڪم ڪري سگھي ٿو ۽ سڀني وسيلن کي سپورٽ نٿو ڪري. ۽ مون کي 250+ ٻڪرين سان ٻيهر ڇا ڪرڻ گهرجي؟
3. توهان کي وسيلن جي ID ڄاڻڻ جي ضرورت آهي - اهو آهي، توهان کي ان کي ڪوڊ ۾ لپائڻ جي ضرورت آهي جيڪا وسيلن جي فهرست حاصل ڪري ٿي
عام طور تي، نتيجو جزوي آهي ۽ چڱي طرح ماپ نٿو ڪري

منهنجو فيصلو

گهربل
1. وسيلن لاءِ tf ۽ tfstate فائلون ٺاهڻ جي صلاحيت. مثال طور، سڀ بڪيٽ/سيڪيورٽي گروپ/لوڊ بيلنس ڊائون لوڊ ڪريو ۽ اهو ’ٽرافارم پلان‘ واپس آيو ته ڪا به تبديلي ناهي
2. توھان کي ضرورت آھي 2 GCP + AWS بادل
3. گلوبل حل جيڪو هر وقت تازه ڪاري ڪرڻ آسان آهي ۽ ڪم جي 3 ڏينهن لاء هر وسيلن تي وقت ضايع نٿو ڪري
4. ان کي اوپن سورس ٺاهيو - سڀني کي ساڳيو مسئلو آهي

گو ٻولي ڇو مون کي ان سان پيار آهي، ۽ ان ۾ HCL فائلون ٺاهڻ لاءِ لائبريري آهي جيڪا ٽيرافارم ۾ استعمال ٿئي ٿي + ٽيرافارم ۾ تمام گهڻو ڪوڊ جيڪو ڪارائتو ٿي سگهي ٿو.

واٽ

پهرين ڪوشش
مون هڪ سادي ورزن سان شروع ڪيو. SDK ذريعي بادل سان رابطو ڪرڻ گھربل وسيلن لاءِ ۽ ان کي فيلڊ ۾ تبديل ڪرڻ لاءِ ٽيرافارم. ڪوشش سيڪيورٽي گروپ تي فوري طور تي مري ويو ڇو ته مون کي پسند نه ڪيو 1.5 ڏينهن صرف سيڪيورٽي گروپ کي تبديل ڪرڻ لاء (۽ ڪيترائي وسيلا آهن). گهڻي وقت لاءِ ۽ پوءِ فيلڊز تبديل/شامل ڪري سگھجن ٿا

ٻي ڪوشش
بيان ڪيل خيال جي بنياد تي هتي. بس وٺو ۽ تبديل ڪريو tfstate ۾ tf. سڀ ڊيٽا اتي آهي ۽ فيلڊ ساڳيا آهن. ڪيئن ڪيترن ئي وسيلن لاء مڪمل tfstate حاصل ڪرڻ لاء؟ اهو آهي جتي 'terraform ريفريش' حڪم بچاء ۾ آيو. 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. id- تار
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",

عام طور تي، جيڪڏهن ڪو هڪ انٽرويو لاء پروگرامنگ مسئلو چاهي ٿو، صرف انهن کان پڇو ته هن ڪم لاء هڪ پارسر لکڻ لاء :)
ڪيترن ئي ڪوششن کان پوءِ بگز کان سواءِ parser لکڻ لاءِ، مون ان جو حصو ٽيرافارم ڪوڊ ۾ مليو، ۽ سڀ کان اهم حصو. ۽ هر شيء ٺيڪ ڪم ڪرڻ لڳي

ڪوشش ٽي
ٽيرافارم فراهم ڪندڙ بائنري آهن جيڪي ڪوڊ تي مشتمل آهن سڀني وسيلن سان ۽ ڪلائوڊ API سان ڪم ڪرڻ لاءِ منطق. هر بادل کي پنهنجو مهيا ڪندڙ آهي ۽ ٽيرافارم پاڻ صرف انهن کي پنهنجي RPC پروٽوڪول ذريعي ٻن عملن جي وچ ۾ سڏيندو آهي.
ھاڻي مون فيصلو ڪيو آھي رابطو ڪرڻ لاءِ ٽيرافارم فراهم ڪندڙ سڌو سنئون RPC ڪالن ذريعي. اهو خوبصورت طور تي ظاهر ٿيو ۽ ان کي ممڪن بڻايو ته ٽرافارم فراهم ڪندڙن کي نئين ۾ تبديل ڪرڻ ۽ ڪوڊ تبديل ڪرڻ کان سواءِ نيون خاصيتون حاصل ڪرڻ. اهو پڻ ظاهر ٿئي ٿو ته tfstate ۾ سڀئي شعبا tf ۾ نه هجڻ گهرجن، پر توهان ڪيئن ڳولي سگهو ٿا؟ بس ان بابت توهان جي فراهم ڪندڙ کان پڇو. ان کان پوء باقاعده اظهار کي گڏ ڪرڻ جي هڪ ٻي ٻيهر ورهاڱي واري فحش شروع ٿي، سڀني سطحن تي tfstate اندر فيلڊ ڳولڻ جي کوٽائي ۾.

آخر ۾، اسان کي ھڪ ڪارائتو CLI اوزار مليو آھي جنھن ۾ ھڪڙي عام زيربنا آھي سڀني ٽرافارم فراهم ڪندڙن لاءِ ۽ توھان آساني سان شامل ڪري سگھو ٿا ھڪڙو نئون. انهي سان گڏ، وسيلن کي شامل ڪرڻ ٿورو ڪوڊ وٺندو آهي. گڏوگڏ سڀني قسمن جون شيون جهڙوڪ وسيلن جي وچ ۾ ڪنيڪشن. يقينن، اهڙا ڪيترائي مختلف مسئلا هئا جن کي بيان نه ٿو ڪري سگهجي.
مون ان جانور جو نالو Terrafomer رکيو.

مڪمل

Terrafomer استعمال ڪندي، اسان ٻن بادلن مان tf + tfstate ڪوڊ جون 500-700 ھزار لائينون ٺاھيون. اسان ورثي شين کي کڻڻ جي قابل هئاسين ۽ انهن کي صرف ٽيرافارم ذريعي ڇڪڻ شروع ڪيو، جيئن بهترين انفراسٽرڪچر ۾ ڪوڊ خيالن جي طور تي. اهو صرف جادو آهي جڏهن توهان هڪ وڏو ڪڪر کڻندا آهيو ۽ ان کي ٽيم جي ذريعي حاصل ڪريو ٽيرافارم ورڪر فائلن جي صورت ۾. ۽ پوءِ گريپ/بدلجي/گٽ وغيره.

مون ان کي ٻاهر ڪڍيو ۽ ان کي ترتيب ۾ رکيو، اجازت ورتي. GitHub تي سڀني لاء خميس تي جاري ڪيو ويو (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
اڳ ۾ ئي 600 ستارا ملي چڪا آهن، اوپن اسٽيڪ ۽ ڪبرنيٽس لاءِ سپورٽ شامل ڪرڻ لاءِ 2 پل جون درخواستون. سٺي موٽ. عام طور تي، منصوبي ماڻهن لاء مفيد آهي
مان هر ڪنهن کي صلاح ڏيان ٿو جيڪو ڪم ڪرڻ شروع ڪرڻ چاهي ٿو Terraform سان ۽ ان لاءِ هر شي کي ٻيهر نه لکڻ.
درخواستون، مسئلا، تارن کي ڇڪڻ لاء مون کي خوشي ٿيندي.

ڊيمو
Terraformer - انفراسٹرڪچر کي ڪوڊ

جو ذريعو: www.habr.com

تبصرو شامل ڪريو