Terraformer - Infrastructure To Code

Terraformer - Infrastructure To Code
Do të doja t'ju tregoja për mjetin e ri CLI që kam shkruar për të zgjidhur një problem të vjetër.

problem

Terraform ka qenë prej kohësh një standard në komunitetin Devops/Cloud/IT. Gjëja është shumë e përshtatshme dhe e dobishme për trajtimin e infrastrukturës si kod. Ka shumë kënaqësi në Terraform, si dhe shumë pirunë, thika të mprehta dhe raketa.
Me Terraform është shumë i përshtatshëm për të krijuar gjëra të reja dhe më pas për t'i menaxhuar, ndryshuar ose fshirë ato. Çfarë duhet të bëjnë ata që kanë një infrastrukturë të madhe në cloud dhe jo të krijuar përmes Terraform? Rishkrimi dhe rikrijimi i të gjithë resë është disi i shtrenjtë dhe i pasigurt.
E kam hasur këtë problem në 2 punë, shembulli më i thjeshtë është kur dëshiron që gjithçka të jetë në Git në formën e skedarëve terraform, por ke 250+ kova dhe është shumë t'i shkruash në terraform me dorë.
Ka çështje që nga viti 2014 në terrafom i cili u mbyll në vitin 2016 me shpresën se do të ketë import.

Në përgjithësi, gjithçka është si në foto vetëm nga e djathta në të majtë

Paralajmërime: Autori nuk jeton gjysmën e jetës në Rusi dhe shkruan pak në rusisht. Kujdes nga gabimet drejtshkrimore.

Zgjidhjet

1. Ka zgjidhje të gatshme dhe të vjetra për AWS terraformimi. Kur u përpoqa të kaloja mbi 250 kovat e mia, kuptova se gjithçka ishte keq atje. AWS ka kohë që prezanton shumë opsione të reja, por terraforming nuk di për to dhe në përgjithësi është rubin shablloni duket i rrallë. Pas orës 2 të mbrëmjes dërgova Kërkesa për tërheqje për të shtuar më shumë veçori atje dhe kuptova se një zgjidhje e tillë nuk është aspak e përshtatshme.
Si funksionon terraformimi: merr të dhëna nga AWS SDK dhe gjeneron tf dhe tfstate përmes një shablloni.
Këtu ka 3 probleme:
1. Gjithmonë do të ketë një vonesë në përditësimet
2. skedarët tf ndonjëherë dalin të prishur
3. tfstate mblidhet veçmas nga tf dhe jo gjithmonë konvergojnë
Në përgjithësi, është e vështirë të merret një rezultat në të cilin `plani terraform` thotë se nuk ka ndryshime

2. 'terraform import' është një komandë e integruar në terraform. Si punon?
Ju shkruani një skedar TF bosh me emrin dhe llojin e burimit, më pas ekzekutoni 'terraform import' dhe kaloni ID-në e burimit. terraform kontakton ofruesin, merr të dhënat dhe krijon një skedar tfstate.
Këtu ka 3 probleme:
1. Ne marrim vetëm një skedar tfstate, dhe tf është bosh, duhet ta shkruani manualisht ose ta konvertoni nga tfstate
2. Mund të punojë vetëm me një burim në një kohë dhe nuk i mbështet të gjitha burimet. Dhe çfarë duhet të bëj përsëri me 250+ kova?
3. Ju duhet të dini ID-në e burimeve - domethënë, duhet ta mbështillni atë në kodin që merr listën e burimeve
Në përgjithësi, rezultati është i pjesshëm dhe nuk përshkallëzohet mirë

Vendimi im

kërkesat:
1. Aftësia për të krijuar skedarë tf dhe tfstate për burime. Për shembull, shkarkoni të gjitha kovat/grupin e sigurisë/balancuesin e ngarkesës dhe se `plani i Terraformit` u kthye se nuk ka ndryshime
2. Ju duhen 2 retë GCP + AWS
3. Zgjidhje globale që përditësohet lehtë çdo herë dhe nuk humbet kohë për çdo burim për 3 ditë punë
4. Bëjeni atë me burim të hapur - të gjithë kanë të njëjtin problem

Gjuha Go është arsyeja pse më pëlqen, dhe ajo ka një bibliotekë për krijimin e skedarëve HCL që përdoret në terraform + shumë kode në terraform që mund të jenë të dobishëm

Rruge

