Terraformer - Ենթակառուցվածքի կոդ

Terraformer - Ենթակառուցվածքի կոդ
Ես կցանկանայի ձեզ պատմել նոր CLI գործիքի մասին, որը ես գրել եմ հին խնդիր լուծելու համար:

խնդիր

Terraform-ը վաղուց ստանդարտ է Devops/Cloud/IT համայնքում: Բանը շատ հարմար և օգտակար է ենթակառուցվածքի հետ առնչվելու համար որպես կոդ։ Terraform-ում կան բազմաթիվ հաճույքներ, ինչպես նաև բազմաթիվ պատառաքաղներ, սուր դանակներ և փոցխներ:
Terraform-ի հետ շատ հարմար է ստեղծել նոր բաներ և հետո դրանք կառավարել, փոխել կամ ջնջել։ Ի՞նչ պետք է անեն նրանք, ովքեր հսկայական ենթակառուցվածք ունեն ամպի մեջ և չեն ստեղծվել Terraform-ի միջոցով։ Ամբողջ ամպի վերագրանցումը և վերստեղծումը ինչ-որ չափով թանկ է և անվտանգ:
Ես հանդիպեցի այս խնդրին 2 աշխատանքում, ամենապարզ օրինակն այն է, երբ ցանկանում եք, որ ամեն ինչ լինի Git-ում տերրաֆորմ ֆայլերի տեսքով, բայց դուք ունեք 250+ դույլ, և դրանք ձեռքով գրելը շատ բան է:
Կա թողարկում 2014 թվականից terrafom-ում, որը փակվել է 2016 թվականին՝ այն հույսով, որ ներմուծում կլինի։

Ընդհանուր առմամբ, ամեն ինչ այնպես է, ինչպես նկարում է միայն աջից ձախ

Զգուշացումներ. Հեղինակը իր կյանքի կեսը չի ապրում Ռուսաստանում և քիչ է գրում ռուսերեն: Զգուշացեք ուղղագրական սխալներից.

Решения

1. AWS-ի համար կան պատրաստի և հին լուծումներ երկրաչափություն. Երբ ես փորձեցի դրա միջով անցնել իմ 250+ դույլերը, ես հասկացա, որ այնտեղ ամեն ինչ վատ է: AWS-ը վաղուց արդեն շատ նոր տարբերակներ է ներկայացնում, բայց տերրաֆորմինգը չգիտի դրանց մասին, և ընդհանրապես դա ռուբին է։ կաղապարը նոսր տեսք ունի. Երեկոյան ժամը 2-ից հետո ուղարկեցի Քաշեք հարցումը այնտեղ ավելի շատ հնարավորություններ ավելացնելու համար և հասկացա, որ նման լուծումն ամենևին էլ հարմար չէ:
Ինչպես է աշխատում terraforming-ը. այն վերցնում է տվյալներ AWS SDK-ից և ձևանմուշի միջոցով ստեղծում tf և tfstate:
Այստեղ 3 խնդիր կա.
1. Թարմացումներում միշտ ուշացում կլինի
2. tf ֆայլերը երբեմն կոտրված են դուրս գալիս
3. tfstate-ը հավաքվում է tf-ից առանձին և միշտ չէ, որ համընկնում է
Ընդհանրապես, դժվար է ստանալ մի արդյունք, որում «տերրաֆորմ պլանը» ասի, որ փոփոխություններ չկան

