Terraformer ā€” Infrastructure To Code

Terraformer ā€” Infrastructure To Code
Es vēlētos jums pastāstīt par jauno CLI rīku, kuru rakstīju, lai atrisinātu vecu problēmu.

problēma

Terraform jau sen ir bijis standarts Devops/Cloud/IT kopienā. Lieta ir ļoti ērta un noderÄ«ga, lai risinātu infrastruktÅ«ru kā kodu. Terraform ir daudz prieka, kā arÄ« daudzas dakÅ”iņas, asi naži un grābekļi.
Ar Terraform ir ļoti ērti izveidot jaunas lietas un pēc tam tās pārvaldÄ«t, mainÄ«t vai dzēst. Ko darÄ«t tiem, kuriem mākonÄ« ir milzÄ«ga infrastruktÅ«ra un kas nav izveidoti, izmantojot Terraform? Visa mākoņa pārrakstÄ«Å”ana un atkārtota izveide ir dārga un nedroÅ”a.
Es saskāros ar Å”o problēmu 2 darbos, visvienkārŔākais piemērs ir, ja vēlaties, lai viss bÅ«tu Git formātā terraform failu veidā, bet jums ir 250+ spaiņi, un ir ļoti daudz tos rakstÄ«t terraformā ar roku.
Ir izdot kopÅ” 2014. gada terrafomā, kas tika slēgts 2016. gadā ar cerÄ«bu, ka bÅ«s imports.

Kopumā viss ir kā bildē tikai no labās uz kreiso pusi

Brīdinājumi: Autors nedzīvo pusi mūža Krievijā un maz raksta krieviski. Uzmanieties no pareizrakstības kļūdām.

Risinājumi

1. AWS ir gatavi un veci risinājumi terraformÄ“Å”ana. Mēģinot dabÅ«t cauri savus 250+ spaiņus, sapratu, ka tur viss ir slikti. AWS jau sen ir ieviesis daudz jaunu iespēju, taču terraforming par tām nezina, un kopumā tas ir rubÄ«ns veidne izskatās reta. Pēc 2 vakarā nosÅ«tÄ«ju IzvilkÅ”anas pieprasÄ«jums lai tur pievienotu vēl funkcijas un sapratu, ka Ŕāds risinājums nemaz nav piemērots.
Kā darbojas terraformÄ“Å”ana: tā ņem datus no AWS SDK un Ä£enerē tf un tfstate, izmantojot veidni.
Šeit ir 3 problēmas:
1. Atjauninājumos vienmēr bÅ«s kavÄ“Å”anās
2. tf faili dažreiz iznāk bojāti
3. tfstate tiek savākts atseviŔķi no tf un ne vienmēr saplÅ«st
Vispār ir grūti iegūt rezultātu, kurā `terraforma plānā` teikts, ka izmaiņu nav

2. "Terraform import" ir terraformā iebūvēta komanda. Kā tas darbojas?
JÅ«s ierakstāt tukÅ”u TF failu ar resursa nosaukumu un veidu, pēc tam palaidiet "terraform import" un nododiet resursa ID. terraform sazinās ar pakalpojumu sniedzēju, saņem datus un izveido tfstate failu.
Šeit ir 3 problēmas:
1. Mēs saņemam tikai tfstate failu, un tf ir tukÅ”s, jums tas ir jāraksta manuāli vai jākonvertē no tfstate
2. Var vienlaikus strādāt tikai ar vienu resursu un neatbalsta visus resursus. Un ko man atkal darīt ar 250+ spaiņiem?
3. Jums ir jāzina resursu ID ā€” tas ir jāiekļauj kodā, kas iegÅ«st resursu sarakstu.
Kopumā rezultāts ir daļējs un nav labi mērogojams

Mans lēmums

Prasības:
1. Spēja izveidot resursiem tf un tfstate failus. Piemēram, lejupielādējiet visus segmentus/droŔības grupu/slodzes lÄ«dzsvarotāju un `terraform plan` atgriezās, ka nav izmaiņu.
2. Jums nepiecieÅ”ami 2 GCP + AWS mākoņi
3. Globāls risinājums, kas ir viegli atjaunojams katru reizi un netērē laiku katram resursam 3 dienu darbam
4. Padariet to par atvērto avotu ā€“ visiem ir viena un tā pati problēma

Go valoda ir iemesls, kāpēc man tā patīk, un tai ir bibliotēka HCL failu izveidei, kas tiek izmantota terraformā + daudz koda terraformā, kas var būt noderīgs.

Taka

Mēģinājums vispirms
Es sāku ar vienkārÅ”u versiju. Sazinieties ar mākoni, izmantojot SDK, lai iegÅ«tu nepiecieÅ”amo resursu un pārvērstu to par laukiem terraformai. Mēģinājums nekavējoties nomira droŔības grupā, jo man nepatika 1.5 dienas, lai pārveidotu tikai droŔības grupu (un resursu ir daudz). Ilgu laiku un pēc tam laukus var mainÄ«t/pievienot

Otrais mēģinājums
Pamatojoties uz aprakstÄ«to ideju Å”eit. VienkārÅ”i paņemiet un pārveidojiet tfstate par tf. Visi dati ir tur, un lauki ir vienādi. Kā iegÅ«t pilnu tfstate daudziem resursiem? Å eit palÄ«gā nāca komanda "terraform refresh". terraform ņem visus resursus tfstate un pēc ID izvelk datus par tiem un ieraksta visu tfstate. Tas ir, izveidojiet tukÅ”u tfstate ar tikai nosaukumiem un ID, palaidiet `terraform refresh' un tad mēs iegÅ«stam pilnus tfstate. Urrā!
Tagad veiksim rekursīvo pornogrāfiju, rakstot pārveidotāju tfstate uz tf. Tiem, kas nekad nav lasījuŔi tfstate, tas ir JSON, taču īpaŔs.
Šeit ir tā svarīgās daļas atribūti

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

Tur ir:
1. id - virkne
2. metadati - 1. izmēra masīvs un tajā objekts ar laukiem, kas aprakstīts zemāk
3. specifikācija - 1. izmēra hash un atslēga, vērtība tajā
ÄŖsāk sakot, jautrs formāts, viss var bÅ«t vairākos lÄ«meņos dziļŔ

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

Kopumā, ja kāds vēlas programmÄ“Å”anas problēmu intervijai, vienkārÅ”i palÅ«dziet viņam uzrakstÄ«t parseri Å”im uzdevumam :)
Pēc daudziem mēģinājumiem uzrakstīt parsētāju bez kļūdām, es atradu daļu no tā terraform kodā un vissvarīgāko daļu. Un likās, ka viss darbojās labi

Trīs mēģinājums
terraform nodroÅ”inātāji ir binārie faili, kas satur kodu ar visiem resursiem un loÄ£iku darbam ar mākoņa API. Katram mākonim ir savs nodroÅ”inātājs, un pati terraforma tos izsauc tikai, izmantojot savu RPC protokolu starp diviem procesiem.
Tagad es nolēmu tieÅ”i sazināties ar terraformu nodroÅ”inātājiem, izmantojot RPC zvanus. Tas izrādÄ«jās skaisti un ļāva mainÄ«t terraformu nodroÅ”inātājus uz jaunākiem un iegÅ«t jaunas funkcijas, nemainot kodu. Izrādās arÄ«, ka ne visiem laukiem tfstate ir jābÅ«t tf, bet kā to uzzināt? VienkārÅ”i jautājiet savam pakalpojumu sniedzējam par to. Tad sākās cita rekursÄ«va pornogrāfija, kurā tika apkopotas regulāras izteiksmes, meklējot laukus tfstate iekÅ”ienē visos lÄ«meņos.

Galu galā mēs ieguvām noderÄ«gu CLI rÄ«ku, kuram ir kopēja infrastruktÅ«ra visiem terraform pakalpojumu sniedzējiem, un jÅ«s varat viegli pievienot jaunu. Turklāt resursu pievienoÅ”ana aizņem maz koda. Plus vēl visādi labumi, piemēram, savienojumi starp resursiem. Protams, bija daudz dažādu problēmu, kuras nevar aprakstÄ«t visas.
Es nosaucu dzīvnieku par Terrafomer.

Fināls

Izmantojot Terrafomer, mēs no diviem mākoņiem Ä£enerējām 500ā€“700 tÅ«kstoÅ”us tf + tfstate koda rindiņu. Mēs varējām paņemt mantotās lietas un sākt tām pieskarties tikai caur terraformu, kā vislabākajā infrastruktÅ«rā kā koda idejas. Tas ir tikai maÄ£isks, kad paņemat milzÄ«gu mākoni un saņemat to ar komandas starpniecÄ«bu terraformas darbinieka failu veidā. Un tad grep/replace/git un tā tālāk.

Izķemmēju un savedu kārtībā, dabūju atļauju. Izlaists GitHub ikvienam ceturtdien (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Jau saņemti 600 zvaigznes, 2 pievilkÅ”anas pieprasÄ«jumi, lai pievienotu atbalstu openstack un kubernetes. Labas atsauksmes. Kopumā projekts cilvēkiem ir noderÄ«gs
Es iesaku visiem, kas vēlas sākt strādāt ar Terraform un nepārrakstÄ«t visu Å”im nolÅ«kam.
Ar prieku izvilkŔu pieprasījumus, jautājumus, zvaigznes.

Demo
Terraformer ā€” Infrastructure To Code

Avots: www.habr.com

Pievieno komentāru