Terraformer – Infra struktuur Koodiks

Terraformer – Infra struktuur Koodiks
Tahan rÀÀkida uuest CLI tööriistast, mille ma olen loonud ĂŒhe vana probleemi lahendamiseks.

Probleem

Terraform on juba pikka aega olnud standard DevOps/Cloud/IT kogukonnas. See on vÀga mugav ja kasulik tööriist infrastruktuuri kui koodi haldamiseks. Terraformil on palju eeliseid, aga ka palju harusid, teravaid noad ja hunnikuid, millega tuleb arvestada.
Terraformiga on uute asjade loomine ja nende haldamine, muutmine vĂ”i kustutamine vĂ€ga mugav. Aga mis teha neil, kellel on suur infrastruktuur pilves, mis ei ole loodud lĂ€bi Terraformi? KĂ”igi asjade ĂŒmberkirjutamine ja uuesti loomine on kallis ja ebatervislik.
Olen sellise probleemiga kokku puutunud kahel tööl. Lihtsaim nÀide on, kui soovid, et kÔik oleks Gitis Terraformi failide kujul, aga sul on 250+ Àmber ja nende kÀsitsi kirjutamine Terraformi jaoks on lihtsalt liiga palju.
On probleem Probleem on olnud Terraformis alates 2014. aastast, mille nad sulgesid 2016. aastal lootuses, et lisatakse impordi funktsioon.

KokkuvÔttes on kÔik nagu pildil, ainult vasakult paremale.

Hoiatused: Autor on pool elu elanud vÀljaspool Venemaad ja kirjutab vene keeles harva. Ole ettevaatlikud Ôigekirja vigade suhtes.

Lahendused

1. On olemas vanad ja töötavad lahendused AWS jaoks. terraforming. Kui ma proovisin sellele ligi pÀÀseda, et saada oma 250+ Ă€mbrit, sain aru, et seal on kĂ”ik halvasti. AWS on juba pikka aega lisanud palju uusi valikuid, kuid terraforming ei tea neist ja seda on kirjutatud Ruby's. mallid nĂ€evad vaesed vĂ€lja. PĂ€rast kella 2 Ă”htul saatsin Pull request , et lisada sinna rohkem vĂ”imalusi ja sain aru, et selline lahendus ei sobi ĂŒldse.
Kuidas terraforming töötab? Ta vÔtab AWS SDK-st andmed ja genereerib tf ja tfstate mallide kaudu.
Siin on 3 probleemi:
1. Seal hakkab alati olema ajakohasuse mahajÀÀmus.
2. tf failid tulevad vahel vigased.
3. tfstate koostatakse eraldi tf-st ja need ei sobi alati kokku.
Üldiselt on keeruline saada tulemust, kus `terraform plan` ĂŒtleb, et muudatusi ei ole.

2. `terraform import` — sisseehitatud kĂ€sk terraformis. Kuidas see töötab?
Sa kirjutad tĂŒhja TF faili, millel on ressursi nimi ja tĂŒĂŒp, seejĂ€rel kĂ€ivitad `terraform import` ja edastad ressursi ID. Terraform pöördub pakkuja poole, saadab andmed ja loob tfstate faili.
Siin on 3 probleemi:
1. Saame ainult tfstate faili, samas tf jÀÀb tĂŒhjaks, selle tuleb kĂ€sitsi kirjutada vĂ”i konvertida tfstate-st.
2. Suudab töötada ainult ĂŒhe ressursiga iga kord ja ei toeta kĂ”iki ressursse. Ja mida ma pean uuesti tegema 250+ Ă€mbri puhul?
3. Peab teada ressursside ID-d — see tĂ€hendab, et tuleb kirjutada kood, mis hangib ressursside nimekirja.
Tegelikult on tulemus osaliselt lÔplik ja ei skaala hÀsti.

Minu lahendus.

NÔuded:
1. VĂ”imalus luua tf ja tfstate faile ressurssidest. NĂ€iteks alla laadida kĂ”ik bucket'id / turverĂŒhmad / koormusbalansseerijad ning mis `terraform plan` tagastab, et muudatusi ei ole.
2. Vaja on kaht pilve: GCP + AWS.
3. Globaalne lahendus, mida on lihtne uuendada iga kord, ja ei pea kulutama iga ressursi puhul kolm pÀeva tööd.
4. Teha avatud lĂ€htekoodiga — probleem, millega kĂ”ik silmitsi seisavad.

Go keel — seetĂ”ttu, et ma armastan seda, ja sellel on raamatukogu HCL failide loomiseks, mida kasutatakse terraformis + palju kasulikku koodi terraformis.

Tee.

