是否可以在Terraform中“可变化”模块的源路径?

时间:2019-09-14 16:48:50

标签: terraform terragrunt

是否可以在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}:没有这样的文件或目录

1 个答案:

答案 0 :(得分:1)

Terraform不允许使用类似的模块源,因为模块安装发生在terraform init期间,因此必须在评估主代码之前静态地做出所有决定,这与依赖关系安装在许多其他语言中的工作方式类似。

与其他调用方(例如开发人员)相比,实现生产自动化不同模块视图的另一种方法是使用Terraform的本机模块注册机制及其相关的服务发现协议。

要执行此操作,需要运行实现the registry protocol的服务,这实际上只是模块源的间接级别,允许模块由远程服务器确定而不是在配置中进行硬编码。如果您的模块注册表在terraform.example.com上运行,则模块源字符串可能如下所示:

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

  bucket_name = "thereoncewasakingguardinghisgardenallalone"
}

注册表协议可以返回Terraform支持的任何类型的模块源地址,包括git::的git存储库。因此,您可以设置注册表,使上面的模块地址指向常规的Git存储库,以便为开发人员提供方便。

默认情况下,Terraform将使用its service discovery protocol查找terraform.example.com的注册表API的位置。您应该设置主服务发现文档以引用将在生产环境之外使用的注册表,以避免在每个开发人员的系统上进行手动配置。

在您的生产系统(大概Terraform以某种自动化方式运行)中,您可以使用CLI Configuration设置来覆盖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或类似网站提供的静态网站。