Terraformer - Kodlash uchun infratuzilma

Terraformer - Kodlash uchun infratuzilma
Men sizga eski muammoni hal qilish uchun yozgan yangi CLI vositasi haqida gapirib bermoqchiman.

muammo

Terraform uzoq vaqtdan beri Devops/Cloud/IT hamjamiyatida standart bo'lib kelgan. Bu narsa kod sifatida infratuzilma bilan ishlash uchun juda qulay va foydalidir. Terraformda ko'plab lazzatlar, shuningdek, ko'plab vilkalar, o'tkir pichoqlar va tırmıklar mavjud.
Terraform bilan yangi narsalarni yaratish va keyin ularni boshqarish, o'zgartirish yoki o'chirish juda qulay. Bulutda ulkan infratuzilmaga ega va Terraform orqali yaratilmaganlar nima qilishlari kerak? Butun bulutni qayta yozish va qayta yaratish qandaydir qimmat va xavfli.
Men bu muammoga 2 ta ishda duch keldim, eng oddiy misol, siz Git-da hamma narsa terraform fayllar ko'rinishida bo'lishini xohlasangiz, lekin sizda 250+ chelak bor va ularni qo'lda terraformda yozish juda ko'p.
bor nashr 2014 yildan beri import bo'ladi degan umidda 2016 yilda yopilgan terrafomda.

Umuman olganda, hamma narsa rasmdagi kabi, faqat o'ngdan chapga

Ogohlantirishlar: Muallif umrining yarmini Rossiyada yashamaydi va rus tilida kam yozadi. Imlo xatolaridan ehtiyot bo'ling.

Yechimlar

1. AWS uchun tayyor va eski yechim mavjud terraformatsiya qilish. Men 250+ chelaklarimni u orqali o'tkazmoqchi bo'lganimda, u erda hamma narsa yomon ekanligini angladim. AWS uzoq vaqtdan beri ko'plab yangi variantlarni taqdim etmoqda, ammo terraforming ular haqida bilmaydi va umuman olganda bu yoqut. shablon siyrak ko'rinadi. Kechki soat 2 dan keyin yubordim So'rovni tortib olish u erda qo'shimcha funktsiyalarni qo'shish va bunday yechim umuman mos kelmasligini tushundi.
Terraforming qanday ishlaydi: u AWS SDK dan ma'lumotlarni oladi va shablon orqali tf va tfstate ni yaratadi.
Bu erda 3 ta muammo bor:
1. Yangilanishlarda har doim kechikish bo'ladi
2. tf fayllari ba'zan buzilgan holda chiqadi
3. tfstate tf dan alohida yig'iladi va har doim ham yaqinlashmaydi
Umuman olganda, “terraformaviy reja”da hech qanday o'zgarishlar yo'q, degan natijaga erishish qiyin

2. `terraform import` - terraformda o'rnatilgan buyruq. Bu qanday ishlaydi?
Siz resurs nomi va turi bilan bo'sh TF faylini yozasiz, so'ngra "terraform import" ni ishga tushirasiz va resurs identifikatorini o'tkazasiz. terraform provayder bilan bog'lanadi, ma'lumotlarni oladi va tfstate faylini yaratadi.
Bu erda 3 ta muammo bor:
1. Biz faqat tfstate faylini olamiz va tf bo'sh, uni qo'lda yozishingiz yoki tfstate dan aylantirishingiz kerak.
2. Bir vaqtning o'zida faqat bitta resurs bilan ishlay oladi va barcha resurslarni qo'llab-quvvatlamaydi. Va yana 250+ chelak bilan nima qilishim kerak?
3. Siz resurslarning identifikatorini bilishingiz kerak - ya'ni uni resurslar ro'yxatini oladigan kodga o'rashingiz kerak.
Umuman olganda, natija qisman va yaxshi miqyosda emas

Mening qarorim

Talablar:
1. Resurslar uchun tf va tfstate fayllarini yaratish qobiliyati. Masalan, barcha chelaklar/xavfsizlik guruhi/yuk balanslagichini yuklab oling va o'sha "terraform rejasi" hech qanday o'zgarishlar yo'qligini ko'rsatdi.
2. Sizga 2 ta GCP + AWS bulutlari kerak
3. Har safar yangilanishi oson va 3 kunlik ish uchun har bir resursga vaqt sarflamaydigan global yechim
4. Uni Open Source qiling - hamma bir xil muammoga ega

Go tili nima uchun men uni yaxshi ko'raman va unda terraformda ishlatiladigan HCL fayllarini yaratish kutubxonasi + foydali bo'lishi mumkin bo'lgan terraformada juda ko'p kod mavjud.

Yo'l

Birinchi urinish
Men oddiy versiyadan boshladim. Kerakli resurs uchun SDK orqali bulut bilan bog'lanish va uni terraform uchun maydonlarga aylantirish. Urinish xavfsizlik guruhida darhol vafot etdi, chunki men faqat xavfsizlik guruhini aylantirish uchun 1.5 kunni yoqtirmadim (va juda ko'p resurslar mavjud). Uzoq vaqt va keyin maydonlarni o'zgartirish/qo'shish mumkin

