Шта су модули Терраформ и како функционишу?

Изненађујуће, многи почетници прескачу модуле Терраформ због једноставности, или барем тако мисле.

Касније, открију да пролазе кроз стотине линија конфигурационог кода.

Претпостављам да већ знате неке од основа о Терраформу, па чак сте и раније покушали да их користите. Ако не, погледајте овај преглед на Терраформу и овај видео водич пре него што наставите да читате.

Имајте на уму: Не користим примере стварних кодова код неких одређених добављача попут АВС-а или Гоогле-а намерно, само ради једноставности.

Модули Терраформ

Већ пишете модуле

Чак и када не креирате модул намерно, ако користите Терраформ, већ пишете модул - такозвани „ роот “ модул.

Било која конфигурациона датотека Терраформ ( .tf) у директоријуму, чак и само једна, чини модул.

Шта ради модул?

Модул Терраформ вам омогућава да креирате логичку апстракцију на врху неког скупа ресурса. Другим речима, модул вам омогућава да групишете ресурсе и касније поново користите ову групу, можда много пута.

Претпоставимо да имамо виртуелни сервер са неким функцијама хостованим у облаку. Који скуп ресурса може описати тај сервер? На пример:

  • сама виртуелна машина, створена од неке слике
  • прикључени блок уређај одређене величине за додатно складиштење
  • статична јавна ИП која се пресликава на виртуелни мрежни интерфејс сервера
  • скуп правила заштитног зида који треба да се прикаче на сервер
  • друге ствари попут другог блок уређаја, додатног мрежног интерфејса итд

Сада претпоставимо да овај сервер треба да креирате више пута са скупом ресурса. Ту су модули заиста корисни - не желите да понављате исти конфигурациони код изнова и изнова, зар не?

Ево примера који илуструје како би се могао назвати наш „сервер“ модул.

Позвати модул “ значи користити га у конфигурационој датотеци.

Овде креирамо 5 инстанци „сервера“ користећи један скуп конфигурација (у модулу):

module "server" { count = 5 source = "./module_server" some_variable = some_value }

Организација модула: дете и корен

Наравно, вероватно бисте желели да направите више од једног модула. Ево неколико уобичајених примера:

  • мрежа попут виртуелног приватног облака (ВПЦ)
  • хостинг статичног садржаја (тј. сегменти)
  • уравнотеживач терета и с њим повезани ресурси
  • конфигурација евидентирања
  • или било шта друго што сматрате засебном логичком компонентом инфраструктуре

Рецимо да имамо два различита модула: модул „сервер“ и модул „мрежа“. Модул назван „мрежа“ је место где дефинишемо и конфигуришемо нашу виртуелну мрежу и у њу постављамо сервере:

module "server" { source = "./module_server" some_variable = some_value } module "network" { source = "./module_network" some_other_variable = some_other_value }

Када имамо неке прилагођене модуле, можемо их назвати „подређеним“ модулима. А конфигурациона датотека у којој називамо подређене модуле односи се на основни модул.

Дечји модул се може наћи на више места:

  • локалне стазе
  • званични Регистар Терраформ - ако сте упознати са другим регистрима као што је Доцкер Регистри, онда већ разумете идеју
  • Гит спремиште (прилагођено или ГитХуб / БитБуцкет)
  • ХТТП УРЛ у .зип архиву са модулом

Али како можете преносити детаље о ресурсима између модула?

У нашем примеру, сервери треба да буду креирани у мрежи. Па како можемо рећи модулу „сервер“ да креира ВМ-ове у мрежи која је креирана у модулу који се зове „мрежа“?

Овде долази до инкапсулације .

Капсулација модула

Инкапсулација у Терраформ састоји се од два основна концепта: опсега модула и експлицитне изложености ресурсима.

Обим модула

Све инстанце ресурса, имена, а самим тим и видљивост ресурса, изоловане су у опсегу модула. На пример, модул „А“ подразумевано не може да види и не зна за ресурсе у модулу „Б“.

Видљивост ресурса, која се понекад назива и изолација ресурса, осигурава да ресурси имају јединствена имена у именском простору модула. На пример, са наших 5 инстанци „сервер“ модула:

module.server[0].resource_type.resource_name module.server[1].resource_type.resource_name module.server[2].resource_type.resource_name ...

С друге стране, могли бисмо створити две инстанце истог модула са различитим именима:

module "server-alpha" { source = "./module_server" some_variable = some_value } module "server-beta" { source = "./module_server" some_variable = some_value }

У овом случају, именовање или адреса ресурса би било следеће:

module.server-alpha.resource_type.resource_name module.server-beta.resource_type.resource_name

Експлицитна изложеност ресурсима

Ако желите да приступите неким детаљима за ресурсе у другом модулу, мораћете то експлицитно да конфигуришете.

Наш модул „сервер“ подразумевано не зна за мрежу која је креирана у модулу „мрежа“.

Дакле, морамо декларисати outputвредност у модулу „мрежа“ да бисмо извели свој ресурс или атрибут ресурса у друге модуле.

Модул „сервер“ мора прогласити variableда ће се касније користити као улаз:

Ова експлицитна декларација резултата је начин да се неки ресурс (или информација о њему) изложи споља - у делокруг 'роот' модула, тако да га учини доступним за друге модуле.

Даље, када подређени модул зовемо „сервер“ у коренском модулу, требало би да доделимо излаз из „мрежног“ модула променљивој модула „сервер“:

network_id = module.network.network_id

Ево како ће изгледати коначни код за позивање наших подређених модула:

module "server" { count = 5 source = "./module_server" some_variable = some_value network_id = module.network.network_id } module "network" { source = "./module_network" some_other_variable = some_other_value }

Овај пример конфигурације би створио 5 инстанци истог сервера, са свим потребним ресурсима, у мрежи коју смо креирали као посебан модул.

Окончање

Сада би требало да разумете шта су модули и шта раде.

Ако сте на почетку свог путовања Терраформом, ево неколико предлога за следеће кораке.

Предлажем вам да узмете овај кратки водич ХасхиЦорпа, креатора Терраформ-а, о модулима: „Организуј конфигурацију“.

Такође, постоји сјајан свеобухватан водич за студије који покрива све, од почетника до напредних концепата о Терраформу: „Водич за студије - Терраформ Ассоциате Цертифицатион“.

Модуларна структура кода чини вашу конфигурацију флексибилнијом, а опет лако разумљивом другима. Ово друго је посебно корисно за тим.

Ако вам се свидео чланак, следите ме на Твиттер-у (@василенко) где повремено делим своја открића и савете о Терраформ-у, АВС-у, Ансибле-у и другим технологијама повезаним са ДевОпс-ом.