Esimene katse.
Alustasin lihtsa variandiga. Pöördumine pilve SDK kaudu vajaliku ressursi poole ja selle konverteerimine terraformi vĂ€ljadeks. Katse suri kohe turverĂŒhma tĂ”ttu, kuna mulle ei meeldinud 1,5 pĂ€eva konverteerida ainult turverĂŒhma (ressursse on palju). Liiga pikk ja siis vĂ”ivad vĂ€ljad muutuda / lisanduda.

Teine katse.
PĂ”hineb kirjelduse ideel. siin. Lihtsalt vĂ”tke ja konverteerige tfstate tf-ks. KĂ”ik andmed on seal olemas ja vĂ€ljad samad. Kuidas saada tĂ€ielik tfstate paljude ressursside jaoks?? Siin tuleb appi kĂ€sk `terraform refresh`. Terraform vĂ”tab kĂ”ik ressursid tfstate-st ja tĂ”mbab nende andmed ID jĂ€rgi ning kirjutab need kĂ”ik tfstate-sse. Nii et loome tĂŒhja tfstate ainult nimede ja ID-dega, kĂ€ivitame `terraform refresh` ja saame tĂ€ielikud tfstate-d. Hurraa!
NĂŒĂŒd tegeleme rekursiivse pornotööstuse kirjutamisega konverteri jaoks tfstate-st tf-ks. Neile, kes pole kunagi tfstate-d lugenud, on see JSON, aga eriline.
Siin on selle oluline osa atribuudid

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

Siin on:
1. id — string
2. metadata — massiiv, mille suurus on 1 ja milles on objekt alljĂ€rgnevas kirjelduses
3. spec — hash, mille suurus on 1 ja milles on key,value
KokkuvÔttes on see tore formaat, kÔik vÔib olla ka mitmel tasemel

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

Kes kokku, kes tahab intervjule programmeerimisĂŒlesannet, kĂŒsige lihtsalt parseri kirjutamist selle jaoks 🙂
PÀrast pikki katseid kirjutada parserit ilma vigadeta leidsin osa sellest terraformi koodist, nimelt kÔige olulisema osa. Ja kÔik nÀis töötavat normaalselt.

Katse kolm
terraform provider – need on binaarsed failid, mis sisaldavad koodi kĂ”igi ressursside ja loogika jaoks, et töötada pilve API-dega. Igal pilvel on oma provider ja terraform kutsub neid lihtsalt oma RPC protokolli kaudu kahe protsessi vahel.
NĂŒĂŒd otsustasin pöörduda otse terraform providerite poole lĂ€bi RPC kutsete. See osutus ilusaks ja vĂ”imaldas vahetada terraform providerid vĂ€rskemate vastu, saades uusi vĂ”imalusi, ilma koodi muutmata. Samuti selgus, et kĂ”ik vĂ€ljad tfstate'is ei pruugi olla tf-is, aga kuidas seda teada saada? Ainult kĂŒsides providerilt selle kohta. Siis algas veel ĂŒks rekursiivne pornograafia regulaarsete vĂ€ljendite koostamisega ja vĂ€ljade otsimisega tfstate'i sĂŒgavamates kihtides.

LĂ”puks saime kasuliku CLI tööriista, millel on ĂŒhine infrastruktuur kĂ”igi terraformi pakkujate jaoks ja uut saab lihtsasti lisada. Samuti vĂ”tavad ressursside lisamine vĂ€he koodi. Pluss erinevad lisafunktsioonid, nĂ€iteks ressursside vahelised ĂŒhendused. Muidugi oli palju erinevaid probleeme, mida kĂ”iki ei saaks kirjeldada.
Nimeks sai Terrafomer.

Finaal

Kasutades Terrafomerit, genereerisime 500–700 tuhat rida tf + tfstate koodi kahe pilve vahel. Suutsime vĂ”tta pĂ€randiga asju ja alustada nende muutmist ainult terraformi kaudu, nagu parimates infrastruktuuri koodi ideedes. Lihtsalt maagia, kui vĂ”tad tohutu pilve ja saad kĂ€su abil töötavad terraformi failid. Edasi grep/replace/git ja nii edasi.

Kalkuleerisin ja viisin korda, sain load. VÀljastasin reedel (02.05.19) GitHubis kÔigile. github.com/GoogleCloudPlatform/terraformer
Sain juba 600 tĂ€hte, 2 pull requesti openstacki ja kubernetes'e toe lisamiseks. HĂ€id ĂŒlevaateid. Üldiselt on projekt kasulik inimestele.
Soovitan kĂ”igile, kes soovivad alustada Terraformiga töötamist, ilma et peaksid kĂ”ike selleks ĂŒmber kirjutama.
Olen rÔÔmus pull requestide, probleemide, ja tĂ€htede ĂŒle.

Demos
Terraformer – Infra struktuur Koodiks

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster