Terraformer - Isadeiledd i God

Terraformer - Isadeiledd i God
Hoffwn ddweud wrthych am yr offeryn CLI newydd a ysgrifennais i ddatrys hen broblem.

problem

Mae Terraform wedi bod yn safon ers tro yng nghymuned Devops/Cloud/TG. Mae'r peth yn gyfleus iawn ac yn ddefnyddiol ar gyfer delio â seilwaith fel cod. Mae yna lawer o ddanteithion yn Terraform yn ogystal â llawer o ffyrc, cyllyll miniog a chribiniau.
Gyda Terraform mae'n gyfleus iawn creu pethau newydd ac yna eu rheoli, eu newid neu eu dileu. Beth ddylai'r rhai sydd â seilwaith enfawr yn y cwmwl ac sydd heb ei greu trwy Terraform ei wneud? Mae ailysgrifennu ac ail-greu'r cwmwl cyfan rhywsut yn ddrud ac yn anniogel.
Deuthum ar draws y broblem hon mewn 2 swydd, yr enghraifft symlaf yw pan fyddwch am i bopeth fod yn Git ar ffurf ffeiliau terraform, ond mae gennych 250+ o fwcedi ac mae'n llawer i'w hysgrifennu mewn terraform â llaw.
Mae mater ers 2014 yn terrafom a gafodd ei gau yn 2016 gyda'r gobaith y bydd mewnforio.

Yn gyffredinol, mae popeth fel yn y llun yn unig o'r dde i'r chwith

Rhybuddion: Nid yw'r awdur yn byw yn Rwsia am hanner ei oes ac nid yw'n ysgrifennu llawer yn Rwsieg. Byddwch yn wyliadwrus o wallau sillafu.

Datrysiadau

1. Mae yna atebion parod a hen ar gyfer AWS terraforming. Pan geisiais gael fy 250+ o fwcedi drwyddo, sylweddolais fod popeth yn ddrwg yno. Mae AWS wedi bod yn cyflwyno llawer o opsiynau newydd ers tro, ond nid yw terraforming yn gwybod amdanynt ac yn gyffredinol mae'n rhuddem mae'r templed yn edrych yn denau. Ar ôl 2 yn yr hwyr anfonais Tynnu cais ychwanegu mwy o nodweddion yno a sylweddoli nad yw datrysiad o'r fath yn addas o gwbl.
Sut mae terraforming yn gweithio: mae'n cymryd data o'r AWS SDK ac yn cynhyrchu tf a tfstate trwy dempled.
Mae 3 problem yma:
1. Bydd oedi bob amser mewn diweddariadau
2. tf ffeiliau weithiau yn dod allan wedi torri
3. cesglir tfstate ar wahân i tf ac nid yw bob amser yn cydgyfeirio
Yn gyffredinol, mae'n anodd cael canlyniad lle mae `cynllun teras` yn dweud nad oes unrhyw newidiadau

2. Mae `mewnforio teras` yn orchymyn adeiledig mewn terraform. Sut mae'n gweithio?
Rydych chi'n ysgrifennu ffeil TF wag gyda'r enw a'r math o adnodd, yna rhedeg `terraform import` a phasio'r ID adnodd. Mae terraform yn cysylltu â'r darparwr, yn derbyn y data ac yn gwneud ffeil tfstate.
Mae 3 problem yma:
1. Dim ond ffeil tfstate a gawn, ac mae'r tf yn wag, mae angen i chi ei ysgrifennu â llaw neu ei drosi o tfstate
2. Dim ond yn gallu gweithio gydag un adnodd ar y tro ac nid yw'n cefnogi'r holl adnoddau. A beth ddylwn i ei wneud eto gyda 250+ o fwcedi?
3. Mae angen i chi wybod ID yr adnoddau - hynny yw, mae angen i chi ei lapio mewn cod sy'n cael y rhestr o adnoddau
Yn gyffredinol, mae'r canlyniad yn rhannol ac nid yw'n graddio'n dda

Fy mhenderfyniad

Gofynion:
1. Y gallu i greu ffeiliau tf a tfstate ar gyfer adnoddau. Er enghraifft, lawrlwythwch yr holl fwcedi / grŵp diogelwch / cydbwysydd llwyth a dychwelodd y `cynllun teras` hwnnw nad oes unrhyw newidiadau
2. Mae angen 2 gymylau GCP + AWS
3. Datrysiad byd-eang sy'n hawdd ei ddiweddaru bob tro ac nad yw'n gwastraffu amser ar bob adnodd am 3 diwrnod o waith
4. Ei gwneud yn Ffynhonnell Agored - mae gan bawb yr un broblem

Yr iaith Go yw pam rydw i wrth fy modd, ac mae ganddi lyfrgell ar gyfer creu ffeiliau HCL sy'n cael eu defnyddio yn terraform + llawer o god ar terraform a all fod yn ddefnyddiol

Llwybr

