Terraformer - Miundombinu kwa Kanuni

Terraformer - Miundombinu kwa Kanuni
Ningependa kukuambia juu ya zana mpya ya CLI ambayo niliandika kutatua shida ya zamani.

tatizo

Terraform kwa muda mrefu imekuwa kiwango katika jumuiya ya Devops/Cloud/IT. Jambo hilo ni rahisi sana na muhimu kwa kushughulika na miundombinu kama nambari. Kuna furaha nyingi katika Terraform pamoja na uma nyingi, visu vikali na reki.
Kwa Terraform ni rahisi sana kuunda vitu vipya na kisha kudhibiti, kubadilisha au kufuta. Je, wale ambao wana miundombinu kubwa katika wingu na haijaundwa kupitia Terraform wanapaswa kufanya nini? Kuandika upya na kuunda upya wingu zima kwa namna fulani ni ghali na si salama.
Nilikutana na shida hii katika kazi 2, mfano rahisi zaidi ni wakati unataka kila kitu kiwe kwenye Git kwa namna ya faili za terraform, lakini una ndoo 250+ na ni mengi kuandika kwa terraform kwa mkono.
Kuna suala tangu 2014 katika terrafom ambayo ilifungwa mwaka 2016 kwa matumaini kwamba kutakuwa na kuagiza.

Kwa ujumla, kila kitu ni kama kwenye picha tu kutoka kulia kwenda kushoto

Maonyo: Mwandishi haishi Urusi kwa nusu ya maisha yake na anaandika kidogo kwa Kirusi. Jihadharini na makosa ya tahajia.

Suluhisho

1. Kuna suluhisho zilizotengenezwa tayari na za zamani za AWS terraforming. Nilipojaribu kupata ndoo zangu 250+ kupitia hiyo, niligundua kuwa kila kitu kilikuwa kibaya hapo. AWS kwa muda mrefu imekuwa ikianzisha chaguzi nyingi mpya, lakini terraforming haijui juu yao na kwa ujumla ni ruby. template inaonekana chache. Baada ya saa 2 jioni nilituma Vuta ombi kuongeza vipengele zaidi hapo na kugundua kuwa suluhisho kama hilo halifai hata kidogo.
Jinsi terraforming inavyofanya kazi: inachukua data kutoka kwa AWS SDK na kuzalisha tf na tfstate kupitia kiolezo.
Kuna shida 3 hapa:
1. Kutakuwa na lag katika sasisho
2. faili za tf wakati mwingine hutoka zimevunjwa
3. tfstate inakusanywa kando na tf na haiungani kila wakati
Kwa ujumla, ni vigumu kupata matokeo ambayo `mpango wa terraform` unasema kuwa hakuna mabadiliko

2. `Uagizaji wa terraform` ni amri iliyojengewa ndani ya mtaro. Inafanyaje kazi?
Unaandika faili tupu ya TF yenye jina na aina ya rasilimali, kisha endesha `terraform import` na kupitisha kitambulisho cha rasilimali. terraform huwasiliana na mtoa huduma, hupokea data na kutengeneza faili ya tfstate.
Kuna shida 3 hapa:
1. Tunapata faili ya tfstate pekee, na tf haina kitu, unahitaji kuiandika kwa mikono au kuibadilisha kutoka kwa tfstate.
2. Inaweza tu kufanya kazi na rasilimali moja kwa wakati mmoja na haitumii rasilimali zote. Na nifanye nini tena na ndoo 250+?
3. Unahitaji kujua kitambulisho cha rasilimali - yaani, unahitaji kuifunga kwa msimbo unaopata orodha ya rasilimali.
Kwa ujumla, matokeo ni sehemu na haina kiwango vizuri

Uamuzi wangu

Mahitaji:
1. Uwezo wa kuunda faili za tf na tfstate kwa rasilimali. Kwa mfano, pakua ndoo zote/kikundi cha usalama/kisawazisha mzigo na `mpango wa terraform` ulirejesha kuwa hakuna mabadiliko.
2. Unahitaji mawingu 2 ya GCP + AWS
3. Suluhisho la kimataifa ambalo ni rahisi kusasishwa kila wakati na haipotezi muda kwenye kila rasilimali kwa siku 3 za kazi.
4. Ifanye iwe Open Source - kila mtu ana shida sawa

Lugha ya Go ndio sababu ninaipenda, na ina maktaba ya kuunda faili za HCL ambazo hutumiwa katika terraform + nambari nyingi za nambari ambazo zinaweza kuwa muhimu.

Njia

