Terraformer - Azpiegitura Kodetzeko

Terraformer - Azpiegitura Kodetzeko
Arazo zahar bat konpontzeko idatzi nuen CLI tresna berriaren berri eman nahiko nuke.

arazoa

Terraform aspalditik estandarra da Devops/Cloud/IT komunitatean. Gauza oso erosoa eta erabilgarria da azpiegitura kode gisa tratatzeko. Terraform-en gozamen asko daude, baita sardexka, aizto zorrotz eta arrastel ugari ere.
Terraform-ekin oso erosoa da gauza berriak sortzea eta gero kudeatzea, aldatzea edo ezabatzea. Zer egin beharko lukete hodeian azpiegitura erraldoia dutenek eta Terraform bidez sortu ez direnek? Hodei osoa berridaztea eta birsortzea, nolabait, garestia eta ez da segurua.
Arazo hau 2 lanetan aurkitu nuen, adibiderik errazena Git-en dena terraform fitxategi moduan egotea nahi duzunean da, baina 250 ontzi baino gehiago dituzu eta asko da eskuz terraform-en idaztea.
Ez dago alea 2014tik inportazioa egongo den itxaropenarekin 2016an itxi zuten terrafom-en.

Oro har, dena irudian bezala dago eskuinetik ezkerrera bakarrik

Abisuak: Egilea ez da Errusian bizi bere bizitza erdian eta gutxi idazten du errusieraz. Kontuz akats ortografikoekin.

РСшСния

1. AWSrako prest dauden irtenbide zaharrak daude terraformazioa. Nire 250 ontzi baino gehiago sartzen saiatu nintzenean, han dena gaizki zegoela konturatu nintzen. AWS aspalditik aukera berri asko sartzen ari da, baina terraformazioak ez ditu ezagutzen eta, oro har, errubia da txantiloiak eskasa dirudi. Arratsaldeko 2ak pasata bidali nuen Tira eskaera hor ezaugarri gehiago gehitzeko eta konturatu zen irtenbide hori ez dela batere egokia.
Terraformazioak nola funtzionatzen duen: AWS SDK-ko datuak hartzen ditu eta tf eta tfstate sortzen ditu txantiloi baten bidez.
Hemen 3 arazo daude:
1. Eguneratzeetan beti egongo da atzerapena
2. tf fitxategiak batzuetan hautsita ateratzen dira
3. tfstate tf-tik bereizita biltzen da eta ez da beti bat egiten
Oro har, zaila da `terraform plan` aldaketarik ez dagoela esaten duen emaitza bat lortzea

2. `terraform import` terraform-en barneko komando bat da. Nola dabil?
TF fitxategi huts bat idazten duzu baliabidearen izena eta motarekin, ondoren `terraform import` exekutatu eta baliabidearen IDa pasa. terraform hornitzailearekin harremanetan jartzen da, datuak jasotzen ditu eta tfstate fitxategi bat egiten du.
Hemen 3 arazo daude:
1. Tfstate fitxategi bat bakarrik lortzen dugu, eta tf hutsik dago, eskuz idatzi behar duzu edo tfstate-tik bihurtu
2. Baliabide batekin bakarrik lan egin dezake aldi berean eta ez ditu baliabide guztiak onartzen. Eta zer egin behar dut berriro 250 ontzi baino gehiagorekin?
3. Baliabideen IDa ezagutu behar duzu, hau da, baliabideen zerrenda lortzen duen kodean bildu behar duzu.
Oro har, emaitza partziala da eta ez da ondo eskalatzen

Nire erabakia

baldintzak:
1. Baliabideetarako tf eta tfstate fitxategiak sortzeko gaitasuna. Adibidez, deskargatu kuboak/segurtasun talde/karga-orekatzailea eta `terraform plan` horrek aldaketarik ez dagoela itzuli zuen
2. 2 GCP + AWS hodei behar dituzu
3. Soluzio globala, aldi bakoitzean eguneratzeko erraza dena eta 3 eguneko lanerako baliabide bakoitzean denborarik galtzen ez duena
4. Egin ezazu kode irekia - denek arazo bera dute

Go hizkuntza horregatik maite dut, eta terraform-en erabiltzen den HCL fitxategiak sortzeko liburutegia du + erabilgarria izan daitekeen kode asko terraform-en

Path

