Terraformer - Infrastructure To Code

Terraformer - Infrastructure To Code
Chcel by som vám povedať o novom nástroji CLI, ktorý som napísal na vyriešenie starého problému.

problém

Terraform je už dlho štandardom v komunite Devops/Cloud/IT. Táto vec je veľmi pohodlná a užitočná na riešenie infraštruktúry ako kódu. V Terraforme je veľa pôžitkov, rovnako ako veľa vidličiek, ostrých nožov a hrablí.
S Terraformom je veľmi pohodlné vytvárať nové veci a potom ich spravovať, meniť alebo mazať. Čo by mali robiť tí, ktorí majú obrovskú infraštruktúru v cloude a nie je vytvorená cez Terraform? Prepísanie a opätovné vytvorenie celého cloudu je akosi drahé a nebezpečné.
S týmto problémom som sa stretol pri 2 úlohách, najjednoduchší príklad je, keď chcete, aby bolo všetko v Git vo forme súborov terraform, ale máte viac ako 250 vedier a je veľa písať ich v terraforme ručne.
K dispozícii je otázka od roku 2014 v terrafom, ktorý bol v roku 2016 zatvorený s nádejou, že dôjde k dovozu.

Vo všeobecnosti je všetko ako na obrázku iba sprava doľava

Varovania: Autor nežije polovicu života v Rusku a málo píše po rusky. Pozor na pravopisné chyby.

riešenie

1. Pre AWS existuje hotové a staré riešenie terraformovanie. Keď som sa cez ňu snažil dostať svojich 250+ vedier, uvedomil som si, že je tam všetko zlé. AWS už dlho predstavuje veľa nových možností, ale terraforming o nich nevie a vo všeobecnosti je to rubín šablóna vyzerá riedko. Po 2 večer som poslal Vytiahnite žiadosť pridať tam ďalšie funkcie a uvedomil si, že takéto riešenie nie je vôbec vhodné.
Ako funguje terraforming: berie údaje z AWS SDK a generuje tf a tfstate prostredníctvom šablóny.
Sú tu 3 problémy:
1. Aktualizácie budú vždy meškať
2. Súbory tf niekedy vychádzajú poškodené
3. tfstate sa zhromažďuje oddelene od tf a nie vždy konverguje
Vo všeobecnosti je ťažké získať výsledok, v ktorom „plán terraform“ hovorí, že neexistujú žiadne zmeny

2. `terraform import` je vstavaný príkaz v terraforme. Ako to funguje?
Napíšete prázdny súbor TF s názvom a typom zdroja, potom spustíte `terraform import` a odošlete ID prostriedku. terraform kontaktuje poskytovateľa, prijme údaje a vytvorí súbor tfstate.
Sú tu 3 problémy:
1. Získame iba súbor tfstate a tf je prázdny, musíte ho napísať ručne alebo ho previesť z tfstate
2. Môže pracovať iba s jedným zdrojom naraz a nepodporuje všetky zdroje. A čo mám zase robiť s 250+ vedrami?
3. Musíte poznať ID zdrojov – to znamená, že ich musíte zabaliť do kódu, ktorý získa zoznam zdrojov
Vo všeobecnosti je výsledok čiastočný a neškáluje sa dobre

Moje rozhodnutie

požiadavky:
1. Schopnosť vytvárať súbory tf a tfstate pre zdroje. Stiahnite si napríklad všetky vedrá/bezpečnostnú skupinu/vyrovnávač zaťaženia a ten „plán terraform“ vrátil, že nie sú žiadne zmeny
2. Potrebujete 2 cloudy GCP + AWS
3. Globálne riešenie, ktoré sa vždy ľahko aktualizuje a nestráca čas na každom zdroji počas 3 dní práce
4. Make it Open Source – každý má rovnaký problém

Jazyk Go je dôvod, prečo ho milujem, a má knižnicu na vytváranie súborov HCL, ktorá sa používa v terraforme + veľa kódu v terraforme, ktorý môže byť užitočný

Cesta