2. «terraform import»-ը ներկառուցված հրաման է terraform-ում: Ինչպես է դա աշխատում?
Դուք գրում եք դատարկ TF ֆայլ՝ ռեսուրսի անունով և տեսակով, այնուհետև գործարկում եք «terraform import»-ը և փոխանցում ռեսուրսի ID-ն: terraform-ը կապվում է մատակարարի հետ, ստանում է տվյալները և կազմում tfstate ֆայլ:
Այստեղ 3 խնդիր կա.
1. Մենք ստանում ենք միայն tfstate ֆայլ, իսկ tf-ը դատարկ է, դուք պետք է այն գրեք ձեռքով կամ փոխարկեք այն tfstate-ից:
2. Կարող է միաժամանակ աշխատել միայն մեկ ռեսուրսով և չի աջակցում բոլոր ռեսուրսներին: Իսկ ի՞նչ անեմ նորից 250+ դույլերով։
3. Դուք պետք է իմանաք ռեսուրսների ID-ն, այսինքն՝ դուք պետք է այն փաթեթավորեք կոդով, որը ստանում է ռեսուրսների ցանկը:
Ընդհանուր առմամբ, արդյունքը մասնակի է և լավ մասշտաբային չէ

Իմ որոշումը

պահանջները:
1. Ռեսուրսների համար tf և tfstate ֆայլեր ստեղծելու ունակություն: Օրինակ, ներբեռնեք բոլոր դույլերը/անվտանգության խումբը/բեռնվածության հավասարակշռիչը և այդ «terraform plan»-ը վերադարձրեց, որ փոփոխություններ չկան
2. Ձեզ անհրաժեշտ է 2 GCP + AWS ամպ
3. Գլոբալ լուծում, որը հեշտ է թարմացնել ամեն անգամ և ժամանակ չի վատնում յուրաքանչյուր ռեսուրսի վրա 3 օրվա աշխատանքի համար
4. Դարձրեք այն բաց կոդով – բոլորի մոտ նույն խնդիրն է

Go լեզուն է պատճառը, որ ես սիրում եմ այն, և այն ունի գրադարան HCL ֆայլեր ստեղծելու համար, որոնք օգտագործվում են terraform-ում + շատ կոդեր terraform-ում, որոնք կարող են օգտակար լինել:

Ճանապարհ

Առաջին փորձ
Ես սկսեցի պարզ տարբերակից. Պահանջվող ռեսուրսի համար SDK-ի միջոցով կապ հաստատել ամպի հետ և այն վերածել տերրաֆորմի դաշտերի: Փորձը անմիջապես մահացավ անվտանգության խմբի վրա, քանի որ ինձ դուր չեկավ, որ 1.5 օրը միայն անվտանգության խումբը փոխարկելու համար (և կան շատ ռեսուրսներ): Երկար ժամանակ, իսկ հետո դաշտերը կարելի է փոխել/ավելացնել

Երկրորդ փորձ
Նկարագրված գաղափարի հիման վրա այստեղ. Պարզապես վերցրեք և փոխարկեք tfstate-ը tf-ի: Բոլոր տվյալները կան, և դաշտերը նույնն են: Ինչպե՞ս ստանալ ամբողջական tfstate բազմաթիվ ռեսուրսների համար: Այստեղ օգնության եկավ «terraform refresh» հրամանը: terraform-ը վերցնում է tfstate-ի բոլոր ռեսուրսները և ID-ի միջոցով դուրս է հանում դրանց վերաբերյալ տվյալները և ամեն ինչ գրում tfstate-ում: Այսինքն՝ ստեղծեք դատարկ tfstate միայն անուններով և ID-ներով, գործարկեք «terraform refresh»-ը և այնուհետև մենք ստանում ենք ամբողջական tfstates: Ուռա՜
Հիմա եկեք կատարենք tfstate-ի tf փոխարկիչ գրելու ռեկուրսիվ պոռնոգրաֆիան: Նրանց համար, ովքեր երբեք չեն կարդացել tfstate, դա JSON է, բայց հատուկ:
Ահա դրա կարևոր մասի հատկանիշները

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

Կա:
1. id - տող
2. մետատվյալներ - 1 չափի զանգված և դրա մեջ դաշտերով օբյեկտ, որը նկարագրված է ստորև
3. սպեցիֆիկ - 1 չափսի հեշ և բանալի, արժեքը դրա մեջ
Մի խոսքով, զվարճալի ձևաչափ, ամեն ինչ կարող է լինել մի քանի մակարդակի խորը

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

Ընդհանրապես, եթե որևէ մեկը ծրագրավորման խնդիր է ուզում հարցազրույցի համար, պարզապես խնդրեք գրել վերլուծիչ այս առաջադրանքի համար :)
Առանց սխալների վերլուծիչ գրելու բազմաթիվ փորձերից հետո ես գտա դրա մի մասը terraform կոդում, և ամենակարևորը: Եվ թվում էր, թե ամեն ինչ լավ էր աշխատում

Փորձ երեք
terraform պրովայդերները երկուական սարքեր են, որոնք պարունակում են կոդ՝ ամպային API-ի հետ աշխատելու բոլոր ռեսուրսներով և տրամաբանությամբ: Յուրաքանչյուր ամպ ունի իր սեփական մատակարարը, և ինքը՝ terraform-ը, դրանք կանչում է միայն իր RPC արձանագրության միջոցով երկու գործընթացների միջև:
Այժմ ես որոշեցի կապվել terraform պրովայդերների հետ անմիջապես RPC զանգերի միջոցով: Գեղեցիկ ստացվեց և հնարավորություն տվեց փոխել տերրաֆորմ պրովայդերներին ավելի նորերի և ստանալ նոր հնարավորություններ՝ առանց ծածկագիրը փոխելու։ Պարզվում է նաև, որ tfstate-ում ոչ բոլոր դաշտերը պետք է լինեն tf-ով, բայց ինչպե՞ս կարող ես պարզել: Պարզապես հարցրեք ձեր մատակարարին այս մասին: Այնուհետև սկսվեց կանոնավոր արտահայտությունների հավաքման հերթական ռեկուրսիվ պոռնոգրաֆիան, որոնելով դաշտերը tfstate-ի ներսում բոլոր մակարդակներում խորությամբ:

Ի վերջո, մենք ստացանք օգտակար CLI գործիք, որն ունի ընդհանուր ենթակառուցվածք բոլոր տերրաֆորմ պրովայդերների համար, և դուք հեշտությամբ կարող եք ավելացնել նորը: Բացի այդ, ռեսուրսների ավելացումը քիչ կոդ է պահանջում: Գումարած բոլոր տեսակի բարիքները, ինչպիսիք են ռեսուրսների միջև կապերը: Իհարկե, կային բազմաթիվ տարբեր խնդիրներ, որոնք հնարավոր չէ բոլորը նկարագրել:
Ես կենդանուն անվանել եմ Terrafomer:

Վերջնական

Terrafomer-ի միջոցով մենք երկու ամպերից գեներացրել ենք tf + tfstate կոդի 500-700 հազար տող: Մենք կարողացանք վերցնել ժառանգական իրերը և սկսել դիպչել դրանց միայն տերրաֆորմի միջոցով, ինչպես լավագույն ենթակառուցվածքում, ինչպես կոդերի գաղափարները: Պարզապես կախարդական է, երբ վերցնում ես հսկայական ամպ և ստանում այն ​​թիմի միջոցով՝ տերրաֆորմ աշխատանքային ֆայլերի տեսքով: Եվ հետո grep/replace/git և այլն:

Ես սանրեցի և կարգի բերեցի, թույլտվություն ստացա։ Թողարկվել է GitHub-ում բոլորի համար հինգշաբթի (02.05.19/XNUMX/XNUMX): github.com/GoogleCloudPlatform/terraformer
Արդեն ստացել է 600 աստղ, 2 pull հարցում՝ openstack-ի և kubernetes-ի համար աջակցություն ավելացնելու համար: Լավ արձագանք: Ընդհանուր առմամբ, նախագիծը օգտակար է մարդկանց համար
Ես խորհուրդ եմ տալիս բոլորին, ովքեր ցանկանում են սկսել աշխատել Terraform-ի հետ և ամեն ինչ չվերագրել դրա համար։
Ուրախ կլինեմ խնդրանքներ, հարցեր, աստղեր քաշել:

Դեմո
Terraformer - Ենթակառուցվածքի կոդ

Source: www.habr.com

Добавить комментарий