Ikkinchi urinish
Ta'riflangan fikrga asoslanib shu yerda. Faqat tfstate-ni oling va tf-ga o'zgartiring. Barcha ma'lumotlar mavjud va maydonlar bir xil. Ko'p manbalar uchun to'liq tfstate ni qanday olish mumkin? Bu erda "terraformani yangilash" buyrug'i yordamga keldi. terraform tfstate-dagi barcha resurslarni oladi va ID bo'yicha ulardagi ma'lumotlarni chiqaradi va hamma narsani tfstate-ga yozadi. Ya'ni, faqat nomlar va identifikatorlar bilan bo'sh tfstate yarating, "terraform refresh" ni ishga tushiring va keyin biz to'liq tfstate-ni olamiz. Xayr!
Keling, tfstate uchun tf uchun konvertor yozishning rekursiv pornografiyasini qilaylik. Hech qachon tfstate-ni o'qimaganlar uchun bu JSON, lekin maxsus.
Mana uning muhim qismi atributlari

 "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",

Mavjud:
1. id - qator
2. metama'lumotlar - 1 o'lchamdagi massiv va unda quyida tavsiflangan maydonlarga ega ob'ekt
3. spec - 1 o'lchamdagi xesh va kalit, undagi qiymat
Muxtasar qilib aytganda, qiziqarli format, hamma narsa bir necha daraja chuqur bo'lishi mumkin

                   "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",

Umuman olganda, agar kimdir intervyu uchun dasturlash muammosini xohlasa, ulardan ushbu vazifa uchun tahlilchi yozishni so'rang :)
Parserni xatosiz yozishga ko'p urinishlardan so'ng, men uning bir qismini terraform kodida va eng muhim qismini topdim. Va hamma narsa yaxshi ishlayotganga o'xshardi

Uchinchi urinish
terraform provayderlari bulutli API bilan ishlash uchun barcha resurslar va mantiqqa ega kodni o'z ichiga olgan ikkilikdir. Har bir bulutning o'z provayderi bor va terraformning o'zi ularni faqat ikkita jarayon o'rtasida RPC protokoli orqali chaqiradi.
Endi men RPC qo'ng'iroqlari orqali to'g'ridan-to'g'ri terraform provayderlari bilan bog'lanishga qaror qildim. Bu juda chiroyli bo'lib chiqdi va kodni o'zgartirmasdan terraform provayderlarini yangilariga o'zgartirish va yangi xususiyatlarni olish imkonini berdi. Bundan tashqari, tfstate-dagi barcha maydonlar tf-da bo'lmasligi kerak, ammo buni qanday aniqlash mumkin? Bu haqda provayderingizdan so'rang. Keyin muntazam iboralarni yig'ishning yana bir rekursiv pornografiyasi boshlandi, tfstate ichidagi barcha darajadagi chuqurlikdagi maydonlarni qidirish.

Oxir-oqibat, biz barcha terraform provayderlari uchun umumiy infratuzilmaga ega bo'lgan foydali CLI vositasini oldik va siz osongina yangisini qo'shishingiz mumkin. Bundan tashqari, resurslarni qo'shish kam kod talab qiladi. Bundan tashqari, resurslar o'rtasidagi aloqalar kabi barcha turdagi yaxshiliklar. Albatta, hammasini ta'riflab bo'lmaydigan juda ko'p turli xil muammolar bor edi.
Men hayvonga Terrafomer deb nom berdim.

Yakuniy

Terrafomer yordamida biz ikkita bulutdan 500-700 ming qator tf + tfstate kodini yaratdik. Biz meros bo'lib qolgan narsalarni qabul qila oldik va ularga kod g'oyalari sifatida eng yaxshi infratuzilmadagi kabi faqat terraform orqali tegishni boshladik. Katta bulutni olib, uni terraform ishchi fayllari shaklida jamoa orqali qabul qilsangiz, bu shunchaki sehrdir. Va keyin grep/replace/git va boshqalar.

Uni taradim va tartibga keltirdim, ruxsat oldim. GitHub-da hamma uchun payshanba kuni chiqarildi (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Allaqachon 600 yulduz, ochiq stack va kubernetlarni qo'shish uchun 2 ta tortish so'rovi olingan. Yaxshi fikr. Umuman olganda, loyiha odamlar uchun foydalidir
Men Terraform bilan ishlashni boshlamoqchi bo'lgan har bir kishiga maslahat beraman va buning uchun hamma narsani qayta yozmang.
Men so'rovlarni, muammolarni, yulduzlarni olishdan xursand bo'laman.

Namoyish
Terraformer - Kodlash uchun infratuzilma

Manba: www.habr.com

a Izoh qo'shish