Terraformer — Infrastruktuur Koodina

Terraformer — Infrastruktuur Koodina
Tahaksin rÀÀkida uuest CLI tööriistast, mille ma kirjutasin, et lahendada ĂŒks vana probleem.

Probleem

Terraform on juba pikka aega olnud standard DevOps / Cloud / IT kogukonnas. See on vÀga mugav ja kasulik infrastruktuuri koodina haldamiseks. Terraformis on palju eeliseid, aga ka sÔlmi, teravaid noazi ja augusid.
Terraformiga on vĂ€ga mugav luua uusi asju ja seejĂ€rel neid hallata, muuta vĂ”i kustutada. Aga mida teha nendele, kellel on suur infrastruktuur pilves, mis ei ole loodud Terraformiga? Kogu pilve ĂŒlekirjutamine ja uuesti loomine on kuidagi kallis ja ohtlik.
Ma olen sellise probleemiga kokku puutunud kahel töökohal, kÔige lihtsam nÀide on see, kui tahad, et kÔik oleks versioonihaldes Terraformi failide kujul, aga sul on 250+ baketit ja kirjutada need kÀsitsi Terraformiks on kuidagi liiga palju.
Jah probleem juba alates 2014. aastast Terraformis, mis suleti 2016. aastal lootuses, et tuleb import.

ÜhesĂ”naga, kĂ”ik on nagu pildil, ainult paremale vasakule

Hoiatus: Autor elab pool elu vÀljaspool Venemaad ja kirjutab vene keeles harva. Olge ettevaatlikud Ôigekirja vigade osas.

Lahendused

1. On olemas valmis ja vana lahendus AWS jaoks terraforming. Kui proovisin selle abil saada minu 250+ baketit, sain aru, et seal on kĂ”ik vĂ€ga halvasti. AWS on juba ammu lisanud palju uusi valikuid, mille kohta terraforming ei tea ning see kasutab ruby keelt. mallid nĂ€ivad vaesed. PĂ€rast kahte Ă”htut saatsin Pull request , et lisada sinna rohkem vĂ”imalusi ja sain aru, et selline lahendus ei sobi ĂŒldse.
Kuidas terraforming töötab: see vÔtab AWS SDK-st andmed ja genereerib tf ja tfstate mallide kaudu.
Siin on kolm probleemi:
1. Seal on alati viivitus uuendustes
2. tf failid on mÔnikord rikutud
3. tfstate kogutakse eraldi tf-st ja ei ĂŒhti alati
Üldiselt on keeruline saada tulemust, kus `terraform plan` ĂŒtleb, et muudatust pole.

2. `terraform import` — sisseehitatud kĂ€sk Terraformis. Kuidas see töötab?
Sa kirjutad tĂŒhja TF faili ressursi nime ja kuvandi jaoks, siis kĂ€ivitad `terraform import` ja edastad ressursi ID. Terraform pöördub teenusepakkuja poole, saab andmed ja loob tfstate faili.
Siin on kolm probleemi:
1. Saame ainult tfstate faili, aga tf on tĂŒhi, selle peab kĂ€sitsi kirjutama vĂ”i konverteerima tfstate-st
2. Suudab töötada ainult ĂŒhe ressursiga korraga ega toeta kĂ”iki ressursse. Ja mida ma pean jĂ€lle tegema 250+ baketiga?
3. Pead teadma ressursi ID-d — see tĂ€hendab, et tuleb selle ĂŒmber kirjutada kood, mis hangib ressurside nimekirja
Üldiselt on tulemus osaline ja ei sobi hĂ€sti skaleerimiseks.

Minu lahendus

NÔuded:
1. VÔime luua tf ja tfstate faile ressurssidest. NÀiteks alla laadida kÔik bucketid/security group/koormuse tasakaalustajad ja et `terraform plan` nÀitaks, et muudatusi pole.
2. VĂ€hemalt 2 pilve GCP + AWS.
3. Globaalne lahendus, mida on lihtne igal korral uuendada, mitte iga ressursi peale 3 pÀeva raisata.
4. Teha avatud lĂ€htekoodiga – probleem, millega kĂ”ik kokku puutuvad.

Go keel – sellepĂ€rast mulle see meeldib, ja sellel on HCL failide loomise teek, mida kasutatakse terraformis + palju koodi terraformis, mis vĂ”ib olla kasulik.

Tee

