Terraformer - Enfrastrikti Pou Kòd

Terraformer - Enfrastrikti Pou Kòd
Mwen ta renmen pale w sou nouvo zouti CLI mwen te ekri pou rezoud yon ansyen pwoblèm.

pwoblèm

Terraform te yon estanda depi lontan nan kominote Devops/Cloud/IT. Bagay la trè pratik ak itil pou fè fas ak enfrastrikti kòm kòd. Gen anpil plezi nan Terraform ak anpil fouchèt, kouto byen file ak rato.
Avèk Terraform li trè pratik yo kreye nouvo bagay ak Lè sa a, jere, chanje oswa efase yo. Kisa moun ki gen yon gwo enfrastrikti nan nwaj la epi ki pa kreye atravè Terraform ta dwe fè? Reekri ak re-kreye tout nwaj la se yon jan kanmenm chè ak danjere.
Mwen te rankontre pwoblèm sa a nan 2 travay, egzanp ki pi senp se lè ou vle tout bagay yo dwe nan Git nan fòm nan fichye terraform, men ou gen 250 + bokit epi li nan anpil yo ekri yo nan terraform alamen.
Gen pwoblèm depi 2014 nan terrafom ki te fèmen nan 2016 ak espwa ke pral gen enpòte.

An jeneral, tout bagay se tankou nan foto a sèlman de dwat a goch

Avètisman: Otè a pa rete nan Larisi pou mwatye lavi l ', li ekri ti kras nan Larisi. Pran prekosyon nou ak erè òtograf.

Решения

1. Gen yon solisyon pare-fè ak ansyen pou AWS terraforming. Lè mwen te eseye jwenn plis pase 250 bokit mwen yo nan li, mwen reyalize ke tout bagay te move la. AWS te entwodwi yon anpil nan nouvo opsyon, men terraforming pa konnen sou yo ak an jeneral li nan Ruby. modèl la sanble rar. Apre 2è nan aswè mwen voye Rale demann yo ajoute plis karakteristik la ak reyalize ke tankou yon solisyon se pa apwopriye nan tout.
Ki jan terraforming travay: li pran done ki soti nan AWS SDK epi jenere tf ak tfstate atravè yon modèl.
Gen 3 pwoblèm isit la:
1. Ap toujou gen yon lag nan dènye nouvèl yo
2. fichye tf pafwa soti kase
3. tfstate kolekte separeman de tf epi li pa toujou konvèje
An jeneral, li difisil pou jwenn yon rezilta kote `terraform plan` di ke pa gen okenn chanjman

2. `Terraform import` se yon kòmandman entegre nan terraform. Ki jan li travay?
Ou ekri yon dosye TF vid ak non an ak kalite resous, Lè sa a, kouri `Terraform enpòte` epi pase ID resous la. terraform kontakte founisè a, resevwa done yo epi fè yon dosye tfstate.
Gen 3 pwoblèm isit la:
1. Nou sèlman jwenn yon dosye tfstate, ak tf la vid, ou bezwen ekri li manyèlman oswa konvèti li soti nan tfstate.
2. Ka sèlman travay ak yon sèl resous alafwa epi li pa sipòte tout resous yo. Ak kisa mwen ta dwe fè ankò ak 250+ bokit?
3. Ou bezwen konnen ID resous yo - sa vle di, ou bezwen vlope li nan kòd ki jwenn lis resous yo.
An jeneral, rezilta a se pasyèl epi li pa echèl byen

Desizyon mwen an

Kondisyon:
1. Kapasite pou kreye dosye tf ak tfstate pou resous yo. Pa egzanp, telechaje tout bokit/gwoup sekirite/chaj balanse e ke `plan terraform` te retounen ke pa gen okenn chanjman.
2. Ou bezwen 2 nwaj GCP + AWS
3. Solisyon mondyal ki fasil pou mete ajou chak fwa epi ki pa pèdi tan sou chak resous pou 3 jou travay
4. fè l' louvri sous - tout moun gen menm pwoblèm

Lang Go se poukisa mwen renmen li, epi li gen yon bibliyotèk pou kreye dosye HCL ki itilize nan terraform + anpil kòd nan terraform ki ka itil.

Chemen