Saiatu lehenik
Bertsio sinple batekin hasi nintzen. SDK bidez hodeiarekin harremanetan jarri behar den baliabidea lortzeko eta terraform-erako eremu bihurtzea. Saiakera berehala hil zen segurtasun taldean, ez zitzaidalako gustatu 1.5 egun segurtasun taldea bakarrik bihurtzeko (eta baliabide asko daude). Denbora luzez eta gero eremuak aldatu/gehi daitezke

Bigarren saiakera
Deskribatutako ideian oinarrituta Hemen. Hartu eta bihurtu tfstate tf-ra. Datu guztiak hor daude eta eremuak berdinak dira. Nola lortu tfstate osoa baliabide askotarako?? Hau da `terraform refresh` komandoa erreskatatu zen. terraformek baliabide guztiak hartzen ditu tfstate-n eta, IDaren arabera, horien datuak ateratzen ditu eta dena idazten du tfstate-n. Hau da, sortu tfstate huts bat izenekin eta IDekin soilik, exekutatu `terraform refresh` eta gero tfstates osoak lortuko ditugu. Aupa!
Orain egin dezagun tfstate-rako bihurgailu bat idazteko pornografia errekurtsiboa. Inoiz tfstate irakurri ez dutenentzat JSON da, baina berezia.
Hona hemen bere zati garrantzitsuen ezaugarriak

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

Badago:
1. id - katea
2. metadatuak - 1 tamainako array bat eta behean deskribatzen den eremuak dituen objektu bat
3. spec - 1 tamainako hash eta gakoa, balioa bertan
Laburbilduz, formatu dibertigarria, dena hainbat mailatako sakonera izan daiteke

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

Orokorrean, norbaitek elkarrizketa baterako programazio arazoren bat nahi badu, eska iezaiozu ataza honetarako analizatzaile bat idazteko :)
Analizatzaile bat akatsik gabe idazteko saiakera askoren ondoren, zati bat aurkitu dut terraform kodean, eta zati garrantzitsuena. Eta dena ondo funtzionatzen omen zuen

Hiru saiakera
terraform hornitzaileak hodeiko APIarekin lan egiteko baliabide eta logika guztiekin kodea duten bitarrak dira. Hodei bakoitzak bere hornitzaile propioa du eta terraformek berak bakarrik deitzen die bere RPC protokoloaren bidez bi prozesuren artean.
Orain terraform hornitzaileekin zuzenean harremanetan jartzea erabaki nuen RPC deien bidez. Ederki atera zen eta posible egin zuen terraform hornitzaileak berriagoak aldatzea eta funtzio berriak lortzea kodea aldatu gabe. Gainera, ikusten da tfstate-ko eremu guztiak ez direla tf-n egon behar, baina nola jakin dezakezu? Galdetu zure hornitzaileari honi buruz. Ondoren, adierazpen erregularrak biltzeko beste pornografia errekurtsibo bat hasi zen, tfstate barruko eremuak sakonki maila guztietan bilatzen.

Azkenean, terraform hornitzaile guztientzat azpiegitura komun bat duen CLI tresna erabilgarria lortu dugu eta berri bat erraz gehi dezakezu. Gainera, baliabideak gehitzeak kode gutxi behar du. Gainera, era guztietako onak, hala nola baliabideen arteko konexioak. Jakina, denak deskribatu ezin diren hainbat arazo zeuden.
Animaliari Terrafomer izena jarri nion.

finale

Terrafomer erabiliz, tf + tfstate kodea 500-700 mila lerro sortu genituen bi hodeietatik. Oinarrizko gauzak hartu eta terraform bidez bakarrik ukitzen hasi ginen, kode ideia gisa azpiegiturarik onenean bezala. Magia besterik ez da hodei handi bat hartu eta talde baten bidez jasotzen duzunean, terraform worker fitxategien forman. Eta gero grep/replace/git eta abar.

Orraztu eta ordenatu nuen, baimena lortu nuen. GitHub-en kaleratu zen denentzat ostegunean (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Dagoeneko 600 izar jaso ditu, 2 pull eskaera openstack eta kubernetes-en laguntza gehitzeko. Iritzi ona. Oro har, proiektua jendearentzat erabilgarria da
Terraform-ekin lanean hasi eta horretarako dena ez berridatzi nahi duten guztiei gomendatzen diet.
Pozik aterako naiz eskaerak, gaiak, izarrak.

demo
Terraformer - Azpiegitura Kodetzeko

Iturria: www.habr.com

Gehitu iruzkin berria