Terraformer - Infrastruktuur om te kodeer

Terraformer - Infrastruktuur om te kodeer
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 uitgawe sedert 2014 in terrafom wat in 2016 gesluit is met die hoop dat daar invoer sal wees.

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 terraforming. Toe ek my 250+ emmers daardeur probeer kry, het ek besef alles is sleg daar. AWS stel al lank baie nuwe opsies bekend, maar terraforming weet nie van hulle nie en oor die algemeen is dit robyn die sjabloon lyk yl. Na 2 die aand het ek gestuur Trek versoek om meer funksies daar by te voeg en besef dat so 'n oplossing glad nie geskik is nie.
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 hier. Neem net en skakel tfstate om na tf. Al die data is daar en die velde is dieselfde. Hoe om volle tfstate vir baie hulpbronne te kry?? Dit is waar die `terraform refresh`-opdrag tot die redding gekom het. terraform neem alle hulpbronne in tfstate en, deur ID, haal data daaroor uit en skryf alles na tfstate. Dit wil sê, skep 'n leë tfstate met slegs name en ID's, hardloop `terraform refresh` en dan kry ons volle tfstate. Hoera!
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). github.com/GoogleCloudPlatform/terraformer
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.

Демо
Terraformer - Infrastruktuur om te kodeer

Bron: will.com

Voeg 'n opmerking