Terraformer - Infrastruktur att koda

Terraformer - Infrastruktur att koda
Jag skulle vilja berÀtta om det nya CLI-verktyget som jag skrev för att lösa ett gammalt problem.

problem

Terraform har lÀnge varit en standard inom Devops/Cloud/IT-communityt. Saken Àr vÀldigt bekvÀm och anvÀndbar för att hantera infrastruktur som kod. Det finns mÄnga lÀckerheter i Terraform liksom mÄnga gafflar, vassa knivar och krattor.
Med Terraform Àr det vÀldigt bekvÀmt att skapa nya saker och sedan hantera, Àndra eller ta bort dem. Vad ska de som har en enorm infrastruktur i molnet och inte skapat genom Terraform göra? Att skriva om och Äterskapa hela molnet Àr pÄ nÄgot sÀtt dyrt och osÀkert.
Jag stötte pÄ det hÀr problemet vid 2 jobb, det enklaste exemplet Àr nÀr du vill att allt ska finnas i Git i form av terraform-filer, men du har 250+ hinkar och det Àr mycket att skriva dem i terraform för hand.
Det finns frÄga sedan 2014 i terrafom som stÀngdes 2016 med hopp om att det ska bli import.

I allmÀnhet Àr allt som pÄ bilden bara frÄn höger till vÀnster

Varningar: Författaren bor inte i Ryssland pÄ halva sitt liv och skriver lite pÄ ryska. Se upp för stavfel.

Đ Đ”ŃˆĐ”ĐœĐžŃ

1. Det finns fÀrdiga och gamla lösningar för AWS terraformning. NÀr jag försökte fÄ igenom mina 250+ hinkar insÄg jag att allt var dÄligt dÀr. AWS har lÀnge introducerat mÄnga nya alternativ, men terraforming kÀnner inte till dem och i allmÀnhet Àr det rubin mallen ser gles ut. Efter 2 pÄ kvÀllen skickade jag Dra begÀran att lÀgga till fler funktioner dÀr och insÄg att en sÄdan lösning inte alls Àr lÀmplig.
Hur terraforming fungerar: det tar data frÄn AWS SDK och genererar tf och tfstate genom en mall.
Det finns 3 problem hÀr:
1. Det kommer alltid att finnas en fördröjning i uppdateringar
2. tf-filer kommer ibland ut trasiga
3. tftillstÄnd samlas in separat frÄn tf och konvergerar inte alltid
Generellt Àr det svÄrt att fÄ ett resultat dÀr `terraformplan` sÀger att det inte Àr nÄgra förÀndringar

2. `terraform import` Àr ett inbyggt kommando i terraform. Hur fungerar det?
Du skriver en tom TF-fil med namn och typ av resurs, kör sedan `terraform import` och skickar resurs-ID:t. terraform kontaktar leverantören, tar emot data och gör en tfstate-fil.
Det finns 3 problem hÀr:
1. Vi fÄr bara en tfstate-fil, och tf-filen Àr tom, du mÄste skriva den manuellt eller konvertera den frÄn tfstate
2. Kan bara arbeta med en resurs Ät gÄngen och stöder inte alla resurser. Och vad ska jag göra igen med 250+ hinkar?
3. Du mÄste kÀnna till resursernas ID - det vill sÀga du mÄste slÄ in den i kod som fÄr listan över resurser
I allmÀnhet Àr resultatet partiellt och skalas inte bra

Mitt val

krav:
1. Möjlighet att skapa tf- och tfstate-filer för resurser. Till exempel, ladda ner alla hinkar/sÀkerhetsgrupp/lastbalanserare och att "terraform plan" returnerade att det inte finns nÄgra Àndringar
2. Du behöver 2 GCP + AWS-moln
3. Global lösning som Àr enkel att uppdatera varje gÄng och som inte slösar tid pÄ varje resurs under 3 dagars arbete
4. Gör det till öppen kĂ€llkod – alla har samma problem

Go-sprÄket Àr dÀrför jag Àlskar det, och det har ett bibliotek för att skapa HCL-filer som anvÀnds i terraform + mycket kod i terraform som kan vara anvÀndbart

Bana