Esimene katse
Alustasin lihtsa variandiga. Ühendused pilve kaudu SDK abil vajaliku ressursi hankimiseks ja selle konverteerimine terraformi vĂ€ljadeks. Katse suri kohe security group'iga, kuna mulle ei meeldinud 1.5 pĂ€eva kulutada ainult security group'i konverteerimiseks (ressursse on palju). Aeglane ja siis vĂ”ivad vĂ€ljad muutuda/atteraakon Ă”lmida.

Teine katse
PĂ”hineb kirjeldatud ideel. siit. Lihtsalt vĂ”tta ja konverteerida tfstate tf-ks. KĂ”ik andmed on seal olemas ja vĂ€ljad on samad. Kuidas saada tĂ€ielik tfstate paljude ressursside jaoks?? Siin tuli appi kĂ€sk `terraform refresh`. Terraform vĂ”tab kĂ”ik ressursid tfstate's ja toob ID jĂ€rgi need andmed ning kirjutab kĂ”ik tfstate'sse. Seega tuleb luua tĂŒhi tfstate, millel on ainult nimed ja ID, kĂ€ivitada `terraform refresh`, siis saame tĂ€ielikud tfstate'id. Hurraa!
NĂŒĂŒd hakkame tegelema rekursiivse konverteri kirjutamisega tfstate'ist tf-ks. Neile, kes pole kunagi tfstate'i lugenud, on see JSON, aga erilisel kujul.
Siin on selle oluline osa attributes

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

Siit leiate:
1. id — string
2. metadata — massiiv suurusega 1 ja selles on objekt, mille vĂ€ljad on allpool kirjeldatud
3. spec — hash, mille suurus on 1 ja sellel on key,value
ÜhesĂ”naga tobe formaat, kĂ”ik vĂ”ib minna sĂŒgavamale ka mitme tasandi vĂ”rra.

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

Üldiselt, kes tahab programmeerimise ĂŒlesannet vestlusintervjuuks, siis paluge lihtsalt kirjutada parser selle jaoks 🙂
PÀrast pikki katseid kirjutada parserit ilma vigadeta leidsin osa sellest terraformi koodist, mis on kÔige olulisem osa. Ja kÔik töötab nagu peab.

Katse kolm
Terraform provider on binaarfailid, milles on kood kÔikide ressursside ja loogikaga, et töötada pilvete API-dega. Igal pilvel on oma provider ja terraform kutsub neid vÀlja lÀbi oma RPC protokolli kahe protsessi vahel.
NĂŒĂŒd otsustasin pöörduda otse terraformi providerite poole RPC kutsete kaudu. See toimis kenasti ja andis vĂ”imaluse asendada terraformi providerid uuemate vastu, saamata uut funktsionaalsust koodi muutmata. Selgus, et mitte kĂ”ik vĂ€ljad tfstate-s ei pea olema tf-s, aga kuidas seda teada saada? Ainult kĂŒsides providerilt selle kohta. Siis algas veel ĂŒks rekursiivne hĂ”beke regulaarsete vĂ€ljendite koostamiseks, otsides vĂ€lju tfstate seest igal tasemel sĂŒgavusse.

LĂ”puks sai kasulik CLI tööriist, millel on ĂŒhine infrastruktuur kĂ”igi terraformi providerite jaoks ja uus on lihtne lisada. Samuti vĂ”tab ressursside lisamine vĂ€he koodi. Pluss igasuguseid mugavusi, nagu ressursside vaheline seos. Loomulikult oli palju erinevaid probleeme, mida kĂ”iki ei saa kirja panna.
Nimetasin looma Terrafomeriks.

Finaal

Kasutasime Terrafomeri abil 500-700 tuhat rida tf + tfstate koodi kahe pilvega. Suutsime vÔtta pÀrandlahendusi ja hakata neist kÀitama ainult terraformiga, nagu parimates ideedes infrastructure as code. Lihtsalt maagia, kui vÔtad suure pilve ja saad selle kÀsuga terraformifailidesse. Edasi grep/replace/git ja nii edasi.

Kalkuleerisin ja korrastasin, sain load. Avaldasin GitHubis kÔigile neljapÀeval (02.05.19). github.com/GoogleCloudPlatform/terraformer
Olen juba saanud 600 tĂ€hte, 2 pull requesti openstacki ja kubernete toe lisamiseks. HĂ€id arvustusi. Üldiselt on projekt inimestele kasulik.
Soovitan kĂ”igile, kes soovivad alustada Terraformiga töötamist ja mitte kĂ”ike selleks ĂŒmber kirjutada.
Olen rÔÔmus pull requestide, probleemide, tĂ€htede ĂŒle.

Demo
Terraformer — Infrastruktuur Koodina

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster