有没有可能;“变量化”;Terraform中模块的源路径?

有没有可能;“变量化”;Terraform中模块的源路径?,terraform,terragrunt,Terraform,Terragrunt,是否可以在Terraform或Terragrunt中为模块源使用变量。使用Terragrunt,我知道我们可以将模块源代码覆盖到本地目录,但它似乎不允许我们使用不同的repo 该用例用于支持开发存储库和活动存储库。开发人员将使用与生产/实时部署不同的存储库来开发模块 我熟悉使用Terragrunt方法来分离环境。我们可以这样做,例如,live文件夹中的配置将指向一个repo,而dev/qa文件夹中的配置将指向另一个repo 代码片段: module "s3_module" { source

是否可以在Terraform或Terragrunt中为模块源使用变量。使用Terragrunt,我知道我们可以将模块源代码覆盖到本地目录,但它似乎不允许我们使用不同的repo

该用例用于支持开发存储库和活动存储库。开发人员将使用与生产/实时部署不同的存储库来开发模块

我熟悉使用Terragrunt方法来分离环境。我们可以这样做,例如,live文件夹中的配置将指向一个repo,而dev/qa文件夹中的配置将指向另一个repo

代码片段:

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


下载模块时出错:加载模块时出错:下载时出错'file:///home/vagrant/code/Terraform/Examples/Lab-US-West-1/${var.source\u url}”:源路径错误:stat/home/vagrant/code/Terraform/Examples/Lab-US-West-1/${var.source\u url}:没有这样的文件或目录

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将用于查找
Terraform.example.com
的注册表API的位置。您应该将主服务发现文档设置为引用将在生产之外使用的注册表,以避免在每个开发人员的系统上进行手动配置

在您的生产系统中(可能Terraform正在某种程度的自动化中运行),您可以使用设置覆盖
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 bucket中的打包模块,或任何其他适合生产的约束

Terraform Cloud和Enterprise有一个内置的私有模块注册表,但是如果您正确设置了服务发现协议,您可以在自己的基础设施上部署任何与相同协议对话的内容,并使用它。HashiCorp没有一个官方的私有注册中心,您可以自己运行,但是有一些协议的社区实现,协议的最重要部分(列出可用版本并查找下载URL)非常简单,可以由AWS S3或类似的静态网站提供支持