Första försöket
Jag började med en enkel version. Kontakta molnet via SDK för den nödvÀndiga resursen och omvandla den till fÀlt för terraform. Försöket dog omedelbart pÄ sÀkerhetsgruppen eftersom jag inte gillade de 1.5 dagarna för att bara konvertera sÀkerhetsgruppen (och det finns mÄnga resurser). Under lÄng tid och sedan kan fÀlt Àndras/lÀggas till

Andra försöket
Baserat pÄ idén som beskrivs hÀr. Ta bara och konvertera tfstate till tf. All data finns dÀr och fÀlten Àr desamma. Hur fÄr man full tfstate för mÄnga resurser?? Det var hÀr kommandot `terraform refresh` kom till undsÀttning. terraform tar alla resurser i tfstate och, med ID, drar ut data om dem och skriver allt till tfstate. Det vill sÀga skapa en tom tfstate med bara namn och ID, kör `terraform refresh` och sedan fÄr vi fulla tfstates. Hurra!
LÄt oss nu göra den rekursiva pornografin att skriva en omvandlare för tfstate till tf. För dem som aldrig har lÀst tfstate Àr det JSON, men speciellt.
HÀr Àr dess viktiga delegenskaper

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

Det finns:
1. id - strÀng
2. metadata - en array av storlek 1 och i den ett objekt med fÀlt som beskrivs nedan
3. spec - hash av storlek 1 och nyckel, vÀrde i den
Kort sagt, ett roligt format, allt kan vara flera nivÄer djupt

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

I allmÀnhet, om nÄgon vill ha ett programmeringsproblem för en intervju, be dem bara att skriva en parser för denna uppgift :)
Efter mÄnga försök att skriva en parser utan buggar, hittade jag en del av den i terraform-koden, och den viktigaste delen. Och allt verkade fungera bra

Försök tre
terraform-leverantörer Àr binÀrer som innehÄller kod med alla resurser och logik för att arbeta med molnets API. Varje moln har sin egen leverantör och terraform sjÀlv anropar dem bara genom sitt RPC-protokoll mellan tvÄ processer.
Nu bestÀmde jag mig för att kontakta terraform-leverantörer direkt via RPC-samtal. Det blev vackert och gjorde det möjligt att byta terraform-leverantörer till nyare och fÄ nya funktioner utan att Àndra koden. Det visar sig ocksÄ att inte alla fÀlt i tfstate borde vara i tf, men hur kan man ta reda pÄ det? FrÄga bara din leverantör om detta. Sedan började en annan rekursiv pornografi av att sÀtta ihop reguljÀra uttryck, och sökte efter fÀlt i tfstate pÄ alla nivÄer pÄ djupet.

Till slut fick vi ett anvÀndbart CLI-verktyg som har en gemensam infrastruktur för alla terraform-leverantörer och du kan enkelt lÀgga till en ny. Att lÀgga till resurser krÀver dessutom lite kod. Plus alla möjliga godsaker som kopplingar mellan resurser. Naturligtvis fanns det mÄnga olika problem som inte kan beskrivas alla.
Jag döpte djuret till Terrafomer.

finale

Med Terrafomer genererade vi 500-700 tusen rader med tf + tfstate-kod frÄn tvÄ moln. Vi kunde ta Àldre saker och börja röra dem endast genom terraform, som i den bÀsta infrastrukturen som kodidéer. Det Àr bara magi nÀr du tar ett stort moln och tar emot det genom ett team i form av terraform-arbetarfiler. Och sedan grep/replace/git och sÄ vidare.

Jag kammade ut den och gjorde i ordning den, fick tillstÄnd. SlÀppt pÄ GitHub för alla pÄ torsdag (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Har redan fÄtt 600 stjÀrnor, 2 pull-förfrÄgningar för att lÀgga till stöd för openstack och kubernetes. Bra feedback. I allmÀnhet Àr projektet anvÀndbart för mÀnniskor
Jag rÄder alla som vill att börja arbeta med Terraform och inte skriva om allt för detta.
Jag kommer gÀrna att dra förfrÄgningar, frÄgor, stjÀrnor.

Đ”Đ”ĐŒĐŸ
Terraformer - Infrastruktur att koda

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster