Создание модулей
Модуль — это контейнер для нескольких ресурсов, которые используются вместе. Модули позволяют создавать облегчённые абстракции, описывая инфраструктуру с точки зрения её архитектуры, а не непосредственно через физические объекты.
Файлы .tf и/или .tofu в рабочем каталоге при запуске tofu plan или tofu apply вместе образуют корневой модуль. Этот модуль может вызывать другие модули и связывать их, передавая выходные значения одного модуля входным значениям другого.
Сведения об использовании модулей см. в разделе конфигурации модулей. В этом разделе рассказывается о создании повторно используемых модулей, которые другие конфигурации могут подключать с помощью блоков module.
Структура модуля
Повторно используемые модули определяются с помощью тех же понятий языка конфигурации, которые применяются в корневых модулях. Чаще всего в модулях используются:
- Входные переменные для получения значений от вызывающего модуля.
- Выходные значения для возврата результатов вызывающему модулю, который затем может использовать их для заполнения аргументов в других местах.
- Ресурсы для определения одного или нескольких объектов инфраструктуры, которыми будет управлять модуль.
Чтобы определить модуль, создайте для него новый каталог и поместите в него один или несколько файлов .tf, как при создании корневого модуля. OpenTofu может загружать модули как из локальных относительных путей, так и из удалённых репозиториев; если модуль будет повторно использоваться во многих конфигурациях, его можно поместить в отдельный репозиторий системы контроля версий.
Модули также могут вызывать другие модули с помощью блока module, однако мы рекомендуем сохранять дерево модулей относительно плоским и использовать композицию модулей вместо глубоко вложенного дерева, поскольку так отдельные модули проще повторно использовать в разных сочетаниях.
Когда следует создавать модуль
В принципе, любое сочетание ресурсов и других конструкций можно выделить в модуль, однако чрезмерное использование модулей может затруднить понимание и сопровождение конфигурации OpenTofu в целом, поэтому мы рекомендуем соблюдать умеренность.
Хороший модуль должен повышать уровень абстракции, описывая новое понятие в архитектуре, построенное на основе типов ресурсов, предоставляемых провайдерами.
Например, aws_instance и aws_elb — это типы ресурсов провайдера AWS. Вы можете использовать модуль для представления понятия более высокого уровня — кластера "HashiCorp Consul, работающего в AWS", который, помимо прочего, состоит из этих ресурсов и других ресурсов провайдера AWS.
Мы не рекомендуем создавать модули, которые служат лишь тонкой оболочкой для одного другого типа ресурса. Если вам сложно подобрать модулю имя, отличное от имени основного типа ресурса внутри него, это может указывать на то, что модуль не создаёт новой абстракции и лишь добавляет ненужную сложность. Вместо этого используйте тип ресурса непосредственно в вызывающем модуле.
Рефакторинг ресурсов модуля
Вы можете добавлять блоки рефакторинга, чтобы фиксировать изменения имён ресурсов и структуры модулей по сравнению с предыдущими версиями модуля. OpenTofu использует эту информацию при планировании, чтобы интерпретировать существующие объекты так, как если бы они были созданы по соответствующим новым адресам. Это позволяет исключить отдельный шаг рабочего процесса для замены или миграции существующих объектов.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.10/language/modules/develop/