Terraformer - кодтау үшін инфрақұрылым

Terraformer - кодтау үшін инфрақұрылым
Мен ескі мәселені шешу үшін жазған жаңа CLI құралы туралы айтқым келеді.

проблема

Terraform ұзақ уақыт бойы Devops/Cloud/IT қауымдастығында стандарт болды. Бұл код ретінде инфрақұрылыммен жұмыс істеу үшін өте ыңғайлы және пайдалы. Терраформда көптеген ләззаттар, сонымен қатар көптеген шанышқылар, өткір пышақтар мен тырмалар бар.
Terraform көмегімен жаңа нәрселерді жасау, содан кейін оларды басқару, өзгерту немесе жою өте ыңғайлы. Бұлтта үлкен инфрақұрылымы бар және Terraform арқылы жасалмағандар не істеуі керек? Бүкіл бұлтты қайта жазу және қайта жасау қандай да бір түрде қымбат және қауіпті.
Мен бұл мәселеге 2 жұмыста тап болдым, ең қарапайым мысал, сіз барлығының Git-те терраформалық файлдар түрінде болғанын қаласаңыз, бірақ сізде 250+ шелек бар және оларды терраформда қолмен жазу өте көп.
бар іс 2014 жылдан бері импорт болады деген үмітпен 2016 жылы жабылған террафомда.

Жалпы барлығы суреттегідей тек оңнан солға қарай

Ескерту: Автор өмірінің жартысы Ресейде тұрмайды және орыс тілінде аз жазады. Емле қателерінен сақ болыңыз.

Шешімдер

1. AWS үшін дайын және ескі шешімдер бар терраформирования. Мен 250-ден астам шелектерімді алып өтпек болғанымда, онда бәрі нашар екенін түсіндім. AWS көптен бері көптеген жаңа опцияларды ұсынып келеді, бірақ терраформинг олар туралы білмейді және жалпы бұл рубин. үлгі сирек көрінеді. Түнгі екіден кейін мен жібердім Өтінішті тарту онда қосымша мүмкіндіктерді қосу және мұндай шешімнің мүлдем жарамсыз екенін түсінді.
Терраформинг қалай жұмыс істейді: ол AWS SDK деректерін алады және үлгі арқылы tf және tfstate жасайды.
Мұнда 3 мәселе бар:
1. Жаңартуларда әрқашан артта қалу болады
2. tf файлдары кейде бұзылып шығады
3. tfstate tf-дан бөлек жиналады және әрқашан жинақталмайды
Жалпы алғанда, «терраформалық жоспарда» ешқандай өзгерістер жоқ деген нәтиже алу қиын

2. `terraform import` — терраформадағы кірістірілген пәрмен. Бұл қалай жұмыс істейді?
Сіз ресурстың аты мен түрі бар бос TF файлын жазасыз, одан кейін `terraform import` іске қосып, ресурс идентификаторын өткізесіз. terraform провайдермен байланысады, деректерді алады және tfstate файлын жасайды.
Мұнда 3 мәселе бар:
1. Біз тек tfstate файлын аламыз, ал tf бос, оны қолмен жазу керек немесе tfstate файлынан түрлендіру керек.
2. Бір уақытта тек бір ресурспен жұмыс істей алады және барлық ресурстарды қолдамайды. 250+ шелекпен тағы не істеуім керек?
3. Ресурстардың идентификаторын білу керек - яғни оны ресурстар тізімін алатын кодқа орау керек.
Жалпы алғанда, нәтиже ішінара және жақсы масштабталмайды

Менің шешімім

талаптар:
1. Ресурстар үшін tf және tfstate файлдарын құру мүмкіндігі. Мысалы, барлық шелектерді/қауіпсіздік тобын/жүктеме балансын жүктеп алыңыз және бұл «терраформалық жоспар» ешқандай өзгерістер жоқ екенін көрсетті
2. Сізге 2 GCP + AWS бұлты қажет
3. Әр уақытта жаңартуға оңай және 3 күндік жұмыс үшін әр ресурста уақытты босқа кетірмейтін жаһандық шешім
4. Оны ашық бастапқы кодқа айналдырыңыз - барлығында бірдей мәселе бар

Go тілі мен оны жақсы көремін және оның terraform-да қолданылатын HCL файлдарын жасауға арналған кітапханасы + пайдалы болуы мүмкін терраформда көптеген кодтар бар.

жолы

Біріншіден әрекет етіңіз
Мен қарапайым нұсқадан бастадым. Қажетті ресурс үшін SDK арқылы бұлтпен байланысу және оны терраформа үшін өрістерге түрлендіру. Қауіпсіздік тобында әрекет бірден өлді, өйткені маған тек қауіпсіздік тобын түрлендіруге 1.5 күн ұнамады (және көптеген ресурстар бар). Ұзақ уақыт бойы, содан кейін өрістерді өзгертуге/қосуға болады

Екінші әрекет
Сипатталған идея негізінде осында. Тек tfstate-ді tf-ге алыңыз және түрлендіріңіз. Барлық деректер сонда және өрістер бірдей. Көптеген ресурстар үшін толық tfstate қалай алуға болады? Бұл жерде «терраформаны жаңарту» командасы көмекке келді. terraform tfstate ішіндегі барлық ресурстарды алады және идентификатор бойынша олардағы деректерді шығарып, барлығын 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. спецификация – 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 протоколы арқылы шақырады.
Енді мен terraform провайдерлерімен тікелей RPC қоңыраулары арқылы байланысуды шештім. Бұл әдемі болып шықты және кодты өзгертпестен терраформ провайдерлерін жаңасына ауыстыруға және жаңа мүмкіндіктерді алуға мүмкіндік берді. Сондай-ақ, tfstate-дегі барлық өрістер tf-де болмауы керек, бірақ оны қалай білуге ​​болады? Бұл туралы провайдеріңізден сұраңыз. Содан кейін тұрақты өрнектерді жинаудың тағы бір рекурсивті порнографиясы басталды, tfstate ішіндегі өрістерді барлық деңгейлерде тереңдете іздеу.

Соңында біз барлық terraform провайдерлері үшін ортақ инфрақұрылымы бар пайдалы CLI құралын алдық және сіз жаңасын оңай қоса аласыз. Сондай-ақ, ресурстарды қосу аз кодты қажет етеді. Сонымен қатар ресурстар арасындағы байланыстар сияқты барлық жақсы нәрселер. Әрине, барлығын сипаттау мүмкін емес көптеген әртүрлі мәселелер болды.
Мен жануарды Террафомер деп атадым.

Қорытынды

Terrafomer көмегімен біз екі бұлттан 500-700 мың жол tf + tfstate кодын жасадық. Біз мұраға қалдырылған нәрселерді алып, оларды код идеялары ретінде ең жақсы инфрақұрылымдағыдай терраформа арқылы ғана ұстай алдық. Сіз үлкен бұлтты алып, оны терраформалық жұмысшы файлдары түрінде топ арқылы қабылдаған кезде бұл жай ғана сиқыр. Содан кейін grep/replace/git және т.б.

Мен таратып, ретке келтірдім, рұқсат алдым. Бейсенбіде (02.05.19/XNUMX/XNUMX) барлығы үшін GitHub сайтында шығарылды. github.com/GoogleCloudPlatform/terraformer
Қазірдің өзінде 600 жұлдыз, ашықстек пен кубернеттерді қолдауды қосу үшін 2 тарту сұрауы алынды. Жақсы кері байланыс. Жалпы, жобаның халыққа пайдасы бар
Мен Terraform-пен жұмыс істегісі келетіндердің бәріне кеңес беремін және бұл үшін бәрін қайта жазбаймын.
Мен сұрауларды, мәселелерді, жұлдыздарды тартуға қуаныштымын.

Демо
Terraformer - кодтау үшін инфрақұрылым

Ақпарат көзі: www.habr.com

пікір қалдыру