Я видел код терраформирования, который писался как
source = "github.com/brikis98/terraform-up-and-running-code//code/terraform/04-terraform-module/module-example/modules/services/webserver-cluster?ref=v0.1.0"
Но когда я получаю доступ к этому URL-адресу в Chrome, он не может получить доступ к своему ресурсу.
Так. Интересно, что этот URL соответствует формату. Есть ли какое-то правило на этот счет?
двойная косая черта (//) подозрительна... для меня.
Я уже просмотрел документ в разделе модуля terraform. Но Он не описывает об этом.
Попробуйте с этим
source = "git::https://github.com/brikis98/terraform-up-and-running-code.git//code/terraform/04-terraform-module/module-example/modules/services/webserver-cluster?ref=v0.1.0"
Полная документация о том, что допустимо внутри аргумента модуля source
, находится в Источники модуля.
Пример, который вы показали в своем вопросе, включает части, соответствующие двум разным разделам на этой странице:
github.com/brikis98/terraform-up-and-running-code
— это одна из схем исходного адреса, описанная в разделе GitHub.
Поскольку Terraform является широко используемым хостом управления версиями, Terraform имеет для него специальную поддержку и знает, что любой репозиторий GitHub должен быть клонирован с помощью Git, поэтому Terraform может автоматически переписать это сокращение в следующую каноническую форму внутри:
git::https://github.com/brikis98/terraform-up-and-running-code
Эта более длинная версия включает префикс git::
, который говорит Terraform, что он должен рассматривать следующее как URL-адрес Git, и Terraform также автоматически добавляет префикс https://
, чтобы сделать это URL-адресом HTTPS.
Этот префикс git::
на самом деле является синтаксисом для универсальных репозиториев Git , поэтому вы можете видеть, что Terraform внутренне преобразует этот URL-адрес, специфичный для GitHub, в общий URL-адрес Git. Суффикс ?ref=v0.1.0
также является частью общей схемы исходных адресов Git, как описано в разделе Выбор версии.
Когда вы запустите terraform init
, Terraform сообщит каноническую версию исходного адреса как часть своего отчета об установке этого пакета модуля.
//code/terraform/04-terraform-module/module-example/modules/services/webserver-cluster
— необязательная спецификация подкаталога .
«Пакет модулей» — это общее слово для пакета файлов, который Terraform может загрузить и который содержит один или несколько модулей. Репозиторий Git — это один из примеров пакета модулей в том, что касается Terraform.
По умолчанию Terraform ожидает найти исходный код модуля в корневом каталоге пакета модуля, но если исходный адрес включает часть, представленную маркером //
, Terraform воспринимает это как подкаталог внутри пакета, где он должен найти конкретный модуль, в котором вы находились. пытаюсь вызвать. Этот конкретный репозиторий GitHub содержит множество различных модулей Terraform, принадлежащих к разным частям книги, которую он поддерживает, поэтому ссылки на этот репозиторий всегда будут иметь часть подкаталога.
В целом, Terraform понимает эту строку исходного адреса следующим образом:
Разделение его на части «пакет» и «подкаталог»:
github.com/brikis98/terraform-up-and-running-code?ref=v0.1.0
code/terraform/04-terraform-module/module-example/modules/services/webserver-cluster
Заметив, что часть пакета использует сокращение github.com
и поэтому переписывает его в каноническую форму:
git::https://github.com/brikis98/terraform-up-and-running-code?ref=v0.1.0
(Это адрес пакета, который terraform init
сообщит при установке.)
Теперь, когда пакет включает префикс метода установки git::
, Terraform знает, что он должен получить пакет модуля, выполнив команду, похожую на следующую:
git clone https://github.com/brikis98/terraform-up-and-running-code
git checkout v0.1.0
Terraform всегда загружает пакеты внешних модулей в скрытый каталог кеша в каталоге .terraform
в вашей локальной системе. Точная структура этого каталога — это деталь реализации, которая может меняться в разных версиях Terraform, но в текущей версии Terraform подкаталог назван в честь метки в вашем блоке module
.
Если загрузка прошла успешно, у Terraform теперь есть копия пакета в каталоге, похожем на .terraform/modules/example
.
Затем он присоединится к части подкаталога, чтобы найти окончательное местоположение модуля в локальном кеше:
.terraform/modules/example/code/terraform/04-terraform-module/module-example/modules/services/webserver-cluster
Этот последний каталог должен содержать как минимум один файл .tf
, описывающий содержимое модуля, который Terraform затем загрузит и декодирует аналогично тому, как он декодирует корневой модуль.