Premye tantativ
Mwen te kòmanse ak yon vèsyon senp. Kontakte nwaj la atravè SDK pou resous ki nesesè yo epi konvèti li an jaden pou terraform. Tantativ la te mouri imedyatman sou gwoup sekirite a paske mwen pa t renmen jou 1.5 pou konvèti sèlman gwoup sekirite a (e gen anpil resous). Pou yon tan long ak Lè sa a, jaden yo ka chanje / ajoute

Dezyèm tantativ
Baze sou lide ki dekri a isit la. Jis pran ak konvèti tfstate an tf. Tout done yo la ak jaden yo se menm bagay la. Ki jan yo jwenn plen tfstate pou anpil resous ?? Sa a se kote lòd `terraform rafrechir` te vin pote sekou. terraform pran tout resous nan tfstate epi, pa ID, rale done sou yo epi ekri tout bagay nan tfstate. Sa vle di, kreye yon tfstate vid ak sèlman non ak ID, kouri `terraform refresh` epi answit nou jwenn tfstates konplè. Houra!
Koulye a, ann fè pònografi rekursif nan ekri yon konvètisè pou tfstate nan tf. Pou moun ki pa janm li tfstate, li se JSON, men espesyal.
Isit la se atribi pati enpòtan li yo

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

Genyen:
1. id - fisèl
2. metadata - yon etalaj nan gwosè 1 ak nan li yon objè ak jaden ki dekri anba a
3. spec - hash nan gwosè 1 ak kle, valè nan li
Nan ti bout tan, yon fòma plezi, tout bagay ka plizyè nivo gwo twou san fon

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

An jeneral, si yon moun vle yon pwoblèm pwogramasyon pou yon entèvyou, jis mande yo ekri yon analizeur pou travay sa a :)
Apre anpil tantativ pou ekri yon analizeur san pinèz, mwen te jwenn yon pati nan kòd terraform la, ak pati ki pi enpòtan an. Ak tout bagay te sanble travay byen

Eseye twa
Founisè terraform yo se binè ki gen kòd ak tout resous ak lojik pou travay ak API nwaj la. Chak nwaj gen founisè pwòp li yo ak terraform tèt li sèlman rele yo atravè pwotokòl RPC li yo ant de pwosesis.
Koulye a, mwen deside kontakte founisè terraform dirèkteman atravè apèl RPC. Li te tounen trè byen e li te fè li posib pou chanje founisè terraform nan pi nouvo ak jwenn nouvo karakteristik san yo pa chanje kòd la. Li sanble tou ke se pa tout jaden nan tfstate yo ta dwe nan tf, men ki jan ou ka jwenn? Jis mande founisè w la sou sa. Lè sa a, yon lòt pònografi rekursif nan rasanble ekspresyon regilye yo te kòmanse, chèche jaden andedan tfstate nan tout nivo an pwofondè.

Nan fen a, nou te resevwa yon zouti CLI itil ki gen yon enfrastrikti komen pou tout founisè terraform epi ou ka fasilman ajoute yon nouvo. Epitou, ajoute resous pran ti kòd. Plis tout kalite kado tankou koneksyon ant resous yo. Natirèlman, te gen anpil pwoblèm diferan ki pa ka dekri tout.
Mwen te rele bèt la Terrafomer.

Final

Sèvi ak Terrafomer, nou te pwodwi 500-700 mil liy nan kòd tf + tfstate soti nan de nwaj. Nou te kapab pran bagay eritaj epi kòmanse manyen yo sèlman atravè terraform, tankou nan pi bon enfrastrikti kòm lide kòd. Se jis majik lè ou pran yon gwo nwaj epi resevwa li atravè yon ekip nan fòm dosye travayè terraform. Lè sa a, grep / ranplase / git ak sou sa.

Mwen penyen li epi mete l nan lòd, mwen te resevwa pèmisyon. Lage sou GitHub pou tout moun nan Jedi (02.05.19/XNUMX/XNUMX). github.com/GoogleCloudPlatform/terraformer
Deja resevwa 600 zetwal, 2 demann rale pou ajoute sipò pou openstack ak kubernetes. Bon fidbak. An jeneral, pwojè a itil pou moun
Mwen konseye tout moun ki vle kòmanse travay ak Terraform epi yo pa reekri tout bagay pou sa.
Mwen pral kontan rale demann, pwoblèm, zetwal.

Dine
Terraformer - Enfrastrikti Pou Kòd

Sous: www.habr.com

Add nouvo kòmantè