Можно ли изменить исходный путь для модуля в Terraform?

Можно ли использовать переменную для источника модуля в Terraform или Terragrunt. Используя Terragrunt, я знаю, что мы можем переопределить источник модуля в локальный каталог, но, похоже, это не позволяет нам использовать другое репо.

Вариант использования - поддержка репозитория разработки и живого репозитория. Разработчики будут использовать другой репозиторий для разработки модулей, чем для производственного / реального развертывания.

Я знаком с использованием подхода Terragrunt для разделения сред. Мы можем пойти по этому пути, например конфигурации в живых папках будут указывать на одно репо, а конфигурации в папках dev / qa указывают на другое репо.

Фрагмент кода:

module "s3_module" {
  source = "${var.source_url}"
  bucket_name = "thereoncewasakingguardinghisgardenallalone"
}

Ошибка:

Ошибка загрузки модулей: Ошибка загрузки модулей: ошибка загрузки 'file: /// home / vagrant / code / Terraform / Examples / Lab-US-West-1 / $ {var.source_url}': ошибка исходного пути: stat / home / vagrant / code / Terraform / Examples / Lab-US-West-1 / $ {var.source_url}: нет такого файла или каталога


person Kilmore    schedule 14.09.2019    source источник


Ответы (1)


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

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

Для этого требуется запустить службу, реализующую протокол реестра, который по сути просто дополнительный уровень косвенного обращения к источникам модулей, который позволяет определять их удаленным сервером, а не жестко задавать их в конфигурации. Если реестр модулей запущен на terraform.example.com, то исходные строки модуля могут выглядеть примерно так:

module "s3_module" {
  source = "terraform.example.com/any-namespace/s3/aws"

  bucket_name = "thereoncewasakingguardinghisgardenallalone"
}

Протокол реестра может возвращать адреса источника модулей любого типа, который поддерживает Terraform, включая git:: для репозиториев git. Поэтому вы можете настроить реестр так, чтобы указанный выше адрес модуля вел в обычный репозиторий Git, чтобы это было удобно для разработчиков.

По умолчанию Terraform будет использовать протокол обнаружения служб для поиска расположение API реестра для terraform.example.com. Вы должны настроить основной документ обнаружения службы так, чтобы он ссылался на реестр, который будет использоваться вне производственной среды, чтобы избежать необходимости ручной настройки в системе каждого разработчика.

В вашей производственной системе - где предположительно Terraform работает в некоторой степени автоматизации - вы можете использовать Конфигурация CLI, чтобы переопределить обнаружение terraform.example.com, чтобы указать на другой API реестра, который больше подходит для вашей производственной среды:

# Note that this goes in the _CLI configuration_, which is *not* the
# same thing as the .tf files that describe your infrastructure.

host "terraform.example.com" {
  services = {
    "modules.v1" = "https://production-terraform.example.com/modules/"
  }
}

С такой конфигурацией CLI Terraform будет интерпретировать terraform.example.com по-разному и вместо этого будет использовать этот другой API реестра, где вы потенциально можете настроить выбор только упакованных модулей в корзине AWS S3 или любые другие ограничения, которые кажутся подходящими для производства.

Terraform Cloud и Enterprise имеют встроенный частный реестр модулей, но вы можете развернуть все, что использует тот же протокол, в вашей собственной инфраструктуре и использовать его вместо этого, если вы правильно настроили протокол обнаружения сервисов. У HashiCorp нет официального частного реестра, который вы можете запустить самостоятельно, но есть несколько реализаций протокола сообщества, и наиболее важные части протокола (перечисление доступных версий и поиск URL-адреса для загрузки) достаточно просты, чтобы их можно было поддержать статический веб-сайт, обслуживаемый AWS S3 или аналогичным.

person Martin Atkins    schedule 17.09.2019