Терраформер - Инфраструктура за кодирање

Терраформер - Инфраструктура за кодирање
Желео бих да вам кажем о новом ЦЛИ алату који сам написао да решим стари проблем.

проблем

Терраформ је дуго био стандард у Девопс/Цлоуд/ИТ заједници. Ствар је веома згодна и корисна за бављење инфраструктуром као кодом. У Терраформу има много ужитака, као и много виљушки, оштрих ножева и грабуља.
Са Терраформом је веома згодно креирати нове ствари, а затим их управљати, мењати или брисати. Шта да раде они који имају огромну инфраструктуру у облаку, а не креирану кроз Терраформ? Поновно писање и поновно креирање читавог облака је некако скупо и несигурно.
Наишао сам на овај проблем на 2 посла, најједноставнији пример је када желите да све буде у Гиту у облику терраформ фајлова, али имате 250+ буцкетс и много је да их у терраформу пишете ручно.
Ту је емисија од 2014. године у террафому који је затворен 2016. године са надом да ће бити увоза.

Генерално, све је као на слици само с десна на лево

Упозорења: Аутор не живи у Русији пола живота и мало пише на руском. Чувајте се правописних грешака.

Решења

1. Постоји готово и старо решење за АВС терраформирање. Када сам покушао да прођем кроз то својих 250+ канти, схватио сам да је тамо све лоше. АВС већ дуго уводи много нових опција, али терраформинг не зна за њих и генерално је рубин шаблон изгледа ретко. Послао сам после 2 сата увече Захтев за повлачењем да додам више функција тамо и схватио да такво решење уопште није прикладно.
Како функционише терраформирање: узима податке из АВС СДК-а и генерише тф и тфстате преко шаблона.
Овде постоје 3 проблема:
1. Увек ће бити кашњења у ажурирањима
2. тф датотеке понекад излазе покварене
3. тфстате се прикупља одвојено од тф и не конвергира увек
Генерално, тешко је добити резултат у коме `терраформни план` каже да нема промена

2. `терраформ импорт` је уграђена команда у терраформ. Како то функционише?
Напишете празну ТФ датотеку са именом и типом ресурса, затим покренете `терраформ импорт` и проследите ИД ресурса. терраформ контактира провајдера, прима податке и прави тфстате датотеку.
Овде постоје 3 проблема:
1. Добијамо само тфстате фајл, а тф је празан, потребно је да га напишете ручно или да га конвертујете из тфстате
2. Може да ради само са једним ресурсом у исто време и не подржава све ресурсе. И шта да радим поново са 250+ канти?
3. Морате знати ИД ресурса – то јест, морате га умотати у код који добија листу ресурса
Уопштено говорећи, резултат је делимичан и није добро скалиран

Моја одлука

zahtevi:
1. Могућност креирања тф и тфстате датотека за ресурсе. На пример, преузмите све корпе/сигурносну групу/балансатор оптерећења и тај `терраформ план` је вратио да нема промена
2. Потребна су вам 2 ГЦП + АВС облака
3. Глобално решење које је лако ажурирати сваки пут и не губи време на сваки ресурс за 3 дана рада
4. Нека буде отвореног кода – сви имају исти проблем

Го језик је разлог зашто га волим, и има библиотеку за креирање ХЦЛ датотека које се користе у терраформу + много кода у терраформу који може бити користан

Пут

Покушај прво
Почео сам са једноставном верзијом. Контактирање облака преко СДК-а за тражени ресурс и претварање у поља за терраформ. Покушај је одмах пропао на безбедносној групи јер ми се није допало 1.5 дана да конвертујем само безбедносну групу (а има много ресурса). Дуго времена, а затим поља се могу мењати/додавати

Други покушај
На основу описане идеје овде. Само узмите и претворите тфстате у тф. Сви подаци су ту и поља су иста. Како добити пуну тфстате за многе ресурсе?? Овде је у помоћ притекла команда `терраформ рефресх`. терраформ узима све ресурсе у тфстате и, по ИД-у, извлачи податке о њима и све записује у тфстате. То јест, креирајте празно стање тфстате само са именима и ИД-овима, покрените `терраформ рефресх` и онда добијамо пуне тфстате. Ура!
Хајде сада да урадимо рекурзивну порнографију писања претварача за тфстате у тф. За оне који никада нису читали тфстате, то је ЈСОН, али посебан.
Ево његових важних атрибута

 "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. ид - стринг
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",

Генерално, ако неко жели програмски проблем за интервју, само га замолите да напише парсер за овај задатак :)
После много покушаја да напишем парсер без грешака, нашао сам део у терраформ коду, и то најважнији део. И чинило се да све добро функционише

Трећи покушај
терраформ провајдери су бинарни фајлови који садрже код са свим ресурсима и логиком за рад са цлоуд АПИ-јем. Сваки облак има свог провајдера и сам терраформ их позива само преко свог РПЦ протокола између два процеса.
Сада сам одлучио да контактирам терраформ провајдере директно преко РПЦ позива. Испало је предивно и омогућило је промену провајдера терраформа на новије и добијање нових функција без промене кода. Такође се испоставило да не би сва поља у тфстате требала бити у тф, али како то можете сазнати? Само питајте свог провајдера о овоме. Затим је почела још једна рекурзивна порнографија састављања регуларних израза, тражећи поља унутар тфстате на свим нивоима у дубину.

На крају смо добили корисну ЦЛИ алатку која има заједничку инфраструктуру за све терраформ провајдере и лако можете додати нову. Такође, додавање ресурса захтева мало кода. Плус све врсте доброта као што су везе између ресурса. Наравно, било је много различитих проблема који се не могу све описати.
Животињу сам назвао Терафомер.

Финале

Користећи Террафомер, генерисали смо 500-700 хиљада линија тф + тфстате кода из два облака. Успели смо да узмемо наслеђене ствари и почнемо да их додирујемо само кроз терраформу, као у најбољој инфраструктури као идеје кода. Права је магија када узмете огроман облак и примите га преко тима у облику терраформских датотека радника. А онда греп/реплаце/гит и тако даље.

Очешљао сам га и довео у ред, добио дозволу. Објављено на ГитХуб-у за све у четвртак (02.05.19/XNUMX/XNUMX). гитхуб.цом/ГооглеЦлоудПлатформ/терраформер
Већ сам добио 600 звездица, 2 пулл захтева за додавање подршке за опенстацк и кубернетес. Добре повратне информације. Генерално, пројекат је користан за људе
Саветујем свима који желе да почну да раде са Терраформом и не преписују све за ово.
Биће ми драго да повучем захтеве, питања, звезде.

Демо
Терраформер - Инфраструктура за кодирање

Извор: ввв.хабр.цом

Додај коментар