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
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
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
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).
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
Sors: www.habr.com