Përpjekja e parë
Fillova me një version të thjeshtë. Kontaktimi me renë kompjuterike nëpërmjet SDK-së për burimin e kërkuar dhe shndërrimi i tij në fusha për terraformë. Përpjekja vdiq menjëherë në grupin e sigurisë, sepse nuk më pëlqeu që 1.5 ditët të konvertoja vetëm grupin e sigurisë (dhe ka shumë burime). Për një kohë të gjatë dhe më pas fushat mund të ndryshohen/shtohen

Përpjekja e dytë
Bazuar në idenë e përshkruar këtu. Thjesht merrni dhe konvertoni tfstate në tf. Të gjitha të dhënat janë aty dhe fushat janë të njëjta. Si të merrni tfstate të plotë për shumë burime?? Këtu erdhi në ndihmë komanda `terraform refresh`. terraform merr të gjitha burimet në tfstate dhe, me ID, nxjerr të dhëna mbi to dhe shkruan gjithçka në tfstate. Kjo do të thotë, krijoni një tfstate bosh me vetëm emra dhe ID, ekzekutoni 'terraform refresh' dhe më pas marrim tfstate të plota. Hora!
Tani le të bëjmë pornografinë rekursive të shkrimit të një konverteri për tfstate në tf. Për ata që nuk kanë lexuar kurrë tfstate, është JSON, por i veçantë.
Këtu janë atributet e pjesës së tij të rëndësishme

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

Ka:
1. id - varg
2. metadata - një grup me madhësi 1 dhe në të një objekt me fusha që përshkruhet më poshtë
3. spec - hash i madhësisë 1 dhe çelësit, vlera në të
Me pak fjalë, një format argëtues, gjithçka mund të jetë në disa nivele të thella

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

Në përgjithësi, nëse dikush dëshiron një problem programimi për një intervistë, thjesht kërkoni që të shkruajë një analizues për këtë detyrë :)
Pas shumë përpjekjesh për të shkruar një analizues pa gabime, gjeta një pjesë të tij në kodin terraform, dhe pjesën më të rëndësishme. Dhe gjithçka dukej se funksiononte mirë

Përpjekja e tretë
Ofruesit terraform janë binare që përmbajnë kod me të gjitha burimet dhe logjikën për të punuar me API-në cloud. Çdo re ka ofruesin e vet dhe vetë terraformi i thërret ato vetëm përmes protokollit të tij RPC midis dy proceseve.
Tani vendosa të kontaktoj ofruesit e terraformit drejtpërdrejt përmes thirrjeve RPC. Doli bukur dhe bëri të mundur ndryshimin e ofruesve terraformë në më të rinj dhe marrjen e veçorive të reja pa ndryshuar kodin. Rezulton gjithashtu se jo të gjitha fushat në tfstate duhet të jenë në tf, por si mund ta zbuloni? Thjesht pyesni ofruesin tuaj për këtë. Pastaj filloi një pornografi rekursive e grumbullimit të shprehjeve të rregullta, duke kërkuar fusha brenda tfstate në të gjitha nivelet në thellësi.

Në fund, ne morëm një mjet të dobishëm CLI që ka një infrastrukturë të përbashkët për të gjithë ofruesit e terraformit dhe ju lehtë mund të shtoni një të re. Gjithashtu, shtimi i burimeve kërkon pak kod. Plus të gjitha llojet e të mirave siç janë lidhjet midis burimeve. Sigurisht, kishte shumë probleme të ndryshme që nuk mund të përshkruhen të gjitha.
Unë e quajta kafshën Terrafomer.

finale

Duke përdorur Terrafomer, ne gjeneruam 500-700 mijë rreshta të kodit tf + tfstate nga dy re. Ne ishim në gjendje të merrnim gjëra të trashëguara dhe të fillonim t'i prekim ato vetëm përmes terraformit, si në infrastrukturën më të mirë si ide kodesh. Është thjesht magji kur merr një re të madhe dhe e merr atë përmes një ekipi në formën e skedarëve të punëtorëve në terren. Dhe pastaj grep/replace/git dhe kështu me radhë.

E kreha dhe e vendosa në rregull, mora lejen. Publikuar në GitHub për të gjithë të enjten (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Marrë tashmë 600 yje, 2 kërkesa tërheqëse për shtimin e mbështetjes për openstack dhe kubernetes. Reagime të mira. Në përgjithësi, projekti është i dobishëm për njerëzit
Unë i këshilloj të gjithë ata që duan të fillojnë të punojnë me Terraform dhe të mos rishkruajnë gjithçka për këtë.
Do të jem i lumtur të tërheq kërkesa, çështje, yje.

demonstrim
Terraformer - Infrastructure To Code

Burimi: www.habr.com

Shto një koment