Terraformer - Infrastruttura Biex Kodiċi

Terraformer - Infrastruttura Biex Kodiċi
Nixtieq ngħidlek dwar l-għodda CLI ġdida li ktibt biex issolvi problema qadima.

problema

Terraform ilu standard fil-komunità Devops/Cloud/IT. Il-ħaġa hija konvenjenti ħafna u utli biex tittratta l-infrastruttura bħala kodiċi. Hemm ħafna delights f'Terraform kif ukoll ħafna frieket, skieken li jaqtgħu u rakes.
B'Terraform huwa konvenjenti ħafna li toħloq affarijiet ġodda u mbagħad timmaniġġjahom, tbiddel jew tħassarhom. X'għandhom jagħmlu dawk li għandhom infrastruttura enormi fil-cloud u mhux maħluqa permezz ta' Terraform? Il-kitba mill-ġdid u l-ħolqien mill-ġdid tas-sħaba kollha hija b'xi mod għalja u mhux sigura.
I ltqajt ma 'din il-problema f'2 impjiegi, l-aktar eżempju sempliċi huwa meta trid li kollox ikun f'Git fil-forma ta' fajls terraform, imma għandek 250 + bramel u huwa ħafna li tiktebhom f'terraform bl-idejn.
Hemm kwistjoni mill-2014 f’terrafom li ngħalqet fl-2016 bit-tama li jkun hemm importazzjoni.

B'mod ġenerali, kollox huwa bħal fl-istampa biss mil-lemin għax-xellug

Twissijiet: L-awtur ma jgħix fir-Russja għal nofs ħajtu u jikteb ftit bir-Russu. Oqgħod attent mill-iżbalji tal-ortografija.

Soluzzjonijiet

1. Hemm soluzzjoni lesta u antika għall-AWS terraforming. Meta ppruvajt indaħħal il-250+ bramel tiegħi minn ġo fiha, indunajt li hemm kollox kien ħażin. AWS ilu jintroduċi ħafna għażliet ġodda, iżda t-terraforming ma jafx dwarhom u b'mod ġenerali huwa ruby il-mudell jidher skars. Wara s-2 ta’ filgħaxija bgħatt Iġbed talba biex iżżid aktar karatteristiċi hemmhekk u induna li soluzzjoni bħal din mhix adattata xejn.
Kif jaħdem it-terraforming: jieħu data mill-AWS SDK u jiġġenera tf u tfstate permezz ta' mudell.
Hemm 3 problemi hawn:
1. Dejjem se jkun hemm dewmien fl-aġġornamenti
2. fajls tf kultant joħorġu miksur
3. tfstate jinġabar separatament minn tf u mhux dejjem jikkonverġu
B'mod ġenerali, huwa diffiċli li tikseb riżultat li fih `terraform plan` jgħid li m'hemm l-ebda tibdil

2. "importazzjoni terraform" hija kmand integrat f'terraform. Kif taħdem?
Tikteb fajl TF vojt bl-isem u t-tip tar-riżorsa, imbagħad mexxi `terraform import` u tgħaddi l-ID tar-riżorsa. terraform jikkuntattja lill-fornitur, jirċievi d-dejta u jagħmel fajl tfstate.
Hemm 3 problemi hawn:
1. Aħna nġibu biss fajl tfstate, u t-tf huwa vojt, trid tiktebha manwalment jew taqlebha minn tfstate
2. Jista 'jaħdem biss b'riżors wieħed kull darba u ma jappoġġjax ir-riżorsi kollha. U x'għandi nagħmel mill-ġdid b'250+ bramel?
3. Trid tkun taf l-ID tar-riżorsi - jiġifieri, trid tagħlaqha f'kodiċi li tikseb il-lista tar-riżorsi
B'mod ġenerali, ir-riżultat huwa parzjali u ma jiskalax tajjeb

Id-deċiżjoni tiegħi

Rekwiżiti:
1. Kapaċità li toħloq fajls tf u tfstate għar-riżorsi. Per eżempju, niżżel il-bramel/grupp tas-sigurtà/balancer tat-tagħbija kollha u dak il-'pjan terraform' rritorna li m'hemm l-ebda tibdil
2. Għandek bżonn 2 sħab GCP + AWS
3. Soluzzjoni globali li hija faċli biex taġġorna kull darba u ma taħlix ħin fuq kull riżors għal 3 ijiem ta 'xogħol
4. Agħmilha Open Source - kulħadd għandu l-istess problema

Il-lingwa Go hija għaliex inħobbha, u għandha librerija għall-ħolqien ta 'fajls HCL li jintużaw f'terraform + ħafna kodiċi f'terraform li jistgħu jkunu utli

Passaġġ

