Модули терраформирования

Moduli Terraformirovania



В мире предоставления и управления инфраструктурой Terraform стал популярным выбором среди разработчиков и операционных групп. Благодаря декларативному синтаксису (HCL — язык конфигурации HashiCorp) и поддержке различных поставщиков инфраструктуры Terraform позволяет использовать практики «инфраструктура как код» (IaC).

Одной из его ключевых особенностей является использование модулей, которые позволяют создавать и повторно использовать код модульной инфраструктуры. В этой статье мы рассмотрим концепцию модулей Terraform и то, как они могут помочь организовать и упростить код нашей инфраструктуры.







Введение в модули Terraform

Модули Terraform — это автономные пакеты конфигураций Terraform, которые представляют собой набор ресурсов с определенными входными и выходными переменными. Они обеспечивают способ инкапсуляции и повторного использования кода инфраструктуры, что упрощает управление и обслуживание сложных развертываний инфраструктуры.



Модули можно создавать и использовать внутри проекта или совместно использовать в нескольких проектах или группах.



Организация модуля

При организации модулей Terraform обычно используется иерархическая структура, состоящая из корневых и дочерних модулей. Давайте посмотрим, как работает эта организация.





Корневой модуль



Корневой модуль представляет собой модуль верхнего уровня в нашей конфигурации Terraform. Это отправная точка для определения общей инфраструктуры и управления отношениями между различными ресурсами.

Корневой модуль обычно содержит файл «main.tf», в котором мы определяем ресурсы и конфигурации, составляющие основу нашей инфраструктуры. При желании мы можем иметь с ним файлы «variables.tf» и «outputs.tf». Кроме того, мы можем определить наш каталог «modules» в корневом каталоге, чтобы легко получить доступ к дочерним модулям.

Дочерние модули

Дочерние модули — это модульные компоненты, которые инкапсулируют определенные наборы ресурсов или конфигураций. Они предназначены для многократного использования и представляют собой автономные единицы функциональности инфраструктуры.

Дочерние модули могут использоваться в корневом или других дочерних модулях, что позволяет создавать композицию и сложную инфраструктуру. Каждый дочерний модуль обычно имеет свой каталог, содержащий необходимые файлы конфигурации, такие как «main.tf», «variables.tf» и «outputs.tf».

Теперь давайте посмотрим, как мы можем создать модуль Terraform.

Создание модуля Terraform

При создании модулей Terraform мы должны создать новый каталог для модуля с необходимыми файлами конфигурации Terraform. Обычно этот каталог называется «modules». Лучшей практикой является определение его в корневом каталоге нашего проекта.

Давайте рассмотрим простой пример простого модуля для предоставления локального веб-сервера с помощью Docker. Сначала мы определяем модуль в каталоге «modules» как «main.tf».

ресурс 'докер_контейнер' 'веб сервер' {
имя  = имя_переменной
изображение = var.image
порты {
внутренний = var.internal_port
внешний = var.external_port
}
}

Здесь мы создаем модуль с именем «docker_container», который принимает имя контейнера, образ Docker, внутренний порт и внешний порт в качестве входных переменных. Модуль инкапсулирует логику создания ресурса контейнера Docker и позволяет вызывающей стороне настраивать свойства контейнера.

Как показано на следующем изображении, мы создаем отдельный файл с именем «variables.tf» в каталоге «modules», чтобы определить входные переменные, которые можно настроить при использовании модуля:

переменная 'имя' {
описание = 'Имя контейнера Docker'
тип = строка
}

переменная 'изображение' {
описание = «Докер-образ»
тип = строка
}

переменная 'внутренний_порт' {
описание = «Внутренний порт в контейнере Docker»
тип = число
}

переменная 'внешний_порт' {
описание = «Внешний порт для сопоставления»
тип = число
}

Здесь мы объявили четыре переменные, каждая из которых имеет «описание» и «тип» в качестве атрибутов и соответствующие им значения.

Использование модуля Terraform

