Terraformer — Infrastruktur nĂ« Kod

Terraformer — Infrastruktur nĂ« Kod
Do të doja të flisja për një mjet CLI të ri që kam shkruar për të zgjidhur një problem të vjetër.

Problemi

Terraform ka kohë që është standard në komunitetet DevOps/Cloud/IT. Një gjë shumë e dobishme dhe e vlefshme për të menaxhuar infrastrukturën si kod. Ka shumë avantazhe në Terraform, por edhe shumë bifurkacione, thika të mprehta dhe grykëz.
Me Terraform Ă«shtĂ« shumĂ« e lehtĂ« tĂ« krijosh gjĂ«ra tĂ« reja dhe mĂ« pas t'i menaxhosh, t'i ndryshosh ose t'i fshish. ÇfarĂ« duhet tĂ« bĂ«jnĂ« ata qĂ« kanĂ« njĂ« infrastrukturĂ« tĂ« madhe nĂ« cloud dhe nuk Ă«shtĂ« krijuar pĂ«rmes Terraform? Ta rishtysh dhe ta rikrijosh gjithçka nĂ« cloud Ă«shtĂ« disi e shtrenjtĂ« dhe e pasigurt.
Kam hasur njĂ« problem tĂ« tillĂ« nĂ« dy punĂ«, shembulli mĂ« i thjeshtĂ« Ă«shtĂ« kur do tĂ« doje qĂ« gjithçka tĂ« ishte nĂ« Git si skedarĂ« Terraform, ndĂ«rsa ke 250+ kasa dhe Ă«shtĂ« disi shumĂ« t’i shkruash ato pĂ«r Terraform me dorĂ«.
Ka çështja Prej vitit 2014 kishte një terrafom që u mbyll në vitin 2016 me shpresën se do të kishte import.

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

Paralajmërime: Autori ka jetuar gjysmën e jetës jashtë Rusisë dhe shkruan pak në rusisht. Kujdes: gabime në ortografi.

Zgjidhjet

1. Ekziston një zgjidhje e gatshme dhe e vjetër për AWS terraforming. Kur përpiqesha të merrja 250+ bucket-e të mi përmes tij, kuptova se situata nuk ishte e mirë. AWS ka sjellë shumë opsione të reja, por terraformimi nuk është në dijeni për to dhe në përgjithësi përdor Ruby. templet duken të varfëra. Pas 2 pasdite, dërgova Pull request për të shtuar më shumë mundësi atje dhe kuptova që këto zgjidhje nuk janë të përshtatshme fare.
Si funksionon terraformimi? Merr të dhënat nga SDK AWS dhe gjeneron tf dhe tfstate përmes templeteve.
Këtu janë 3 probleme:
1. Do ketë gjithmonë një vonesë në përditësime
2. Ndër datotë tf ndonjëherë dalin të dëmtuara
3. tfstate grumbullohet veçmas nga tf dhe nuk përputhet gjithmonë
Në fakt, është e vështirë të marrësh një rezultat ku `terraform plan` thotë se nuk ka ndryshime.

2. `terraform import` — Ă«shtĂ« njĂ« komandĂ« e integruar nĂ« terraform. Si funksionon?
Shkruan një datotekë të zbrazët TF me emrin dhe tipin e burimit, pastaj ekzekuton `terraform import` dhe kalon ID-në e burimit. terraform i drejtohet ofruesit, merr të dhënat dhe krijon një skedë tfstate.
Këtu janë 3 probleme:
1. Marrim vetëm skedën tfstate, ndërsa tf mbetet e zbrazët dhe duhet ta shkruajmë manualisht ose ta konvertojmë nga tfstate.
2. Mënyra e funksionimit është vetëm për një burim çdo herë dhe nuk mbështet të gjitha burimet. Dhe çfarë duhet të bëj përsëri me 250+ bucket-e?
3. Duhet ditur ID e resurseve — pra duhet ta mbĂ«shtjellim atĂ« nĂ« kod qĂ« merr listĂ«n e resurseve.
Në të vërtetë, rezultati është pjesor dhe nuk shkallëzohet mirë.

Zgjidhja ime.

Kërkesat:
1. Mundësia për të krijuar skedarë tf dhe tfstate për resurset. Për shembull, shkarkoni të gjitha baret / grupin e sigurisë / balancuesin e ngarkesës dhe që `terraform plan` kthen se nuk ka ndryshime.
2. Duhet 2 cloud GCP + AWS.
3. Një zgjidhje globale që lehtë azhurnohet çdo herë dhe nuk humb kohë për çdo resurs për 3 ditë pune.
4. TĂ« bĂ«het Open source — tĂ« gjithĂ« kanĂ« njĂ« problem tĂ« tillĂ«.

Gjuha Go — sepse mĂ« pĂ«lqen, dhe ka njĂ« bibliotekĂ« pĂ«r krijimin e skedave HCL qĂ« pĂ«rdoret nĂ« terraform + shumĂ« kod nĂ« terraform qĂ« mund tĂ« jetĂ« i dobishĂ«m.

Rruga.