Jaribio la kwanza
Nilianza na toleo rahisi. Kuwasiliana na wingu kupitia SDK kwa rasilimali inayohitajika na kuibadilisha kuwa sehemu za terraform. Jaribio lilikufa mara moja kwenye kikundi cha usalama kwa sababu sikupenda siku 1.5 za kubadilisha kikundi cha usalama pekee (na kuna rasilimali nyingi). Kwa muda mrefu na kisha mashamba yanaweza kubadilishwa/kuongezwa

Jaribio la pili
Kulingana na wazo lililoelezewa hapa. Chukua tu na ubadilishe tfstate kuwa tf. Data zote zipo na mashamba ni sawa. Jinsi ya kupata tfstate kamili kwa rasilimali nyingi? Hapa ndipo amri ya `terraform refresh` iliposaidia. terraform inachukua rasilimali zote katika tfstate na, kwa kitambulisho, hutoa data juu yao na kuandika kila kitu kwa tfstate. Hiyo ni, unda tfstate tupu iliyo na majina na vitambulisho pekee, endesha `terraform refresh` kisha tupate tfstates kamili. Hooray!
Sasa wacha tufanye ponografia inayojirudia ya kuandika kibadilishaji cha tfstate hadi tf. Kwa wale ambao hawajawahi kusoma tfstate, ni JSON, lakini maalum.
Hapa kuna sifa zake muhimu za sehemu

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

Kuna:
1. kitambulisho - kamba
2. metadata - safu ya ukubwa 1 na ndani yake kitu na mashamba ambayo ni ilivyoelezwa hapa chini
3. spec - hash ya ukubwa 1 na ufunguo, thamani ndani yake
Kwa kifupi, muundo wa kufurahisha, kila kitu kinaweza kuwa ngazi kadhaa za kina

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

Kwa ujumla, ikiwa mtu yeyote anataka shida ya programu kwa mahojiano, waulize tu waandike kichanganuzi cha kazi hii :)
Baada ya majaribio mengi ya kuandika kichanganuzi bila mende, nilipata sehemu yake kwenye nambari ya terraform, na sehemu muhimu zaidi. Na kila kitu kilionekana kufanya kazi vizuri

Jaribio la tatu
watoa huduma za terraform ni jozi ambazo zina msimbo na rasilimali zote na mantiki ya kufanya kazi na API ya wingu. Kila wingu ina mtoaji wake mwenyewe na terraform yenyewe huwaita tu kupitia itifaki yake ya RPC kati ya michakato miwili.
Sasa niliamua kuwasiliana na watoa huduma za terraform moja kwa moja kupitia simu za RPC. Ilibadilika kwa uzuri na kuwezesha kubadilisha watoa huduma za terraform hadi mpya zaidi na kupata vipengele vipya bila kubadilisha msimbo. Pia zinageuka kuwa sio nyanja zote katika tfstate zinapaswa kuwa katika tf, lakini unawezaje kujua? Muulize tu mtoa huduma wako kuhusu hili. Kisha ponografia nyingine ya kujirudia ya kukusanya maneno ya kawaida ilianza, kutafuta mashamba ndani ya tfstate katika ngazi zote kwa kina.

Mwishowe, tulipata zana muhimu ya CLI ambayo ina miundombinu ya kawaida kwa watoa huduma wote wa terraform na unaweza kuongeza mpya kwa urahisi. Pia, kuongeza rasilimali inachukua nambari ndogo. Pamoja na kila aina ya vitu vizuri kama vile miunganisho kati ya rasilimali. Bila shaka, kulikuwa na matatizo mengi tofauti ambayo hayawezi kuelezewa yote.
Nilimwita mnyama huyo Terrafomer.

Finale

Kwa kutumia Terrafomer, tulitoa mistari elfu 500-700 ya msimbo wa tf + tfstate kutoka kwa mawingu mawili. Tuliweza kuchukua vitu vya urithi na kuanza kuvigusa tu kupitia terraform, kama katika miundombinu bora kama mawazo ya kanuni. Ni uchawi tu unapochukua wingu kubwa na kuipokea kupitia timu katika mfumo wa faili za mfanyakazi wa terraform. Na kisha grep/replace/git na kadhalika.

Niliichana na kuiweka sawa, nikapata ruhusa. Imetolewa kwenye GitHub kwa kila mtu siku ya Alhamisi (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Tayari imepokea nyota 600, maombi 2 ya kuvuta kwa kuongeza usaidizi wa openstack na kubernetes. Maoni mazuri. Kwa ujumla, mradi huo ni muhimu kwa watu
Ninashauri kila mtu ambaye anataka kuanza kufanya kazi na Terraform na si kuandika tena kila kitu kwa hili.
Nitafurahi kuvuta maombi, maswala, nyota.

NI
Terraformer - Miundombinu kwa Kanuni

Chanzo: mapenzi.com

Kuongeza maoni