Поскольку мы создали наш модуль, теперь мы можем использовать его в нашей основной конфигурации Terraform, ссылаясь на его источник. Давайте создадим наш основной файл конфигурации, который называется «main.tf» в корневом каталоге.

модуль 'веб-сервер_контейнер' {
источник '=' '../модули/докер_контейнер'
имя            = 'мой веб-сервер'
изображение           = 'nginx: последний'
внутренний_порт   = 80
внешний_порт = 8080
}

Мы используем блок «модуль» в предыдущем коде для создания экземпляра модуля контейнера Docker. Мы предоставляем необходимые входные значения для модуля, такие как имя контейнера, образ Docker и конфигурация порта. Параметр «источник» указывает относительный путь к каталогу «модуль».

Далее давайте посмотрим, как использовать выходные данные Terraform для использования с модулями.

Выходы модуля

Выходные данные модуля в Terraform позволяют отображать определенные значения внутри модуля, делая их доступными для использования в основной конфигурации или другими модулями. Они служат каналом связи между модулем и вызывающей стороной, что позволяет модулю предоставлять информацию или данные, которые могут быть полезны или необходимы для дальнейшей настройки или принятия решений.

выход 'идентификатор_контейнера' {
описание = «ID созданного контейнера Docker»
значение       = docker_container.webserver.id
}

Здесь мы создали файл «outputs.tf» внутри каталога «modules». Эта выходная переменная предоставляет идентификатор контейнера Docker, созданного ресурсом «docker_container» с именем «webserver» в модуле.

Теперь мы можем получить доступ к идентификатору контейнера в нашем корневом файле конфигурации. Обратитесь к следующему обновленному коду файла «main.tf» в корневом каталоге:

модуль 'веб-сервер_контейнер' {
источник '=' '../модули/докер_контейнер'
имя            = 'мой веб-сервер'
изображение           = 'nginx: последний'
внутренний_порт   = 80
внешний_порт = 8080
}

ресурс 'докер_том' 'данные' {
# Здесь идут остальные аргументы
связывать = module.webserver_container.container_id
}

Используя «module.webserver_container.container_id» в качестве значения аргумента «bind», мы указываем Terraform привязать том Docker к расположению, указанному идентификатором контейнера модуля «web_container». Это устанавливает связь между ресурсом тома Docker и контейнером, созданным модулем «webserver_container», гарантируя, что том будет смонтирован в соответствующем месте.

Лучшие практики для модулей Terraform

Модульность для повторного использования

Мы должны учитывать возможность повторного использования при разработке модулей. Кроме того, мы должны определить логические компоненты или шаблоны нашей инфраструктуры и инкапсулировать их в отдельные модули. Это способствует повторному использованию кода, стандартизации и упрощению совместной работы между командами.

Четкое и последовательное наименование

Использование четких и согласованных соглашений об именах для модулей, переменных и ресурсов улучшает читаемость и понимание кодовой базы, что облегчает другим работу с модулями и их поддержку.

Изолировать зависимости

Мы должны избегать тесной связи между модулями. Каждый модуль должен инкапсулировать свои собственные ресурсы и зависимости. Это гарантирует возможность повторного использования модулей независимо друг от друга и способствует лучшей изоляции и инкапсуляции.

Контроль версий и реестр модулей

Мы можем опубликовать наши модули в репозитории с контролируемой версией или в реестре модулей. Это обеспечивает централизованное расположение для совместного использования и обнаружения модулей, обеспечивая легкий доступ и управление версиями.

Заключение

Мы сделали краткое введение в модули Terraform и научились их создавать на простом примере. Затем мы рассмотрели, как использовать переменные и выходные данные с нашим модулем, чтобы повысить его гибкость, возможность повторного использования и удобство сопровождения. В заключение можно сказать, что модули Terraform — это мощные инструменты для организации и упрощения кода инфраструктуры. Они позволяют нам инкапсулировать набор ресурсов или конфигураций в повторно используемые компоненты, поддерживая модульность, возможность повторного использования и совместную работу в рамках наших проектов «инфраструктура как код».