Terraformer - Imprastraktura Ngadto sa Code

Terraformer - Imprastraktura Ngadto sa Code
Gusto nako isulti kanimo ang bahin sa bag-ong tool sa CLI nga akong gisulat aron masulbad ang usa ka karaan nga problema.

problema

Ang Terraform dugay nang nahimong sumbanan sa komunidad sa Devops/Cloud/IT. Ang butang sayon ​​​​kaayo ug mapuslanon alang sa pag-atubang sa imprastraktura isip code. Adunay daghang mga kalipayan sa Terraform ingon man daghang mga tinidor, mahait nga kutsilyo ug rake.
Uban sa Terraform sayon ​​​​kaayo ang paghimo og bag-ong mga butang ug dayon pagdumala, pagbag-o o pagtangtang niini. Unsa ang kinahanglan buhaton sa mga adunay daghang imprastraktura sa panganod ug wala gibuhat pinaagi sa Terraform? Ang pagsulat pag-usab ug paghimo pag-usab sa tibuok panganod kay mahal ug dili luwas.
Nasinati nako kini nga problema sa 2 nga mga trabaho, ang pinakasimple nga pananglitan kung gusto nimo nga ang tanan naa sa Git sa porma sa mga file sa terraform, apan adunay ka 250+ nga mga balde ug daghan ang isulat kini sa terraform pinaagi sa kamot.
Adunay isyu sukad 2014 sa terrafom nga gisirhan sa 2016 uban sa paglaum nga adunay import.

Sa kinatibuk-an, ang tanan sama sa litrato gikan sa tuo hangtod sa wala

Mga Pasidaan: Ang tagsulat wala magpuyo sa Russia sa katunga sa iyang kinabuhi ug nagsulat gamay sa Russian. Pagbantay sa mga sayop sa spelling.

Mga solusyon

1. Adunay andam ug daan nga mga solusyon alang sa AWS terraforming. Sa dihang gisulayan nako nga makuha ang akong 250+ nga mga balde, akong naamgohan nga ang tanan dili maayo didto. Dugay na nga gipaila sa AWS ang daghang mga bag-ong kapilian, apan ang terraforming wala mahibal-an bahin kanila ug sa kinatibuk-an kini ruby morag gamay ang template. After 2 sa gabii nagpadala ko Paghangyo sa pagbitad aron makadugang dugang nga mga bahin didto ug nakaamgo nga ang ingon nga solusyon dili gyud angay.
Giunsa paglihok ang terraforming: nagkinahanglan kini og data gikan sa AWS SDK ug makamugna og tf ug tfstate pinaagi sa usa ka template.
Adunay 3 ka problema dinhi:
1. Kanunay adunay usa ka lag sa mga update
2. tf files usahay mugawas nga guba
3. Ang tfstate gikolekta nga bulag gikan sa tf ug dili kanunay maghiusa
Sa kinatibuk-an, lisud ang pagkuha sa resulta diin ang 'terraform plan' nag-ingon nga walay mga pagbag-o

2. Ang 'terraform import' kay usa ka built-in nga command sa terraform. Giunsa kini pagtrabaho?
Magsulat ka og walay sulod nga TF file nga adunay ngalan ug matang sa kahinguhaan, dayon padagana ang `terraform import` ug ipasa ang resource ID. Gikontak sa terraform ang provider, nakadawat sa datos ug naghimo og tfstate file.
Adunay 3 ka problema dinhi:
1. Nakuha ra namo ang tfstate file, ug ang tf walay sulod, kinahanglan nimo nga isulat kini nga mano-mano o i-convert kini gikan sa tfstate
2. Makatrabaho lang sa usa ka kapanguhaan matag higayon ug dili mosuporta sa tanang kapanguhaan. Ug unsa ang akong buhaton pag-usab sa 250+ nga balde?
3. Kinahanglan nimong mahibal-an ang ID sa mga kahinguhaan - kana mao, kinahanglan nimo nga iputos kini sa code nga makakuha sa lista sa mga kapanguhaan
Sa kinatibuk-an, ang resulta partial ug dili maayo ang sukod

Akong desisyon

Mga kinahanglanon:
1. Abilidad sa paghimo sa tf ug tfstate files alang sa mga kapanguhaan. Pananglitan, i-download ang tanan nga mga balde/seguridad nga grupo/load balancer ug ang `terraform plan` mibalik nga walay mga kausaban
2. Kinahanglan nimo ang 2 GCP + AWS clouds
3. Global nga solusyon nga sayon ​​nga i-update sa matag higayon ug dili mag-usik sa panahon sa matag kapanguhaan alang sa 3 ka adlaw nga trabaho
4. Himoa kini nga Open Source - ang tanan adunay parehas nga problema

Ang Go nga pinulongan mao nga ganahan ko niini, ug kini adunay librarya alang sa paghimo sa HCL files nga gigamit sa terraform + daghang code sa terraform nga mahimong mapuslanon

dalan

