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ò
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
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
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).
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
Source: www.habr.com