Pokúste sa najskôr
Začal som s jednoduchou verziou. Kontaktovanie cloudu prostredníctvom súpravy SDK pre požadovaný zdroj a jeho konverzia na polia pre terraform. Pokus okamžite zomrel na bezpečnostnej skupine, pretože sa mi nepáčilo 1.5 dňa na konverziu iba bezpečnostnej skupiny (a existuje veľa zdrojov). Po dlhú dobu a potom je možné polia meniť/pridávať

Druhý pokus
Na základe opísanej myšlienky tu. Stačí vziať a previesť tfstate na tf. Sú tam všetky údaje a polia sú rovnaké. Ako získať plný tfstate pre veľa zdrojov? Tu prišiel na pomoc príkaz `terraform refresh`. terraform vezme všetky zdroje v tfstate a podľa ID z nich vytiahne údaje a všetko zapíše do tfstate. To znamená, že vytvorte prázdny tfstate iba s názvami a ID, spustite `terraform refresh` a potom dostaneme plné tfstates. Hurá!
Teraz urobme rekurzívnu pornografiu písania konvertora pre tfstate na tf. Pre tých, ktorí nikdy nečítali tfstate, je to JSON, ale špeciálne.
Tu sú jeho dôležité atribúty

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

K dispozícii je:
1. id - reťazec
2. metadáta - pole veľkosti 1 a v ňom objekt s poľami, ktorý je popísaný nižšie
3. špecifikácia - hash veľkosti 1 a kľúč, hodnota v ňom
Skrátka zábavný formát, všetko môže mať niekoľko úrovní

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

Vo všeobecnosti, ak chce niekto problém s programovaním na pohovor, požiadajte ho, aby na túto úlohu napísal analyzátor :)
Po mnohých pokusoch napísať parser bez chýb som našiel časť v kóde terraform a najdôležitejšiu časť. A zdalo sa, že všetko funguje dobre

Pokus tri
poskytovatelia terraform sú binárne súbory, ktoré obsahujú kód so všetkými prostriedkami a logikou pre prácu s cloudovým API. Každý cloud má svojho poskytovateľa a samotný terraform ich volá len cez svoj RPC protokol medzi dvoma procesmi.
Teraz som sa rozhodol kontaktovať poskytovateľov terraform priamo cez RPC hovory. Ukázalo sa to krásne a umožnilo zmeniť poskytovateľov terraform na novších a získať nové funkcie bez zmeny kódu. Ukazuje sa tiež, že nie všetky polia v tfstate by mali byť v tf, ale ako to môžete zistiť? Stačí sa na to opýtať svojho poskytovateľa. Potom sa začala ďalšia rekurzívna pornografia skladania regulárnych výrazov, ktorá hľadala polia vo vnútri tfstate na všetkých úrovniach do hĺbky.

Nakoniec sme dostali užitočný nástroj CLI, ktorý má spoločnú infraštruktúru pre všetkých poskytovateľov terraform a môžete si jednoducho pridať novú. Tiež pridávanie zdrojov vyžaduje málo kódu. Plus všelijaké vychytávky ako prepojenia medzi zdrojmi. Samozrejme, bolo veľa rôznych problémov, ktoré sa nedajú opísať všetky.
Zviera som pomenoval Terrafomer.

finále

Pomocou Terrafomeru sme vygenerovali 500-700 tisíc riadkov kódu tf + tfstate z dvoch cloudov. Dokázali sme vziať staršie veci a začať sa ich dotýkať iba prostredníctvom terraformu, ako v najlepšej infraštruktúre, ako sú nápady na kódy. Je to len kúzlo, keď vezmete obrovský cloud a dostanete ho prostredníctvom tímu vo forme súborov terraform worker. A potom grep/replace/git a tak ďalej.

Vyčesal som to a dal do poriadku, dostal som povolenie. Vydané na GitHub pre všetkých vo štvrtok (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Už bolo prijatých 600 hviezdičiek, 2 žiadosti o pridanie podpory pre openstack a kubernetes. Dobrá spätná väzba. Vo všeobecnosti je projekt pre ľudí užitočný
Radím všetkým, ktorí chcú začať pracovať s Terraformom a neprepisovať všetko na toto.
Rád vytiahnem požiadavky, problémy, hviezdičky.

demonštrácie
Terraformer - Infrastructure To Code

Zdroj: hab.com

Pridať komentár