Ek wil jou graag vertel van die nuwe CLI-instrument wat ek geskryf het om 'n ou probleem op te los.
probleem
Terraform is lank reeds 'n standaard in die Devops/Cloud/IT-gemeenskap. Die ding is baie gerieflik en nuttig vir die hantering van infrastruktuur as kode. Daar is baie lekkertes in Terraform sowel as baie vurke, skerp messe en harke.
Met Terraform is dit baie gerieflik om nuwe dinge te skep en dit dan te bestuur, te verander of uit te vee. Wat moet diegene doen wat 'n groot infrastruktuur in die wolk het en nie deur Terraform geskep is nie? Om die hele wolk te herskryf en te herskep, is op een of ander manier duur en onveilig.
Ek het hierdie probleem by 2 werke teëgekom, die eenvoudigste voorbeeld is wanneer jy wil hê alles moet in git-vorm as terraform-lêers wees, maar jy het 250+ emmers en dit is baie om dit in terraform met die hand te skryf.
Daar is
Oor die algemeen is alles net van regs na links soos op die foto
Waarskuwings: Die skrywer woon nie die helfte van sy lewe in Rusland nie en skryf min in Russies. Pasop vir spelfoute.
Oplossings
1. Daar is klaargemaakte en ou oplossings vir AWS
Hoe terraforming werk: dit neem data van die AWS SDK en genereer tf en tfstate deur 'n sjabloon.
Daar is 3 probleme hier:
1. Daar sal altyd 'n vertraging in opdaterings wees
2. tf lêers kom soms stukkend uit
3. tftoestand word apart van tf versamel en konvergeer nie altyd nie
Oor die algemeen is dit moeilik om 'n uitslag te kry waarin `terraform plan` sê dat daar geen veranderinge is nie
2. `terraform import` is 'n ingeboude opdrag in terraform. Hoe werk dit?
Jy skryf 'n leë TF-lêer met die naam en tipe hulpbron, hardloop dan `terraform import` en gee die hulpbron-ID deur. terraform kontak die verskaffer, ontvang die data en maak 'n tfstate-lêer.
Daar is 3 probleme hier:
1. Ons kry net 'n tfstate-lêer, en die tf is leeg, jy moet dit handmatig skryf of dit van tfstate omskakel
2. Kan slegs met een hulpbron op 'n slag werk en ondersteun nie alle hulpbronne nie. En wat moet ek weer doen met 250+ emmers?
3. Jy moet die ID van die hulpbronne ken - dit wil sê, jy moet dit toevou in kode wat die lys van hulpbronne kry
Oor die algemeen is die resultaat gedeeltelik en skaal nie goed nie
My besluit
vereistes:
1. Vermoë om tf- en tfstate-lêers vir hulpbronne te skep. Laai byvoorbeeld al die emmers/sekuriteitsgroep/load balancer af en daardie `terraform plan` het teruggegee dat daar geen veranderinge is nie
2. Jy benodig 2 GCP + AWS-wolke
3. Globale oplossing wat maklik is om elke keer op te dateer en nie tyd mors op elke hulpbron vir 3 dae se werk nie
4. Maak dit oopbron - almal het dieselfde probleem
Die Go-taal is hoekom ek daarvan hou, en dit het 'n biblioteek om HCL-lêers te skep wat in terraform gebruik word + baie kode in terraform wat nuttig kan wees
Pad
Eerste poging
Ek het begin met 'n eenvoudige weergawe. Kontak die wolk via die SDK vir die vereiste hulpbron en omskep dit in velde vir terraform. Die poging het dadelik op die sekuriteitsgroep gesterf omdat ek nie van die 1.5 dae gehou het om net die sekuriteitsgroep te omskep nie (en daar is baie hulpbronne). Vir 'n lang tyd en dan kan velde verander/bygevoeg word
Tweede poging
Gebaseer op die idee wat beskryf word
Kom ons doen nou die rekursiewe pornografie om 'n omskakelaar vir tfstate na tf te skryf. Vir diegene wat nog nooit tfstate gelees het nie, dit is JSON, maar spesiaal.
Hier is sy belangrike deel eienskappe
"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",
Daar is:
1. id - string
2. metadata - 'n skikking van grootte 1 en daarin 'n voorwerp met velde wat hieronder beskryf word
3. spec - hash van grootte 1 en sleutel, waarde daarin
Kortom, 'n prettige formaat, alles kan verskeie vlakke diep wees
"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",
Oor die algemeen, as iemand 'n programmeringsprobleem vir 'n onderhoud wil hê, vra hulle net om 'n ontleder vir hierdie taak te skryf :)
Na baie pogings om 'n ontleder sonder foute te skryf, het ek 'n deel daarvan in die terraform-kode gevind, en die belangrikste deel. En dit het gelyk of alles goed werk
Poging drie
terraform-verskaffers is binaries wat kode bevat met al die hulpbronne en logika om met die wolk API te werk. Elke wolk het sy eie verskaffer en terraform self roep hulle slegs deur sy RPC-protokol tussen twee prosesse.
Nou het ek besluit om terraform-verskaffers direk via RPC-oproepe te kontak. Dit het pragtig uitgedraai en dit moontlik gemaak om terraform-verskaffers na nuwers te verander en nuwe kenmerke te kry sonder om die kode te verander. Dit blyk ook dat nie alle velde in tfstate in tf moet wees nie, maar hoe kan jy uitvind? Vra net jou verskaffer hieroor. Toe begin nog 'n rekursiewe pornografie van die samestelling van gereelde uitdrukkings, soek na velde binne die staat op alle vlakke in diepte.
Op die ou end het ons 'n nuttige CLI-instrument gekry wat 'n gemeenskaplike infrastruktuur vir alle terraform-verskaffers het en jy kan maklik 'n nuwe een byvoeg. Die byvoeging van hulpbronne verg ook min kode. Plus allerhande lekkernye soos verbindings tussen hulpbronne. Natuurlik was daar baie verskillende probleme wat nie almal beskryf kan word nie.
Ek het die dier Terrafomer genoem.
finale
Deur Terrafomer te gebruik, het ons 500-700 duisend reëls tf + tfstate-kode vanaf twee wolke gegenereer. Ons was in staat om nalatenskap goed te neem en dit net deur terraform te begin raak, soos in die beste infrastruktuur as kode-idees. Dit is net towerkrag as jy 'n groot wolk neem en dit deur 'n span in die vorm van terraform-werkerlêers ontvang. En dan grep/replace/git en so aan.
Ek het dit uitgekam en in orde gesit, toestemming gekry. Vrygestel op GitHub vir almal op Donderdag (02.05.19/XNUMX/XNUMX).
Reeds 600 sterre ontvang, 2 trekversoeke vir die byvoeging van ondersteuning vir openstack en kubernetes. Goeie terugvoer. Oor die algemeen is die projek nuttig vir mense
Ek raai almal aan wat met Terraform wil begin werk en nie alles hiervoor oorskryf nie.
Ek sal bly wees om versoeke, kwessies, sterre te trek.
Демо
Bron: will.com