Përpjekja e parë.
E fillova një variant të thjeshtë. Qasja në cloud përmes SDK për burimin në nevojë dhe konvertimi i tij në fusha për terraform. Përpjekja vdiq menjëherë në grupin e sigurisë sepse nuk më pëlqeu të konvertoja vetëm grupin e sigurisë për 1.5 ditë (dhe ka shumë resurse). E gjatë dhe më pas fushat mund të ndryshojnë / shtohen.

Përpjekja e dytë.
E bazuar në idetë e përshkruara. këtu. Thjesht merrni dhe konvertoni tfstate në tf. Të dhënat atje janë dhe fushat janë të njëjta. Si të merrni një tfstate të plotë për shumë burime?? Këtu ndihmon komanda `terraform refresh`. Terraform merr të gjitha burimet në tfstate dhe, sipas ID-së, nxjerr të dhënat dhe i shkruan të gjitha në tfstate. Pra, krijoni një tfstate të zbrazët vetëm me emrat dhe ID-të, startoni `terraform refresh` dhe merrni tfstate të plota. Hurra!
Tani do të merremi me shkruarjen rekursive të konvertuesit për tfstate në tf. Për ata që nuk e kanë lexuar ndonjëherë tfstate, ai është JSON, por i veçantë.
Këtu është pjesa e tij e rëndësishme atribute

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

Këtu ka:
1. id — string
2. metadata — array me madhĂ«si 1 dhe nĂ« tĂ« njĂ« objekt me fushat e pĂ«rshkruara mĂ« poshtĂ«
3. spec — hash me madhĂ«si 1 dhe nĂ« tĂ« çelĂ«s, vlerĂ«
Në përmbledhje, formati është argëtues, gjithçka mund të shkojë thellë në disa nivele

                   "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 do njĂ« detyrĂ« programimi pĂ«r intervista, thjesht kĂ«rkoni njĂ« parser pĂ«r kĂ«tĂ« çështje 🙂
Pas përpjekjeve të gjata për të shkruar një parser pa gabime, gjeta një pjesë të tij në kodin terraform, përkatësisht pjesën më të rëndësishme. Dhe gjithçka dukej se funksiononte normalisht

Përpjekja tre
Terraform provider Ă«shtĂ« blloqe binare qĂ« pĂ«rmbajnĂ« kodin me tĂ« gjitha resurset dhe logjikĂ«n pĂ«r tĂ« punuar me API-tĂ« e krijuesve tĂ« hapĂ«sirave tĂ« cloud. Çdo cloud ka provider-in e tij dhe terraform-i vetĂ«m i thĂ«rret ato pĂ«rmes protokollit tĂ« tij RPC midis dy proceseve.
Tani vendosa të shkoj direkt te terraform providers përmes thirrjeve RPC. Kështu doli bukur dhe ofroi mundësinë për të ndërruar terraform providers me më të rinjtë dhe për të marrë mundësi të reja pa ndryshuar kodin. Këtu u zbulua gjithashtu se jo të gjitha fushat në tfstate duhet të jenë në tf, por si ta di këtë? Vetëm të kërkoj provider-in për këtë. Më pas filloi një tjetër pornografi rekursive mbi ndërtimin e shprehjeve të rregullta, një angazhim me kërkimin e fushave brenda tfstate në të gjitha nivelet e thellë.

Në fund, doli një mjet CLI i dobishëm me një infrastrukturë të përbashkët për të gjithë ofruesit e terraform-it dhe është e lehtë të shtosh të rinj. Po ashtu, shtimi i burimeve kërkon pak kod. Plus, ka një sërë veçorish si lidhjet midis burimeve. Sigurisht, kishte shumë probleme të ndryshme që nuk mund të përshkruhen të gjitha.
E quajta kafshën Terrafomer.

Finali

Me ndihmĂ«n e Terrafomer, generuam 500-700 mijĂ« rreshta kodi tf + tfstate nga dy cloud. ArritĂ«m tĂ« merrnim gjĂ«ra legacike dhe tĂ« fillonim t'i preknim ato vetĂ«m pĂ«rmes terraform-it si nĂ« idetĂ« mĂ« tĂ« mira tĂ« infrastrukturĂ«s si kod. ËshtĂ« thjesht magjike kur merr njĂ« cloud tĂ« madh dhe e merr atĂ« pĂ«rmes njĂ« komande nĂ« formĂ«n e skedarĂ«ve terraform tĂ« gatshĂ«m. Pastaj grep/replace/git dhe kĂ«shtu me radhĂ«.

E kam rregulluar dhe e kam sjellë në rregull, kam marrë leje. E publikova në GitHub për të gjithë të enjten (02.05.19). github.com/GoogleCloudPlatform/terraformer
Kam marrë tashmë 600 yje, 2 pull requests për shtimin e mbështetjes për openstack dhe kubernetes. Komente të mira. Në përgjithësi, projekti është i dobishëm për njerëzit.
E rekomandoj për të gjithë ata që dëshirojnë të fillojnë të punojnë me Terraform dhe të mos rishkruajnë gjithçka për këtë.
Do të jem i lumtur për pull requests, issues, stars.

Demo
Terraformer — Infrastruktur nĂ« Kod

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster