Terraformer — Infrastruktur til kode

Terraformer — Infrastruktur til kode
Jeg vil gerne fortĂŠlle om et nyt CLI-vĂŠrktĂžj, jeg har skrevet for at lĂžse et gammelt problem.

Problemet

Terraform er lÊnge blevet standarden i DevOps/Cloud/IT fÊllesskabet. Det er en meget praktisk og nyttig ting til at arbejde med infrastruktur som kode. Der er mange fordele ved Terraform, sÄvel som mange forhindringer, skarpe knive og fÊlder.
Med Terraform er det meget nemt at lave nye ting og derefter administrere, Êndre eller slette dem. Men hvad skal man gÞre, hvis man har en enorm infrastruktur i skyen, der ikke er oprettet via Terraform? At omskrive og genskabe hele skyen fÞles bÄde dyrt og usikkert.
Jeg har vÊret ude for dette problem pÄ to arbejdspladser, den mest enkle situation er, nÄr man Þnsker, at alt skal vÊre i Git som Terraform-filer, men man har 250+ buckets, og at skrive dem til Terraform manuelt virker bare som for meget.
Der er issue Siden 2014 har der vÊret et vÊrktÞj som Terraform, der blev lukket i 2016, med hÄbet om, at importfunktionaliteten ville blive tilfÞjet.

Generelt ser alt ud som pÄ billedet, men fra hÞjre mod venstre.

Advarsel: Forfatteren har ikke boet i Rusland i halvdelen af sit liv og skriver sjÊldent pÄ russisk. VÊr forsigtig med stavefejl.

LĂžsninger

1. Der findes gamle og fÊrdige lÞsninger til AWS. terraforming. Da jeg forsÞgte at bruge det til at hente mine 250+ buckets, indsÄ jeg, at der var mange problemer. AWS har lÊnge tilfÞjet mange nye muligheder, som terraforming ikke kender til, og det er generelt baseret pÄ Ruby. Templates ser kedelige ud.. Efter kl. 2 sendte jeg Pull request for at tilfÞje flere funktioner der, og jeg indsÄ, at en sÄdan lÞsning ikke fungerer overhovedet.
Hvordan fungerer terraforming? Det henter data fra AWS SDK og genererer tf og tfstate gennem en template.
Her er tre problemer:
1. Der vil altid vĂŠre forsinkelse i opdateringerne.
2. tf-filerne bliver nogle gange beskadigede.
3. tfstate genereres separat fra tf og stemmer ikke altid overens.
Det er generelt svÊrt at fÄ et resultat, hvor `terraform plan` siger, at der ikke er nogen Êndringer.

2. `terraform import` — en indbygget kommando i Terraform. Hvordan fungerer det?
Du skriver en tom TF-fil med navnet og arten af ressourcen, derefter kÞrer du `terraform import` og sender ressourcens ID. Terraform kommunikerer med udbyderen, fÄr data og opretter en tfstate-fil.
Her er tre problemer:
1. Du fÄr kun tfstate-filen, og tf er tom, sÄ den skal skrives manuelt eller konverteres fra tfstate.
2. Det kan kun arbejde med én ressource ad gangen og understÞtter ikke alle ressourcer. Hvad skal jeg sÄ gÞre med 250+ buckets?
3. Du skal kende ressourcens ID — det vil sige, at du skal indpakke det i kode, der henter ressourcelisten.
Generelt er resultatet delvist og skalerer ikke godt.

Min lĂžsning.

Krav:
1. Mulighed for at oprette tf- og tfstate-filer baseret pÄ ressourcer. For eksempel at downloade alle buckets/security group/load balancer og hvad `terraform plan` returnerede om, at der ikke er Êndringer.
2. To skyer GCP + AWS
3. En global lÞsning, der nemt kan opdateres hver gang, uden at bruge tid pÄ hver ressource i tre dage.
4. Gþre det Open source — alle har det samme problem.

Programmeringssproget Go — derfor elsker jeg det, og der findes et bibliotek til oprettelse af HCL-filer, som bruges i terraform + en masse kode i terraform, der kan vére nyttig.

Sti

FĂžrste forsĂžg
Jeg startede med en simpel version. Adgang til skyen gennem SDK for at hente den nÞdvendige ressource og konvertere den til felter til terraform. ForsÞget dÞde straks pÄ security group, fordi jeg ikke kunne lide at bruge 1,5 dag pÄ kun at konvertere security group (for der er mange ressourcer). Det er for lang tid, og derefter kan felterne Êndre sig eller tilfÞjes.

Andet forsĂžg
Baseret pÄ ideen beskrevet her. Bare tage og konvertere tfstate til tf. Alle data er der, og felterne er de samme. Hvordan fÄr man fuld tfstate for mange ressourcer? Her kom kommandoen `terraform refresh` til hjÊlp. Terraform tager alle ressourcer i tfstate og henter data ved at bruge ID og skriver alt tilbage i tfstate. SÄdan kan man oprette en tom tfstate kun med navne og ID, kÞre `terraform refresh`, og sÄ fÄr vi komplette tfstate. Hurra!
Lad os nu arbejde med den rekursive pornostof: skrive en converter for tfstate til tf. For dem, der aldrig har lĂŠst tfstate, er det JSON, men sĂŠrligt.
Her er dens vigtige del attributes

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

Her har vi:
1. id — string
2. metadata — array pĂ„ stĂžrrelse 1, indeholdende et objekt med felterne beskrevet nedenfor
3. spec — hash pĂ„ stĂžrrelse 1, indeholdende key,value
Kort sagt, en sjov format, alt kan ogsÄ vÊre dybt ind i flere niveauer.

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

Generelt, hvis nogen Ăžnsker en programmeringsopgave til et interview, sĂ„ spĂžrg bare om at skrive en parser til dette 🙂
Efter mange forsÞg pÄ at skrive en parser uden fejl, fandt jeg en del af den i terraform-koden, nemlig den mest essentielle del. Og alt fungerede tilsyneladende fint.

ForsĂžg tre
Terraform provider er binĂŠre filer, der indeholder kode med alle ressourcer og logik til at arbejde med cloud-API'er. Hver cloud har sin egen provider, og terraform kalder dem bare gennem sin RPC-protokol mellem to processer.
Nu besluttede jeg at interagere direkte med terraform providers gennem RPC-kald. Det viste sig at vÊre pÊnt og gav mig mulighed for at opgradere terraform providers til nyere versioner og fÄ nye funktioner uden at Êndre koden. Det viste sig ogsÄ, at ikke alle felter i tfstate behÞver at vÊre i tf, men hvordan finder man det ud? Man mÄ spÞrge provider om det. SÄ begyndte endnu en rekursiv proces med at samle regulÊre udtryk til at finde felter inde i tfstate pÄ alle niveauer.

I slutningen endte jeg med et nyttigt CLI-vĂŠrktĂžj, som har en fĂŠlles infrastruktur for alle terraform providers, og det er let at tilfĂžje nye. Desuden krĂŠver tilfĂžjelsen af ressourcer lidt kode. Plus forskellige funktioner som forbindelser mellem ressourcer. Der var selvfĂžlgelig mange forskellige problemer, som ikke kan beskrives alle sammen.
Jeg kaldte skabningen Terrafomer.

Finale

Vi har genereret 500–700.000 linjer tf + tfstate kode med Terraform i to forskellige skyder. Vi kunne tage legacy-ting og begynde at ĂŠndre dem ned gennem Terraform, som i bedste praksis for infrastruktur som kode. Det er ren magi, nĂ„r man tager en stor sky og fĂ„r den i form af Terraform-filer via en kommando. Derefter grep/replace/git og sĂ„ videre.

Jeg har renset og systematiseret det, og fÄet tilladelser. Udgivet pÄ GitHub til alle torsdag (02.05.19). github.com/GoogleCloudPlatform/terraformer
Jeg har allerede fÄet 600 stjerner, 2 pull requests for at tilfÞje support til OpenStack og Kubernetes. Gode anmeldelser. Generelt et nyttigt projekt for folk.
Jeg anbefaler det til alle, der Ăžnsker at begynde at arbejde med Terraform og ikke vil omskrive alt for dette.
Jeg ser frem til pull requests, issues, stjerner.

Demo
Terraformer — Infrastruktur til kode

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster