Terraformer - Инфрасохтор ба Кодекс

Terraformer - Инфрасохтор ба Кодекс
Ман мехоҳам ба шумо дар бораи асбоби нави CLI, ки ман барои ҳалли мушкилоти кӯҳна навиштаам, нақл кунам.

проблема

Terraform кайҳо боз стандарт дар ҷомеаи Devops/Cloud/IT буд. Ин чиз барои кор бо инфрасохтор ҳамчун код хеле қулай ва муфид аст. Дар Terraform лаззатҳои зиёде мавҷуданд, инчунин чангалҳо, кордҳои тез ва мораҳо.
Бо Terraform сохтани чизҳои нав ва сипас идора, тағир додан ё нест кардани онҳо хеле қулай аст. Онҳое, ки дар абр инфрасохтори азим доранд ва тавассути Terraform офарида нашудаанд, бояд чӣ кор кунанд? Навиштан ва аз нав сохтани тамоми абр то андозае гарон ва хатарнок аст.
Ман бо ин мушкилот дар 2 кор дучор шудам, мисоли оддитарин он аст, ки шумо мехоҳед ҳама чиз дар Git дар шакли файлҳои терраформӣ бошад, аммо шумо 250+ сатил доред ва онҳоро дар терраформ дастӣ навиштан бисёр аст.
вуҷуд доранд чоп аз соли 2014 дар террафом, ки соли 2016 бо умеди воридот баста шуд.

Умуман, ҳама чиз дар расм танҳо аз рост ба чап аст

Огоҳӣ: Муаллиф ним умр дар Русия зиндагӣ намекунад ва ба забони русӣ кам менависад. Аз хатогиҳои имлоӣ эҳтиёт шавед.

Қарорҳо

1. Як ҳалли тайёр ва кӯҳна барои AWS вуҷуд дорад терраформинг. Вақте ки ман кӯшиш кардам, ки 250+ сатиламро аз он гузаронам, ман фаҳмидам, ки дар он ҷо ҳама чиз бад аст. AWS кайҳо боз бисёр имконоти навро муаррифӣ мекунад, аммо терраформинг дар бораи онҳо намедонад ва дар маҷмӯъ ин ёқут аст шаблон камранг менамояд. Пас аз 2 шаб ман фиристодам Дархостро кашед ба он ҷо хусусиятҳои бештар илова кунед ва фаҳмид, ки чунин ҳалли ҳама мувофиқ нест.
Чӣ тавр терраформинг кор мекунад: он маълумотро аз 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 барои захираҳо. Масалан, ҳамаи сатилҳо/гурӯҳи амниятӣ/тавозуни сарборро зеркашӣ кунед ва он «нақшаи терраформӣ» баргардонид, ки ҳеҷ гуна тағирот вуҷуд надорад
2. Ба шумо 2 абрҳои GCP + AWS лозим аст
3. Ҳалли глобалӣ, ки ҳар дафъа навсозӣ кардан осон аст ва барои ҳар як манбаъ барои 3 рӯзи корӣ вақтро беҳуда сарф намекунад
4. Онро Сарчашмаи кушода созед - ҳама як мушкилот доранд

Забони Go ин аст, ки чаро ман онро дӯст медорам ва он дорои китобхона барои эҷоди файлҳои HCL аст, ки дар terraform истифода мешавад + рамзи зиёде дар terraform, ки метавонад муфид бошад

роҳ

Кӯшиши аввал
Ман бо версияи оддӣ оғоз кардам. Тамос бо абр тавассути SDK барои манбаи зарурӣ ва табдил додани он ба майдонҳои терраформ. Кӯшиш фавран дар гурӯҳи амниятӣ мурд, зеро ба ман 1.5 рӯз барои табдил додани танҳо гурӯҳи амниятӣ маъқул набуд (ва захираҳои зиёде мавҷуданд). Барои муддати тӯлонӣ ва сипас майдонҳоро тағир додан/илова кардан мумкин аст

