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
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
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
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).
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
Zdroj: hab.com