Es vÄlÄtos jums pastÄstÄ«t par jauno CLI rÄ«ku, kuru rakstÄ«ju, lai atrisinÄtu vecu problÄmu.
problÄma
Terraform jau sen ir bijis standarts Devops/Cloud/IT kopienÄ. Lieta ir ļoti Ärta un noderÄ«ga, lai risinÄtu infrastruktÅ«ru kÄ kodu. Terraform ir daudz prieka, kÄ arÄ« daudzas dakÅ”iÅas, asi naži un grÄbekļi.
Ar Terraform ir ļoti Ärti izveidot jaunas lietas un pÄc tam tÄs pÄrvaldÄ«t, mainÄ«t vai dzÄst. Ko darÄ«t tiem, kuriem mÄkonÄ« ir milzÄ«ga infrastruktÅ«ra un kas nav izveidoti, izmantojot Terraform? Visa mÄkoÅa pÄrrakstÄ«Å”ana un atkÄrtota izveide ir dÄrga un nedroÅ”a.
Es saskÄros ar Å”o problÄmu 2 darbos, visvienkÄrÅ”Äkais piemÄrs ir, ja vÄlaties, lai viss bÅ«tu Git formÄtÄ terraform failu veidÄ, bet jums ir 250+ spaiÅi, un ir ļoti daudz tos rakstÄ«t terraformÄ ar roku.
Ir
KopumÄ viss ir kÄ bildÄ tikai no labÄs uz kreiso pusi
BrÄ«dinÄjumi: Autors nedzÄ«vo pusi mūža KrievijÄ un maz raksta krieviski. Uzmanieties no pareizrakstÄ«bas kļūdÄm.
RisinÄjumi
1. AWS ir gatavi un veci risinÄjumi
KÄ darbojas terraformÄÅ”ana: tÄ Åem datus no AWS SDK un Ä£enerÄ tf un tfstate, izmantojot veidni.
Å eit ir 3 problÄmas:
1. AtjauninÄjumos vienmÄr bÅ«s kavÄÅ”anÄs
2. tf faili dažreiz iznÄk bojÄti
3. tfstate tiek savÄkts atseviŔķi no tf un ne vienmÄr saplÅ«st
VispÄr ir grÅ«ti iegÅ«t rezultÄtu, kurÄ `terraforma plÄnÄ` teikts, ka izmaiÅu nav
2. "Terraform import" ir terraformÄ iebÅ«vÄta komanda. KÄ tas darbojas?
JÅ«s ierakstÄt tukÅ”u TF failu ar resursa nosaukumu un veidu, pÄc tam palaidiet "terraform import" un nododiet resursa ID. terraform sazinÄs ar pakalpojumu sniedzÄju, saÅem datus un izveido tfstate failu.
Å eit ir 3 problÄmas:
1. MÄs saÅemam tikai tfstate failu, un tf ir tukÅ”s, jums tas ir jÄraksta manuÄli vai jÄkonvertÄ no tfstate
2. Var vienlaikus strÄdÄt tikai ar vienu resursu un neatbalsta visus resursus. Un ko man atkal darÄ«t ar 250+ spaiÅiem?
3. Jums ir jÄzina resursu ID ā tas ir jÄiekļauj kodÄ, kas iegÅ«st resursu sarakstu.
KopumÄ rezultÄts ir daļÄjs un nav labi mÄrogojams
Mans lÄmums
Prasības:
1. SpÄja izveidot resursiem tf un tfstate failus. PiemÄram, lejupielÄdÄjiet visus segmentus/droŔības grupu/slodzes lÄ«dzsvarotÄju un `terraform plan` atgriezÄs, ka nav izmaiÅu.
2. Jums nepiecieÅ”ami 2 GCP + AWS mÄkoÅi
3. GlobÄls risinÄjums, kas ir viegli atjaunojams katru reizi un netÄrÄ laiku katram resursam 3 dienu darbam
4. Padariet to par atvÄrto avotu ā visiem ir viena un tÄ pati problÄma
Go valoda ir iemesls, kÄpÄc man tÄ patÄ«k, un tai ir bibliotÄka HCL failu izveidei, kas tiek izmantota terraformÄ + daudz koda terraformÄ, kas var bÅ«t noderÄ«gs.
Taka
MÄÄ£inÄjums vispirms
Es sÄku ar vienkÄrÅ”u versiju. Sazinieties ar mÄkoni, izmantojot SDK, lai iegÅ«tu nepiecieÅ”amo resursu un pÄrvÄrstu to par laukiem terraformai. MÄÄ£inÄjums nekavÄjoties nomira droŔības grupÄ, jo man nepatika 1.5 dienas, lai pÄrveidotu tikai droŔības grupu (un resursu ir daudz). Ilgu laiku un pÄc tam laukus var mainÄ«t/pievienot
Otrais mÄÄ£inÄjums
Pamatojoties uz aprakstīto ideju
Tagad veiksim rekursÄ«vo pornogrÄfiju, rakstot pÄrveidotÄju tfstate uz tf. Tiem, kas nekad nav lasÄ«juÅ”i tfstate, tas ir JSON, taÄu Ä«paÅ”s.
Å eit ir tÄ svarÄ«gÄs daļas atribÅ«ti
"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",
Tur ir:
1. id - virkne
2. metadati - 1. izmÄra masÄ«vs un tajÄ objekts ar laukiem, kas aprakstÄ«ts zemÄk
3. specifikÄcija - 1. izmÄra hash un atslÄga, vÄrtÄ«ba tajÄ
ÄŖsÄk sakot, jautrs formÄts, viss var bÅ«t vairÄkos lÄ«meÅos dziļŔ
"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",
KopumÄ, ja kÄds vÄlas programmÄÅ”anas problÄmu intervijai, vienkÄrÅ”i palÅ«dziet viÅam uzrakstÄ«t parseri Å”im uzdevumam :)
PÄc daudziem mÄÄ£inÄjumiem uzrakstÄ«t parsÄtÄju bez kļūdÄm, es atradu daļu no tÄ terraform kodÄ un vissvarÄ«gÄko daļu. Un likÄs, ka viss darbojÄs labi
TrÄ«s mÄÄ£inÄjums
terraform nodroÅ”inÄtÄji ir binÄrie faili, kas satur kodu ar visiem resursiem un loÄ£iku darbam ar mÄkoÅa API. Katram mÄkonim ir savs nodroÅ”inÄtÄjs, un pati terraforma tos izsauc tikai, izmantojot savu RPC protokolu starp diviem procesiem.
Tagad es nolÄmu tieÅ”i sazinÄties ar terraformu nodroÅ”inÄtÄjiem, izmantojot RPC zvanus. Tas izrÄdÄ«jÄs skaisti un ļÄva mainÄ«t terraformu nodroÅ”inÄtÄjus uz jaunÄkiem un iegÅ«t jaunas funkcijas, nemainot kodu. IzrÄdÄs arÄ«, ka ne visiem laukiem tfstate ir jÄbÅ«t tf, bet kÄ to uzzinÄt? VienkÄrÅ”i jautÄjiet savam pakalpojumu sniedzÄjam par to. Tad sÄkÄs cita rekursÄ«va pornogrÄfija, kurÄ tika apkopotas regulÄras izteiksmes, meklÄjot laukus tfstate iekÅ”ienÄ visos lÄ«meÅos.
Galu galÄ mÄs ieguvÄm noderÄ«gu CLI rÄ«ku, kuram ir kopÄja infrastruktÅ«ra visiem terraform pakalpojumu sniedzÄjiem, un jÅ«s varat viegli pievienot jaunu. TurklÄt resursu pievienoÅ”ana aizÅem maz koda. Plus vÄl visÄdi labumi, piemÄram, savienojumi starp resursiem. Protams, bija daudz dažÄdu problÄmu, kuras nevar aprakstÄ«t visas.
Es nosaucu dzīvnieku par Terrafomer.
FinÄls
Izmantojot Terrafomer, mÄs no diviem mÄkoÅiem Ä£enerÄjÄm 500ā700 tÅ«kstoÅ”us tf + tfstate koda rindiÅu. MÄs varÄjÄm paÅemt mantotÄs lietas un sÄkt tÄm pieskarties tikai caur terraformu, kÄ vislabÄkajÄ infrastruktÅ«rÄ kÄ koda idejas. Tas ir tikai maÄ£isks, kad paÅemat milzÄ«gu mÄkoni un saÅemat to ar komandas starpniecÄ«bu terraformas darbinieka failu veidÄ. Un tad grep/replace/git un tÄ tÄlÄk.
IzÄ·emmÄju un savedu kÄrtÄ«bÄ, dabÅ«ju atļauju. Izlaists GitHub ikvienam ceturtdien (02.05.19/XNUMX/XNUMX).
Jau saÅemti 600 zvaigznes, 2 pievilkÅ”anas pieprasÄ«jumi, lai pievienotu atbalstu openstack un kubernetes. Labas atsauksmes. KopumÄ projekts cilvÄkiem ir noderÄ«gs
Es iesaku visiem, kas vÄlas sÄkt strÄdÄt ar Terraform un nepÄrrakstÄ«t visu Å”im nolÅ«kam.
Ar prieku izvilkÅ”u pieprasÄ«jumus, jautÄjumus, zvaigznes.
Demo
Avots: www.habr.com