Кӯшиши дуюм
Дар асоси идеяи тавсифшуда дар ин ҷо. Танҳо tfstate -ро ба tf гиред ва табдил диҳед. Ҳама маълумотҳо мавҷуданд ва майдонҳо якхелаанд. Чӣ тавр ба даст овардани tfstate пурра барои захираҳои зиёд?? Дар ин ҷо фармони 'refresh terraform' ба наҷот омад. terraform тамоми захираҳоро дар tfstate мегирад ва аз рӯи ID маълумотро дар бораи онҳо берун мекунад ва ҳама чизро ба tfstate менависад. Яъне, tfstate-и холӣ бо танҳо номҳо ва идентификаторҳо эҷод кунед, `terraform refresh'-ро иҷро кунед ва он гоҳ мо tfstate-ҳои пурро мегирем. Ура!
Акнун биёед порнографияи рекурсивии навиштани табдилдиҳанда барои 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. spec - шудаи андозаи 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 дуӣ мебошанд, ки дорои код бо тамоми захираҳо ва мантиқ барои кор бо абри API мебошанд. Ҳар як абр провайдери худро дорад ва худи terraform онҳоро танҳо тавассути протоколи RPC байни ду раванд даъват мекунад.
Ҳоло ман тасмим гирифтам, ки мустақиман тавассути зангҳои RPC бо провайдерҳои терраформ тамос гирам. Ин хеле зебо баромад ва имкон дод, ки провайдерҳои терраформиро ба провайдерҳои нав иваз кунанд ва бидуни тағир додани код хусусиятҳои нав ба даст оранд. Инчунин маълум мешавад, ки на ҳама майдонҳо дар tfstate бояд дар tf бошанд, аммо шумо чӣ гуна фаҳмида метавонед? Танҳо аз провайдери худ дар ин бора пурсед. Пас аз он боз як порнографияи рекурсивии ҷамъ кардани ибораҳои муқаррарӣ оғоз ёфт, ки майдонҳоро дар дохили tfstate дар ҳама сатҳҳо амиқ ҷустуҷӯ мекард.

Дар ниҳоят, мо як абзори муфиди CLI гирифтем, ки инфрасохтори умумӣ барои ҳама провайдерҳои terraform дорад ва шумо метавонед ба осонӣ як нав илова кунед. Инчунин, илова кардани захираҳо рамзи камро талаб мекунад. Илова бар ин, ҳама гуна неъматҳо, аз қабили робитаҳо байни захираҳо. Албатта, мушкилоти зиёде буданд, ки онҳоро тавсиф кардан ғайриимкон аст.
Ман ҳайвонро Террафомер ном гузоштам.

Натиҷа

Бо истифода аз Terrafomer, мо аз ду абр 500-700 ҳазор хати рамзи tf + tfstate тавлид кардем. Мо тавонистем чизҳои меросиро ба даст орем ва ба онҳо танҳо тавассути терраформ, ба монанди инфрасохтори беҳтарин ҳамчун идеяҳои код даст занем. Вақте ки шумо абри азимро мегиред ва онро тавассути як гурӯҳ дар шакли файлҳои коргари терраформӣ қабул мекунед, ин танҳо ҷодугарист. Ва он гоҳ grep/replace/git ва ғайра.

Шона карда, ба тартиб андохтам, ичозат гирифтам. Дар GitHub барои ҳама рӯзи панҷшанбе (02.05.19/XNUMX/XNUMX) бароварда шуд. github.com/GoogleCloudPlatform/terraformer
Аллакай 600 ситора, 2 дархост барои илова кардани дастгирӣ барои openstack ва kubernetes гирифта шудааст. Бозгашти хуб. Умуман, лоиха барои одамон муфид аст
Ман ба ҳар касе, ки мехоҳад бо Terraform кор карданро оғоз кунад, маслиҳат медиҳам ва барои ин ҳама чизро аз нав нанависед.
Ман шодам, ки дархостҳо, масъалаҳо, ситораҳоро ҷалб кунам.

Намоиш
Terraformer - Инфрасохтор ба Кодекс

Манбаъ: will.com

Илова Эзоҳ