Terraformer - Infrastruktur Fir Code

Terraformer - Infrastruktur Fir Code
Ech wéilt Iech iwwer dat neit CLI-Tool soen, dat ech geschriwwen hunn fir en alen Problem ze léisen.

Problem

Terraform ass laang e Standard an der Devops / Cloud / IT Gemeinschaft. D'Saach ass ganz bequem an nëtzlech fir mat Infrastruktur als Code ze handelen. Et gi vill Freed an Terraform wéi och vill Gabel, schaarf Messer a Raken.
Mat Terraform ass et ganz bequem nei Saachen ze kreéieren an se dann ze managen, z'änneren oder ze läschen. Wat sollen déi maachen, déi eng rieseg Infrastruktur an der Wollek hunn an net duerch Terraform erstallt sinn? D'ganz Wollek nei ze schreiwen an nei ze kreéieren ass iergendwéi deier an onsécher.
Ech hunn dëse Problem bei 2 Aarbechtsplaze begéint, dat einfachst Beispill ass wann Dir wëllt datt alles an Git an der Form vun Terraform Dateien ass, awer Dir hutt 250+ Eemer an et ass vill fir se an terraform vun der Hand ze schreiwen.
et ginn Fro zënter 2014 zu terrafom déi zougemaach gouf 2016 mat der Hoffnung datt et Import ginn.

Am Allgemengen ass alles wéi am Bild nëmme vu riets op lénks

Warnungen: Den Auteur wunnt net fir d'Halschent vum Liewen a Russland a schreift wéineg op Russesch. Opgepasst op Schreiffeeler.

Léisungen

1. Et gi fäerdeg an al Léisunge fir AWS terraforming. Wann ech probéiert meng 250+ Eemer duerch et ze kréien, Ech gemierkt, datt alles schlecht war do. AWS huet laang vill nei Optiounen agefouert, awer Terraforming weess net iwwer si an allgemeng ass et Rubin d'Schabloun gesäit spatzem aus. No 2 den Owend hunn ech geschéckt Pull Ufro fir do méi Fonctiounen ze addéieren a realiséiert datt esou eng Léisung guer net gëeegent ass.
Wéi Terraforming funktionnéiert: et hëlt Daten aus der AWS SDK a generéiert tf an tfstate duerch eng Schabloun.
Hei sinn 3 Problemer:
1. Et gëtt ëmmer eng Lag an Aktualiséierungen ginn
2. tf Fichieren heiansdo gebrach eraus
3. tfstate gëtt getrennt vun tf gesammelt a konvergéiert net ëmmer
Am Allgemengen ass et schwéier e Resultat ze kréien an deem `terraform plan` seet datt et keng Ännerunge gëtt

2. `terraform import` ass en agebaute Kommando an Terraform. Wéi funktionéiert et?
Dir schreift eng eidel TF-Datei mam Numm an der Aart vun der Ressource, laaft dann 'terraform Import' a passéiert d'Ressource ID. terraform kontaktéiert de Provider, kritt d'Donnéeën a mécht eng tfstate Datei.
Hei sinn 3 Problemer:
1. Mir kréien nëmmen eng tfstate Datei, an den tf ass eidel, Dir musst se manuell schreiwen oder se vun tfstate konvertéieren
2. Kann nëmme mat enger Ressource gläichzäiteg schaffen an ënnerstëtzt net all Ressourcen. A wat soll ech erëm mat 250+ Eemer maachen?
3. Dir musst d'ID vun de Ressourcen wëssen - dat ass, Dir musst et a Code wéckelen, deen d'Lëscht vun de Ressourcen kritt
Am Allgemengen ass d'Resultat deelweis a schalt net gutt

Meng Entscheedung

Ufuerderunge:
1. Fähegkeet tf an tfstate Fichieren fir Ressourcen ze schafen. Zum Beispill, luet all d'Eemere / Sécherheetsgrupp / Lastbalancer erof an datt 'terraform Plang' zréckkomm ass datt et keng Ännerungen sinn
2. Dir braucht 2 GCP + AWS Wolleken
3. Global Léisung déi einfach all Kéier ze aktualiséieren an keng Zäit op all Ressource fir 3 Deeg Aarbecht verschwenden
4. Maacht et Open Source - jiddereen huet dee selwechte Problem

D'Go Sprooch ass firwat ech et gär hunn, an et huet eng Bibliothéik fir HCL Dateien ze kreéieren déi an Terraform benotzt ginn + vill Code an Terraform déi nëtzlech ka sinn

Wee

