Terraformer - Infrastruttura à Code

Terraformer - Infrastruttura à Code
Vogliu parlà di u novu strumentu CLI chì aghju scrittu per risolve un vechju prublema.

prublemu

Terraform hè statu longu un standard in a cumunità Devops / Cloud / IT. A cosa hè assai còmuda è utile per trattà l'infrastruttura cum'è codice. Ci sò parechje delizie in Terraform, è ancu assai forchette, coltelli affilati è rastrelli.
Cù Terraform hè assai cunvenutu per creà cose novi è poi gestisce, cambià o sguassate. Chì duveranu fà quelli chì anu una grande infrastruttura in u nuvulu è micca creati per Terraform? A riscrittura è a ricreazione di tuttu u nuvulu hè in qualchì modu caru è micca sicuru.
Aghju scontru stu prublema in 2 impieghi, l'esempiu più simplice hè quandu vulete chì tuttu sia in Git in forma di schedarii di terraform, ma avete 250+ buckets è hè assai di scrive in terraform cù a manu.
Ci sò cuntruversa dapoi u 2014 in terrafom chì hè stata chjusa in u 2016 cù a speranza chì ci sarà impurtazione.

In generale, tuttu hè cum'è in a stampa solu da diritta à manca

Avvertimenti: L'autore ùn vive micca in Russia per a mità di a so vita è scrive pocu in russo. Attenti à i sbagli di ortografia.

Soluzioni

1. Ci hè una suluzione pronta è vechja per AWS terraforming. Quandu aghju pruvatu à passà i mo 250+ buckets attraversu, aghju capitu chì tuttu era male. AWS hà longu introduttu assai novi opzioni, ma a terraformazione ùn ne cunnosci micca è in generale hè rubina. u mudellu pare sparse. Dopu à 2 in a sera aghju mandatu Tire a dumanda per aghjunghje più funziunalità ci è capitu chì una tale suluzione ùn hè micca adattatu à tutti.
Cumu funziona a terraformazione: piglia dati da AWS SDK è genera tf è tfstate attraversu un mudellu.
Ci sò 3 prublemi quì:
1. Ci sarà sempre un lag in l'aghjurnamenti
2. i schedari tf à volte esce ruttu
3. tfstate hè cullatu separatamente da tf è ùn cunverge micca sempre
In generale, hè difficiule d'ottene un risultatu in quale "pianu di terraform" dice chì ùn ci sò micca cambiamenti

2. `terraform import` hè un cumandamentu integratu in terraform. Cumu travaglia ?
Scrivite un schedariu TF viotu cù u nome è u tipu di risorsa, poi eseguite "terraform import" è passa l'ID di risorsa. terraform cuntatta u fornitore, riceve i dati è face un schedariu tfstate.
Ci sò 3 prublemi quì:
1. Avemu solu ottene un schedariu tfstate, è u tf hè viotu, avete bisognu di scrive manualmente o cunvertisce da tfstate
2. Pò travaglià solu cù una risorsa à tempu è ùn sustene micca tutti i risorse. È chì deve fà di novu cù 250+ buckets?
3. Avete bisognu di sapè l'ID di e risorse - chì hè, avete bisognu à imballà in codice chì riceve a lista di risorse.
In generale, u risultatu hè parziale è ùn scala micca bè

A mo decisione

Rèducts:
1. Capacità di creà schedarii tf è tfstate per risorse. Per esempiu, scaricate tutti i buckets / security group / load balancer è quellu "pianu di terraform" hà tornatu chì ùn ci sò micca cambiamenti
2. Avete bisognu di 2 nuvole GCP + AWS
3. Soluzione globale chì hè faciule d'aghjurnà ogni volta è ùn perde micca u tempu nantu à ogni risorsa per 3 ghjorni di travagliu
4. Make it Open Source - ognunu hà u listessu prublema

A lingua Go hè per quessa chì mi piace, è hà una biblioteca per creà schedarii HCL chì hè utilizatu in terraform + assai codice in terraform chì pò esse utile

chjassu

Atempti prima
Aghju cuminciatu cù una versione simplice. Cuntattate u nuvulu via u SDK per a risorsa necessaria è cunvertisce in campi per terraform. U tentativu morse subitu nantu à u gruppu di sicurità perchè ùn aghju micca piace à i ghjorni 1.5 per cunvertisce solu u gruppu di sicurità (è ci sò assai risorse). Per un bellu pezzu è dopu i campi ponu esse cambiati / aghjuntu

Second tentativu
Basatu nantu à l'idea descritta ccà. Basta à piglià è cunvertisce tfstate à tf. Tutti i dati sò quì è i campi sò listessi. Cumu uttene u tfstate cumpletu per parechje risorse ?? Hè quì chì u cumandamentu "terraform refresh" hè ghjuntu in salvezza. terraform piglia tutte e risorse in tfstate è, per ID, tira e dati nantu à elli è scrive tuttu in tfstate. Vale à dì, crea un tfstate viotu cù solu nomi è ID, eseguite `terraform refresh` è dopu avemu tfstates pienu. Eura!
Avà facemu a pornografia recursiva di scrive un cunvertitore per tfstate à tf. Per quelli chì ùn anu mai lettu tfstate, hè JSON, ma speciale.
Eccu i so attributi parte impurtante

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

Ci hè:
1. id - stringa
2. metadata - un array di grandezza 1 è in questu un ughjettu cù campi chì hè descrittu sottu
3. spec - hash of size 1 and key, value in it
In corta, un formatu divertente, tuttu pò esse in parechji livelli in profondità

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

In generale, se qualchissia vole un prublema di prugrammazione per una entrevista, basta à dumandà à scrive un parser per questu compitu :)
Dopu parechji tentativi di scrive un parser senza bugs, aghju trovu una parte in u codice terraform, è a parte più impurtante. È tuttu paria di travaglià bè

Pruvate trè
I fornituri di terraform sò binari chì cuntenenu codice cù tutte e risorse è a logica per travaglià cù l'API di nuvola. Ogni nuvola hà u so propiu fornitore è terraform stessu li chjama solu per mezu di u so protokollu RPC trà dui prucessi.
Avà decisu di cuntattà i fornituri di terraform direttamente via chjamate RPC. Hè stata bella è hà permessu di cambià i fornituri di terraform à i più novi è uttene novi funziunalità senza cambià u codice. Ci hè ancu chì micca tutti i campi in tfstate deve esse in tf, ma cumu pudete scopre? Basta à dumandà à u vostru duttore nantu à questu. Allora hà cuminciatu un'altra pornografia recursiva di assemblea espressioni regulari, cercandu campi in tfstate à tutti i livelli in prufundità.

À a fine, avemu un strumentu CLI utile chì hà una infrastruttura cumuna per tutti i fornituri di terraform è pudete facilmente aghjunghje una nova. Inoltre, aghjunghje risorse piglia pocu codice. Plus ogni tipu di boni cum'è e cunnessione trà e risorse. Di sicuru, ci sò parechje prublemi diffirenti chì ùn ponu micca esse discrittu tutti.
Aghju chjamatu l'animali Terrafomer.

Finale

Utilizendu Terrafomer, avemu generatu 500-700 mila linee di codice tf + tfstate da dui nuvuli. Pudemu piglià e cose legatu è cumincià à toccu solu per terraform, cum'è in a megliu infrastruttura cum'è idee di codice. Hè solu magia quandu pigliate un nuvulu enormu è ricevelu attraversu una squadra in forma di schedarii di travagliu di terraform. E poi grep/replace/git è cusì.

L'aghju pettinatu è messu in ordine, aghju avutu permessu. Rilasciatu in GitHub per tutti u ghjovi (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Dighjà ricevutu 600 stelle, 2 pull requests per aghjunghje supportu per openstack è kubernetes. Bon feedback. In generale, u prugettu hè utile à e persone
Cunsigliu à tutti quelli chì volenu cumincià à travaglià cù Terraform è micca riscrive tuttu per questu.
Seraghju cuntentu di tirà dumande, prublemi, stelle.

Demo
Terraformer - Infrastruttura à Code

Source: www.habr.com

Add a comment