Terraformer - Code To Infrastructure

Terraformer - Code To Infrastructure
Мен эски көйгөйдү чечүү үчүн жазган жаңы CLI куралы жөнүндө айткым келет.

маселе

Terraform көптөн бери Devops/Cloud/IT коомчулугунда стандарт болуп келген. Бул нерсе инфраструктура менен код катары иштөө үчүн абдан ыңгайлуу жана пайдалуу. Терраформда көптөгөн айрылар, курч бычактар ​​жана тырмоолор бар.
Terraform менен жаңы нерселерди жаратып, анан аларды башкаруу, өзгөртүү же жок кылуу абдан ыңгайлуу. Булуттагы чоң инфраструктурасы бар жана Terraform аркылуу түзүлбөгөндөр эмне кылышы керек? Бүткүл булутту кайра жазуу жана кайра түзүү кандайдыр бир деңгээлде кымбат жана кооптуу.
Мен бул көйгөйгө 2 жумушта туш болдум, эң жөнөкөй мисал, сиз бардыгын Гитте терраформ файлдары түрүндө болгуңуз келсе, бирок сизде 250+ чака бар жана аларды терраформда кол менен жазуу абдан көп.
бар чыгаруу 2014-жылдан бери импорт болот деген үмүт менен 2016-жылы жабылган террафомдо.

Жалпысынан алганда, баары оңдон солго гана сүрөттөгүдөй

Эскертүү: Автор жарым өмүрү Орусияда жашабайт жана орусча аз жазат. Орфографиялык каталардан сак болуңуз.

Чечимдер

1. AWS үчүн даяр жана эски чечимдер бар терраформалоо. Мен 250+ чакамды алайын десем, ал жерде баары начар экенин түшүндүм. AWS көптөн бери көптөгөн жаңы варианттарды киргизип келет, бирок терраформинг алар жөнүндө билбейт жана жалпысынан бул рубин шаблон сейрек көрүнөт. Кечки саат 2ден кийин жибердим Тартуу жөнүндө арыз ал жерде көбүрөөк мүмкүнчүлүктөрдү кошуу үчүн жана мындай чечим такыр ылайыктуу эмес экенин түшүндүм.
Терраформалоо кантип иштейт: ал AWS SDKден маалыматтарды алып, шаблон аркылуу tf жана tfstate түзөт.
Бул жерде 3 көйгөй бар:
1. Жаңыртууларда ар дайым артта калуу болот
2. tf файлдары кээде бузулуп чыгат
3. tfstate tfдан өзүнчө чогултулат жана дайыма жакындай бербейт
Жалпысынан алганда, `terraform планы' эч кандай өзгөрүү жок деп жыйынтык чыгаруу кыйын

2. `terraform import` - терраформада орнотулган буйрук. Бул кантип иштейт?
Сиз ресурстун аталышы жана түрү менен бош TF файлын жазасыз, андан кийин `terraform импортун` иштетип, ресурстун идентификаторун өткөрөсүз. terraform провайдер менен байланышат, маалыматтарды алат жана tfstate файлын түзөт.
Бул жерде 3 көйгөй бар:
1. Биз tfstate файлын гана алабыз, ал эми tf бош, сиз аны кол менен жазышыңыз же tfstateден конвертациялооңуз керек.
2. Бир эле учурда бир гана ресурс менен иштей алат жана бардык ресурстарды колдобойт. Анан дагы 250+ чака менен эмне кылышым керек?
3. Сиз ресурстардын идентификаторун билишиңиз керек - башкача айтканда, аны ресурстардын тизмесин алган кодго ороп алышыңыз керек.
Жалпысынан алганда, натыйжа жарым-жартылай жана жакшы масштабдуу эмес

Менин чечимим

талаптар:
1. Ресурстар үчүн tf жана tfstate файлдарын түзүү мүмкүнчүлүгү. Мисалы, бардык чакаларды/коопсуздук тобун/жүк теңдештиргичти жүктөп алыңыз жана "терраформа планы" эч кандай өзгөрүү жок экенин кайтарды
2. Сизге 2 GCP + AWS булуттары керек
3. Ар дайым жаңыртуу оңой жана 3 күндүк иш үчүн ар бир ресурста убакытты текке кетирбеген глобалдык чечим
4. Аны ачык булак кылыңыз – бардыгында бирдей көйгөй бар

Go тили мен аны жакшы көрөм жана анын терраформда колдонулган HCL файлдарын түзүү үчүн китепканасы + пайдалуу болушу мүмкүн болгон терраформда көп код бар.

жол

Биринчи аракет
Мен жөнөкөй версия менен баштадым. Керектүү ресурс үчүн SDK аркылуу булут менен байланышуу жана аны терраформа үчүн талааларга айландыруу. аракет коопсуздук тобуна дароо өлдү, анткени мен 1.5 күн коопсуздук тобун гана айландыруу үчүн жаккан жок (жана ресурстар көп). Бул көп убакытты талап кылат, андан кийин талааларды өзгөртүүгө/кошууга болот

Экинчи аракет
сүрөттөлгөн идеянын негизинде бул жерде. Жөн гана алып, tfstateди tfге айландырыңыз. Бардык маалыматтар бар жана талаалар бирдей. Көптөгөн ресурстар үчүн толук tfstate кантип алууга болот? Бул жерде 'terraform refresh' буйругу жардамга келди. terraform tfstate ичиндеги бардык ресурстарды алат жана ID боюнча алар боюнча маалыматтарды чыгарып, баарын tfstateге жазат. Башкача айтканда, аттары жана идентификаторлору менен бош tfstate түзүңүз, `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. 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 чалуулары аркылуу түздөн-түз terraform провайдерлери менен байланышууну чечтим. Бул сонун болуп чыкты жана кодду өзгөртпөстөн, terraform провайдерлерин жаңыларына өзгөртүүгө жана жаңы функцияларды алууга мүмкүндүк берди. Ошондой эле tfstateдеги бардык талаалар tfде болбошу керек экен, бирок кантип билсе болот? Бул тууралуу провайдериңизден гана сураңыз. Андан кийин бардык деңгээлдердеги tfstate ичиндеги талааларды издеп, кадимки сөз айкаштарын чогултуунун дагы бир рекурсивдүү порнографиясы башталды.

Акыр-аягы, биз бардык terraform провайдерлери үчүн жалпы инфраструктурасы бар пайдалуу CLI куралын алдык жана сиз оңой эле жаңысын кошо аласыз. Ошондой эле, ресурстарды кошуу аз кодду талап кылат. Мындан тышкары, ресурстардын ортосундагы байланыш сыяктуу ар кандай жакшы нерселер. Албетте, бардыгын сүрөттөп айтууга мүмкүн болбогон көптөгөн ар кандай көйгөйлөр бар болчу.
Мен жаныбардын атын Terrafomer деп койдум.

жетер

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

Тарап, иретке келтирдим, уруксат алдым. Бейшемби күнү (02.05.19/XNUMX/XNUMX) бардыгы үчүн GitHub'да чыгарылды. github.com/GoogleCloudPlatform/terraformer
Буга чейин 600 жылдыз алган, Openstack жана kubernetes үчүн колдоо кошуу үчүн 2 тартуу өтүнүчтөрү. Жакшы пикир. Негизинен долбоор элге пайдалуу
Мен Terraform менен иштөөнү каалагандардын баарына кеңеш берем жана бул үчүн баарын кайра жазбай.
Мен өтүнүчтөрдү, маселелерди, жылдыздарды тартууга кубанычта болом.

Демо
Terraformer - Code To Infrastructure

Source: www.habr.com

Комментарий кошуу