Terraformer - Ynfrastruktuer To Code

Terraformer - Ynfrastruktuer To Code
Ik wol jo fertelle oer it nije CLI-ark dat ik skreau om in âld probleem op te lossen.

probleem

Terraform is al lang in standert yn 'e Devops / Cloud / IT-mienskip. It ding is heul handich en nuttich foar it omgean mei ynfrastruktuer as koade. Der binne in protte lekkernijen yn Terraform en ek in protte foarken, skerpe messen en harken.
Mei Terraform is it heul handich om nije dingen te meitsjen en se dan te behearjen, te feroarjen of te wiskjen. Wat moatte dejingen dwaan dy't in enoarme ynfrastruktuer yn 'e wolk hawwe en net makke troch Terraform? It oerskriuwen en opnij oanmeitsjen fan 'e heule wolk is op ien of oare manier djoer en ûnfeilich.
Ik tsjinkaam dit probleem op 2 banen, de ienfâldichste foarbyld is as jo wolle dat alles te wêzen yn Git yn 'e foarm fan terraform triemmen, mar do hast 250+ emmers en it is in protte te skriuwen se yn terraform mei de hân.
der binne dei fan sûnt 2014 yn terrafom dat waard sletten yn 2016 mei de hope dat der sil wêze ymport.

Yn 't algemien is alles lykas yn' e foto allinich fan rjochts nei lofts

Warskôgings: De skriuwer wennet de helte fan syn libben net yn Ruslân en skriuwt net folle yn it Russysk. Pas op foar staveringsflaters.

Oplossingen

1. Der binne klearebare en âlde oplossings foar AWS terraforming. Doe't ik besocht te krijen myn 250+ bakken der troch, Ik realisearre dat alles wie min dêr. AWS hat lang in protte nije opsjes yntrodusearre, mar terraforming wit der net fan en yn 't algemien is it ruby it sjabloan sjocht sparse. Nei 2 oere jûns stjoerde ik Pull fersyk om dêr mear funksjes ta te foegjen en besefte dat sa'n oplossing hielendal net geskikt is.
Hoe terraforming wurket: it nimt gegevens fan 'e AWS SDK en genereart tf en tfstate fia in sjabloan.
D'r binne 3 problemen hjir:
1. D'r sil altyd in efterstân wêze yn updates
2. tf triemmen soms komme út brutsen
3. tfstate wurdt apart fan tf sammele en komt net altyd gear
Oer it algemien is it dreech om in resultaat te krijen wêryn `terraform plan` seit dat der gjin feroarings binne

2. `terraform ymport` is in ynboude kommando yn terraform. Hoe wurket it?
Jo skriuwe in lege TF-bestân mei de namme en it type boarne, rinne dan `terraform ymportearje` en passe de boarne-ID troch. terraform kontaktet de provider, ûntfangt de gegevens en makket in tfstate-bestân.
D'r binne 3 problemen hjir:
1. Wy krije allinich in tfstate-bestân, en de tf is leech, jo moatte it manuell skriuwe of konvertearje fan tfstate
2. Kin allinnich wurkje mei ien boarne tagelyk en stipet net alle middels. En wat moat ik wer dwaan mei 250+ bakken?
3. Jo moatte de ID fan 'e boarnen witte - dat is, jo moatte it yn koade ynpakke dy't de list mei boarnen krijt
Yn 't algemien is it resultaat diels en skaalet net goed

Myn beslút

Easken:
1. Mooglikheid om te meitsjen tf en tfstate triemmen foar middels. Download bygelyks alle bakken / befeiligingsgroep / load balancer en dat `terraform plan` joech werom dat d'r gjin feroaringen binne
2. Jo moatte 2 GCP + AWS wolken
3. Globale oplossing dy't elke kear maklik te aktualisearjen is en gjin tiid fergriemt op elke boarne foar 3 dagen wurk
4. Meitsje it Open Source - elkenien hat itselde probleem

De Go-taal is wêrom ik derfan hâld, en it hat in bibleteek foar it meitsjen fan HCL-bestannen dy't brûkt wurde yn terraform + in protte koade yn terraform dy't nuttich kin wêze

paad

Besykje earst
Ik begon mei in ienfâldige ferzje. Kontakt opnimme mei de wolk fia de SDK foar de fereaske boarne en it omsette yn fjilden foar terraform. De besykjen stoar fuortendaliks op 'e feiligens groep om't ik net leuk de 1.5 dagen te bekearen allinnich de feiligens groep (en der binne in soad boarnen). Foar in lange tiid en dan kinne fjilden wizige/tafoege wurde

Twadde poging
Op grûn fan it beskreaune idee hjir. Nim gewoan en konvertearje tfstate nei tf. Alle gegevens binne der en de fjilden binne itselde. Hoe kinne jo folsleine tfstate krije foar in protte boarnen ?? Dit is wêr't it kommando 'terraform refresh' ta de rêding kaam. terraform nimt alle boarnen yn tfstate en, troch ID, lûkt gegevens derop út en skriuwt alles nei tfstate. Dat is, meitsje in lege tfstate mei allinnich nammen en ID's, run `terraform refresh` en dan krije wy folsleine tfstates. Hoera!
Litte wy no de rekursive pornografy dwaan fan it skriuwen fan in converter foar tfstate nei tf. Foar dyjingen dy't tfstate noait hawwe lêzen, is it JSON, mar spesjaal.
Hjir is syn wichtige diel attributen

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

Dêr is:
1. id - string
2. metadata - in array fan grutte 1 en dêryn in foarwerp mei fjilden dat wurdt beskreaun hjirûnder
3. spec - hash fan grutte 1 en kaai, wearde yn it
Koartsein, in leuke opmaak, alles kin ferskate nivo's djip wêze

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

Yn 't algemien, as immen in programmearprobleem foar in ynterview wol, freegje har dan gewoan in parser te skriuwen foar dizze taak :)
Nei in protte besykjen om in parser te skriuwen sûnder bugs, fûn ik in diel dêrfan yn 'e terraformkoade, en it wichtichste diel. En alles like goed te wurkjen

Trije besykjen
terraform-oanbieders binne binaries dy't koade befetsje mei alle boarnen en logika foar wurkjen mei de wolk API. Elke wolk hat in eigen provider en terraform sels neamt se allinich fia har RPC-protokol tusken twa prosessen.
No haw ik besletten om direkt kontakt te meitsjen mei terraform-oanbieders fia RPC-oproppen. It draaide prachtich út en makke it mooglik om terraform-oanbieders te feroarjen nei nijere en nije funksjes te krijen sûnder de koade te feroarjen. It docht ek bliken dat net alle fjilden yn tfstate yn tf moatte stean, mar hoe kinne jo dat fine? Freegje jo provider gewoan oer dit. Doe begon in oare rekursive pornografy fan it sammeljen fan reguliere útdrukkingen, sykjen nei fjilden yn 'e steat op alle nivo's yn djipte.

Uteinlik krigen wy in nuttich CLI-ark dat in mienskiplike ynfrastruktuer hat foar alle terraform-oanbieders en jo kinne maklik in nij tafoegje. It tafoegjen fan boarnen nimt ek in bytsje koade. Plus allerhande guod lykas ferbinings tusken boarnen. Fansels wiene d'r in protte ferskillende problemen dy't net allegear kinne wurde beskreaun.
Ik neamde it bist Terrafomer.

Finale

Mei Terrafomer hawwe wy 500-700 tûzen rigels fan tf + tfstate-koade generearre fan twa wolken. Wy wienen by steat om te nimmen legacy dingen en begjinne te berikken se allinnich troch terraform, lykas yn de bêste ynfrastruktuer as koade ideeën. It is gewoan magy as jo in enoarme wolk nimme en it ûntfange fia in team yn 'e foarm fan terraform-wurkerbestannen. En dan grep/replace/git ensafuorthinne.

Ik kame it út en sette it yn oarder, krige tastimming. Utbrocht op GitHub foar elkenien op tongersdei (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Al 600 stjerren krigen, 2 pull-oanfragen foar it tafoegjen fan stipe foar openstack en kubernetes. Goede feedback. Yn 't algemien is it projekt nuttich foar minsken
Ik advisearje elkenien dy't mei Terraform begjinne wol te wurkjen en net alles hjirfoar oerskriuwe.
Ik sil bliid wêze om oanfragen, problemen, stjerren te lûken.

Demo
Terraformer - Ynfrastruktuer To Code

Boarne: www.habr.com

Add a comment