Пакеты модулей в реестрах OCI
OpenTofu поддерживает установку пакетов модулей из различных источников, включая репозитории в реестрах, реализующих протокол OCI Distribution.
Вы можете настроить OpenTofu для установки модуля из репозитория OCI, используя схему адреса источника oci::
module "example" {
source = "oci://example.com/repository-name"
}Подробнее о выборе артефактов OCI для установки см. в документации по источникам модулей. На остальной части этой страницы рассматривается создание подходящих артефактов OCI для использования в качестве пакетов модулей OpenTofu.
Обязательное содержимое репозитория OCI
Артефакт OCI, выбранный адресом источника модуля oci:, должен соответствовать определённым требованиям как к метаданным манифеста, так и к блобу, содержащему пакет модуля.
Выбранный тег или дайджест должен соответствовать стандартному манифесту образа OCI, свойство artifactType которого имеет значение "application/vnd.opentofu.modulepkg".
Массив layers манифеста образа должен содержать ровно один дескриптор, у которого mediaType имеет значение archive/zip и который указывает на корректный архив .zip с содержимым пакета модуля.
Корневой каталог архива .zip соответствует корневому каталогу пакета модуля и поэтому содержит файлы конфигурации .tf, .tofu и т. д., описывающие модуль по умолчанию из пакета. Архив может также содержать подкаталоги с дополнительными модулями, которые затем можно выбрать с помощью стандартного синтаксиса для модулей в подкаталогах пакета.
Если указанный адрес источника не содержит аргументы строки запроса tag или digest, OpenTofu пытается найти тег с именем latest. Помимо ограничений синтаксиса, установленных спецификацией OCI Distribution, OpenTofu не предъявляет других требований к соглашению об именовании тегов.
Сборка и отправка манифестов пакетов модулей
Установка и настройка ORAS
Для сборки и отправки манифестов и блобов пакета модуля мы рекомендуем использовать CLI-утилиту, предлагаемую проектом ORAS.
Если вы впервые устанавливаете и используете ORAS и собираетесь отправлять данные в реестр OCI, требующий аутентификации, сначала получите учётные данные для этого репозитория с помощью oras login.
Создание архива .zip
Фактическое содержимое пакета модуля представляется в артефакте OCI одним слоем в формате архива .zip.
Для создания архива .zip с исходным кодом модуля (файлами .tf/.tofu и т. д.), который вы собираетесь распространять, можно использовать любой подходящий инструмент. Например, можно воспользоваться утилитой zip, обычно доступной в Unix-системах:
zip -r ../module-package.zip .
Эта команда создаёт или обновляет архив module-package.zip в родительском каталоге текущего рабочего каталога. В архив включаются все файлы из текущего рабочего каталога и его подкаталогов. Создание архива в родительском каталоге позволяет избежать включения zip-файла в него самого при повторном запуске той же команды.
В следующем разделе для ссылки на созданный вами архив .zip будет использоваться имя module-package.zip.
Отправка артефакта в удалённый репозиторий
Команда oras push может автоматически создать подходящий манифест образа, загрузить этот манифест и связанный с ним файл .zip в удалённый репозиторий OCI, а также создать или обновить в том же репозитории один или несколько указывающих на него тегов.
oras push \ --artifact-type=application/vnd.opentofu.modulepkg \ example.com/repository-name:latest \ module-package.zip:archive/zip
example.com/repository-name — адрес репозитория, в который нужно отправить артефакт. latest — имя используемого тега.
module-package.zip — имя архива .zip, созданного на предыдущем шаге. Суффикс :archive/zip указывает ORAS, какой тип носителя указать для этого файла в манифесте артефакта. OpenTofu не поддерживает другие типы носителей.
Параметр --artifact-type, указанный выше, необходимо использовать точно в показанном виде, чтобы OpenTofu распознал этот артефакт как пакет модуля.
Адрес репозитория и тег, указанные выше, можно задать в адресе источника блока module следующим образом:
module "example" {
source = "oci://example.com/repository-name?tag=latest"
}Если вы выбрали имя тега latest, как показано здесь, аргумент tag можно опустить и указать только oci://example.com/repository-name, поскольку «latest» — это имя тега, которое OpenTofu использует по умолчанию.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.12/cli/oci_registries/module-package/