L-ewwel tentattiv
Bdejt b'verżjoni sempliċi. Tikkuntattja s-sħab permezz tal-SDK għar-riżors meħtieġ u tikkonvertih f'oqsma għal terraform. L-attentat miet immedjatament fuq il-grupp tas-sigurtà għax ma għoġobnix il-ġranet 1.5 biex tikkonverti biss il-grupp tas-sigurtà (u hemm ħafna riżorsi). Għal żmien twil u mbagħad l-oqsma jistgħu jinbidlu/jiżdiedu

It-tieni tentattiv
Ibbażat fuq l-idea deskritta hawn. Ħu u jikkonvertu tfstate għal tf. Id-dejta kollha hemm u l-oqsma huma l-istess. Kif tikseb tfstate sħiħ għal ħafna riżorsi?? Dan huwa fejn il-kmand "terraform refresh" wasal għall-salvataġġ. terraform jieħu r-riżorsi kollha f'tfstate u, bl-ID, jiġbed id-dejta fuqhom u jikteb kollox f'tfstate. Jiġifieri, oħloq tfstate vojt bl-ismijiet u l-IDs biss, mexxi `terraform refresh` u mbagħad niksbu tfstates sħaħ. Ħura!
Issa ejja nagħmlu l-pornografija rikorsiva tal-kitba ta 'konvertitur għal tfstate għal tf. Għal dawk li qatt ma qraw tfstate, huwa JSON, iżda speċjali.
Hawnhekk huwa l-attributi parti importanti tagħha

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

Hemm:
1. id - spag
2. metadata - firxa ta' daqs 1 u fiha oġġett b'oqsma li huwa deskritt hawn taħt
3. spec - hash ta 'daqs 1 u ċavetta, valur fiha
Fil-qosor, format divertenti, kollox jista 'jkun diversi livelli fil-fond

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

B'mod ġenerali, jekk xi ħadd irid problema ta' programmazzjoni għal intervista, staqsihom biex jiktbu parser għal dan il-kompitu :)
Wara ħafna tentattivi biex tikteb parser mingħajr bugs, sibt parti minnu fil-kodiċi terraform, u l-aktar parti importanti. U kollox deher li jaħdem tajjeb

Tentattiv tlieta
fornituri terraform huma binarji li fihom kodiċi bir-riżorsi kollha u l-loġika għall-ħidma mal-cloud API. Kull sħaba għandha l-fornitur tagħha stess u terraform innifsu jsejħilhom biss permezz tal-protokoll RPC tiegħu bejn żewġ proċessi.
Issa ddeċidejt li nikkuntattja lill-fornituri ta 'terraform direttament permezz ta' sejħiet RPC. Irriżulta mill-isbaħ u għamilha possibbli li tbiddel il-fornituri tat-terraform għal oħrajn ġodda u tikseb karatteristiċi ġodda mingħajr ma jinbidel il-kodiċi. Jirriżulta wkoll li mhux l-oqsma kollha f'tfstate għandhom ikunu f'tf, imma kif tista 'ssir taf? Staqsi lill-fornitur tiegħek dwar dan. Imbagħad bdiet pornografija rikorsiva oħra ta 'assemblaġġ ta' espressjonijiet regolari, tiftix għal oqsma ġewwa tfstate fil-livelli kollha fil-fond.

Fl-aħħar, sirna għodda CLI utli li għandha infrastruttura komuni għall-fornituri kollha ta 'terraform u tista' faċilment iżżid waħda ġdida. Ukoll, iż-żieda tar-riżorsi tieħu ftit kodiċi. Flimkien ma 'kull xorta ta' goodies bħal konnessjonijiet bejn ir-riżorsi. Naturalment, kien hemm ħafna problemi differenti li ma jistgħux jiġu deskritti kollha.
Semmejt l-annimal Terrafomer.

Finali

Bl-użu Terrafomer, aħna ġġeneraw 500-700 elf linja ta 'kodiċi tf + tfstate minn żewġ sħab. Konna kapaċi nieħdu affarijiet legati u nibdew inmissuhom biss permezz ta 'terraform, bħal fl-aqwa infrastruttura bħala ideat ta' kodiċi. Hija biss maġija meta tieħu sħaba enormi u tirċeviha permezz ta 'tim fil-forma ta' fajls tal-ħaddiema terraform. U mbagħad grep/replace/git u l-bqija.

I mimxut out u poġġiha fl-ordni, sibt permess. Maħruġ fuq GitHub għal kulħadd nhar il-Ħamis (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Diġà rċeviet 600 stilla, 2 talbiet ta 'ġibda għaż-żieda ta' appoġġ għal openstack u kubernetes. Feedback tajjeb. B'mod ġenerali, il-proġett huwa utli għan-nies
Nagħti parir lil kull min irid jibda jaħdem ma’ Terraform u ma jiktebx kollox għal dan.
Inkun ferħan li niġbed talbiet, kwistjonijiet, stilel.

Demo
Terraformer - Infrastruttura Biex Kodiċi

Sors: www.habr.com

Żid kumment