Éischt Verspriechen
Ech ugefaang mat enger einfacher Versioun. Kontaktéiert d'Wollek iwwer d'SDK fir déi erfuerderlech Ressource a konvertéiert se a Felder fir Terraform. De Versuch ass direkt op der Sécherheetsgrupp gestuerwen, well ech net gär hunn déi 1.5 Deeg fir nëmmen d'Sécherheetsgrupp ze konvertéieren (an et gi vill Ressourcen). Fir eng laang Zäit an da kënnen Felder geännert / bäigefüügt ginn

Zweet Versuch
Baséiert op der beschriwwen Iddi hei. Just huelt a konvertéiert tfstate op tf. All d'Donnéeë sinn do an d'Felder sinn déiselwecht. Wéi kritt een voll tfstate fir vill Ressourcen ?? Dëst ass wou de Kommando 'terraform refresh' zur Rettung koum. terraform hëlt all Ressourcen an tfstate an, duerch ID, zitt Daten doriwwer eraus a schreift alles op tfstate. Dat ass, erstellt en eidelen tfstate mat nëmmen Nimm an IDen, lafen `terraform refresh` an da kréie mir voll tfstates. Hour!
Loosst eis elo déi rekursiv Pornographie maachen fir en Konverter fir tfstate op tf ze schreiwen. Fir déi, déi ni tfstate gelies hunn, ass et JSON, awer speziell.
Hei ass seng wichteg Deel Attributer

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

Do ass:
1. id - String
2. Metadaten - eng Rei vu Gréisst 1 an et en Objet mat Felder déi ënnert beschriwwen ass
3. spec - Hash vun Gréisst 1 a Schlëssel, Wäert an et
Kuerz gesot, e Spaass Format, alles kann e puer Niveauen déif sinn

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

Am Allgemengen, wann iergendeen e Programméierungsproblem fir en Interview wëllt, frot se just e Parser fir dës Aufgab ze schreiwen :)
No villen Versuche fir e Parser ouni Bugs ze schreiwen, hunn ech en Deel dovun am Terraform Code fonnt, an dee wichtegsten Deel. An alles schéngt gutt ze schaffen

Versuch dräi
terraform Ubidder sinn Binären déi Code mat all de Ressourcen a Logik enthalen fir mat der Cloud API ze schaffen. All Wollek huet säin eegene Provider an Terraform selwer rifft se nëmmen duerch säi RPC Protokoll tëscht zwee Prozesser.
Elo hunn ech beschloss Terraform Ubidder direkt iwwer RPC Uriff ze kontaktéieren. Et huet sech schéin erausgestallt an huet et méiglech gemaach Terraform Ubidder op méi nei z'änneren an nei Features ze kréien ouni de Code z'änneren. Et stellt sech och eraus datt net all Felder am tfstate an tf solle sinn, awer wéi kënnt Dir erausfannen? Frot just Äre Provider iwwer dëst. Dunn huet eng aner rekursiv Pornographie vun der Montéierung vun reegelméissegen Ausdrock ugefaang, no Felder am tfstate op all Niveau an Déift ze sichen.

Zum Schluss krute mir en nëtzlecht CLI-Tool deen eng gemeinsam Infrastruktur fir all Terraform Ubidder huet an Dir kënnt einfach en neien derbäisetzen. Och Ressourcen derbäisetzen brauch wéineg Code. Plus all Zorte vu Goodies wéi Verbindungen tëscht Ressourcen. Natierlech goufen et vill verschidde Problemer, déi net all beschriwwe kënne ginn.
Ech hunn d'Déier Terrafomer genannt.

Finale

Mat Terrafomer hu mir 500-700 Tausend Zeilen vun tf + tfstate Code vun zwou Wolleken generéiert. Mir konnten legacy Saachen huelen an ufänken se nëmmen duerch Terraform ze beréieren, wéi an der bescht Infrastruktur als Code Iddien. Et ass just Magie wann Dir eng rieseg Wollek hëlt an et duerch en Team a Form vun terraform Aarbechterdateien kritt. An dann grep / ersetzen / git a sou weider.

Ech hunn et gekämmt an et an Uerdnung gesat, krut Erlaabnis. Verëffentlecht op GitHub fir jiddereen en Donneschdeg (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Schonn 600 Stäre kritt, 2 Pull Ufroe fir Ënnerstëtzung fir Openstack a kubernetes ze addéieren. Gutt Feedback. Am Allgemengen ass de Projet nëtzlech fir Leit
Ech roden jidderengem dee wëll ufänken mat Terraform ze schaffen an net alles dofir ëmschreiwen.
Ech wäert frou Ufroen, Themen, Stären ze zéien.

Demo
Terraformer - Infrastruktur Fir Code

Source: will.com

Setzt e Commentaire