Ymgais gyntaf
Dechreuais gyda fersiwn syml. Cysylltu â'r cwmwl trwy'r SDK am yr adnodd gofynnol a'i drosi'n feysydd ar gyfer terraform. Bu farw'r ymgais ar unwaith ar y grŵp diogelwch oherwydd nid oeddwn yn hoffi'r 1.5 diwrnod i drosi'r grŵp diogelwch yn unig (ac mae yna lawer o adnoddau). Am amser hir ac yna gellir newid / ychwanegu meysydd

Ail ymgais
Yn seiliedig ar y syniad a ddisgrifiwyd yma. Cymerwch a throsi tfstate i tf. Mae'r holl ddata yno ac mae'r meysydd yr un peth. Sut i gael tfstate llawn ar gyfer llawer o adnoddau ?? Dyma lle daeth y gorchymyn `adnewyddu terraform` i'r adwy. Mae terraform yn cymryd yr holl adnoddau mewn tfstate a, thrwy ID, yn tynnu data arnynt ac yn ysgrifennu popeth i tfstate. Hynny yw, creu tfstate wag gyda dim ond enwau ac IDs, rhedeg `terraform refresh` ac yna rydym yn cael tfstates llawn. Hwre!
Nawr, gadewch i ni wneud y pornograffi ailadroddus o ysgrifennu trawsnewidydd ar gyfer tfstate i tf. I'r rhai nad ydynt erioed wedi darllen tfstate, y mae yn JSON, ond yn neillduol.
Dyma ei briodoleddau rhan bwysig

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

Mae yna:
1. id - llinyn
2. metadata - amrywiaeth o faint 1 ac ynddo gwrthrych gyda meysydd a ddisgrifir isod
3. spec - hash o faint 1 ac allweddol, gwerth ynddo
Yn fyr, fformat hwyliog, gall popeth fod ar sawl lefel o ddyfnder

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

Yn gyffredinol, os oes unrhyw un eisiau problem rhaglennu ar gyfer cyfweliad, gofynnwch iddyn nhw ysgrifennu parser ar gyfer y dasg hon :)
Ar ôl llawer o ymdrechion i ysgrifennu parser heb fygiau, darganfyddais ran ohono yn y cod terraform, a'r rhan bwysicaf. Ac roedd popeth i'w weld yn gweithio'n iawn

Ceisio tri
darparwyr terraform yn deuaidd sy'n cynnwys cod gyda'r holl adnoddau a rhesymeg ar gyfer gweithio gyda'r API cwmwl. Mae gan bob cwmwl ei ddarparwr ei hun ac mae terraform ei hun ond yn eu galw trwy ei brotocol RPC rhwng dwy broses.
Nawr penderfynais gysylltu â darparwyr terraform yn uniongyrchol trwy alwadau RPC. Daeth yn hyfryd a gwnaeth hi'n bosibl newid darparwyr terraform i rai mwy newydd a chael nodweddion newydd heb newid y cod. Mae'n ymddangos hefyd na ddylai pob maes yn tfstate fod mewn tf, ond sut allwch chi ddarganfod? Gofynnwch i'ch darparwr am hyn. Yna dechreuodd pornograffi ailadroddus arall o gydosod ymadroddion rheolaidd, gan chwilio am feysydd y tu mewn i tfstate ar bob lefel yn fanwl.

Yn y diwedd, cawsom offeryn CLI defnyddiol sydd â seilwaith cyffredin ar gyfer pob darparwr terraform a gallwch chi ychwanegu un newydd yn hawdd. Hefyd, ychydig o god sydd ei angen i ychwanegu adnoddau. Yn ogystal â phob math o bethau da fel cysylltiadau rhwng adnoddau. Wrth gwrs, roedd llawer o wahanol broblemau na ellir eu disgrifio i gyd.
Enwais yr anifail Terrafomer.

Terfynol

Gan ddefnyddio Terrafomer, fe wnaethom gynhyrchu 500-700 mil o linellau o god tf + tfstate o ddau gwmwl. Roeddem yn gallu cymryd pethau etifeddiaeth a dechrau eu cyffwrdd yn unig drwy terraform, fel yn y seilwaith gorau fel syniadau cod. Mae'n hud yn unig pan fyddwch chi'n cymryd cwmwl enfawr ac yn ei dderbyn trwy dîm ar ffurf ffeiliau gweithwyr terraform. Ac yna grep/disodli/git ac ati.

Fe wnes i ei gribo allan a'i roi mewn trefn, cael caniatâd. Rhyddhawyd ar GitHub i bawb ddydd Iau (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Eisoes wedi derbyn 600 o sêr, 2 gais tynnu am ychwanegu cefnogaeth ar gyfer Openstack a kubernetes. Adborth da. Yn gyffredinol, mae'r prosiect yn ddefnyddiol i bobl
Rwy'n cynghori pawb sydd am ddechrau gweithio gyda Terraform a pheidio ag ailysgrifennu popeth ar gyfer hyn.
Byddaf yn falch o dynnu ceisiadau, materion, sêr.

Демо
Terraformer - Isadeiledd i God

Ffynhonnell: hab.com

Ychwanegu sylw