Unang pagsulay
Nagsugod ko sa usa ka yano nga bersyon. Pagkontak sa panganod pinaagi sa SDK alang sa gikinahanglan nga kapanguhaan ug pag-convert niini ngadto sa mga field para sa terraform. Ang pagsulay namatay diha-diha dayon sa grupo sa seguridad tungod kay dili ko ganahan sa 1.5 nga mga adlaw sa pag-convert lamang sa grupo sa seguridad (ug adunay daghang mga kapanguhaan). Sulod sa dugay nga panahon ug unya ang mga natad mahimong usbon / idugang

Ikaduha nga pagsulay
Base sa ideya nga gihulagway dinhi. Kuhaa lang ug i-convert ang tfstate sa tf. Anaa ang tanan nga datos ug parehas ang mga uma. Giunsa pagkuha ang bug-os nga tfstate alang sa daghang mga kapanguhaan?? Dinhi giluwas ang mando sa 'terraform refresh'. Gikuha sa terraform ang tanan nga mga kapanguhaan sa tfstate ug, pinaagi sa ID, gikuha ang datos sa kanila ug gisulat ang tanan sa tfstate. Kana mao, paghimo og usa ka walay sulod nga tfstate nga adunay mga ngalan ug ID lamang, pagdagan ang `terraform refresh` ug dayon makuha namon ang bug-os nga tfstates. Hooray!
Karon atong buhaton ang recursive pornography sa pagsulat og converter para sa tfstate ngadto sa tf. Alang niadtong wala pa makabasa sa tfstate, JSON kini, apan espesyal.
Ania ang importante nga bahin nga mga hiyas

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

Adunay:
1. id - pisi
2. metadata - usa ka han-ay sa gidak-on 1 ug niini usa ka butang nga adunay mga uma nga gihulagway sa ubos
3. spec - hash sa gidak-on 1 ug yawe, bili niini
Sa laktud, usa ka makalingaw nga pormat, ang tanan mahimong daghang lebel nga lawom

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

Sa kinatibuk-an, kung adunay gusto nga usa ka problema sa programming alang sa usa ka interbyu, hangyoa lang sila nga magsulat usa ka parser alang niini nga buluhaton :)
Pagkahuman sa daghang pagsulay sa pagsulat sa usa ka parser nga wala’y mga bug, nakit-an nako ang bahin niini sa terraform code, ug ang labing hinungdanon nga bahin. Ug ang tanan ingon og maayo

Pagsulay sa tulo
Ang mga terraform providers mga binary nga adunay code nga adunay tanan nga mga kapanguhaan ug lohika alang sa pagtrabaho sa cloud API. Ang matag panganod adunay kaugalingong provider ug ang terraform mismo nagtawag lamang kanila pinaagi sa RPC protocol niini tali sa duha ka proseso.
Karon nakahukom ko nga kontakon ang mga terraform providers direkta pinaagi sa mga tawag sa RPC. Nindot kini nga nahimo ug nahimo nga posible nga mabag-o ang mga tighatag sa terraform sa mga bag-o ug makakuha mga bag-ong bahin nga wala usba ang code. Nahibal-an usab nga dili tanan nga mga natad sa tfstate kinahanglan naa sa tf, apan giunsa nimo mahibal-an? Pangutan-a lang ang imong provider bahin niini. Unya ang lain nga recursive nga pornograpiya sa pag-assemble sa mga regular nga ekspresyon nagsugod, pagpangita sa mga natad sa sulod sa tfstate sa tanan nga lebel sa giladmon.

Sa katapusan, nakakuha kami usa ka mapuslanon nga tool sa CLI nga adunay usa ka sagad nga imprastraktura para sa tanan nga mga provider sa terraform ug dali ka makadugang usa ka bag-o. Usab, ang pagdugang sa mga kapanguhaan nagkinahanglan og gamay nga code. Dugang pa sa tanan nga mga matang sa mga butang sama sa mga koneksyon tali sa mga kahinguhaan. Siyempre, adunay daghang lainlaing mga problema nga dili mahulagway sa tanan.
Ginganlan nako ang hayop nga Terrafomer.

Kataposan

Gamit ang Terrafomer, nakamugna kami og 500-700 ka libo nga linya sa tf + tfstate code gikan sa duha ka panganod. Nakuha namon ang mga butang nga kabilin ug nagsugod sa paghikap niini pinaagi lamang sa terraform, sama sa labing kaayo nga imprastraktura ingon mga ideya sa code. Salamangka lang kung magkuha ka usa ka dako nga panganod ug madawat kini pinaagi sa usa ka team sa porma sa mga file sa trabahador sa terraform. Ug dayon grep/replace/git ug uban pa.

Gisuklay ko kini ug gipahimutang kini sa pagkahan-ay, nakakuha og pagtugot. Gipagawas sa GitHub alang sa tanan kaniadtong Huwebes (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Nakadawat na og 600 ka bituon, 2 ka hangyo sa pagbitad alang sa pagdugang og suporta para sa openstack ug kubernetes. Maayong feedback. Sa kinatibuk-an, ang proyekto mapuslanon alang sa mga tawo
Gitambagan nako ang tanan nga gusto magsugod sa pagtrabaho sa Terraform ug dili isulat pag-usab ang tanan alang niini.
Malipay ako sa pagbitad sa mga hangyo, isyu, mga bituon.

Demo
Terraformer - Imprastraktura Ngadto sa Code

Source: www.habr.com

Idugang sa usa ka comment