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
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
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
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).
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
Iturria: www.habr.com