gpt4 book ai didi

terraform - 是否可以将 "variableize"设为 Terraform 中模块的源路径?

转载 作者:行者123 更新时间:2023-12-04 17:32:53 25 4
gpt4 key购买 nike

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

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

我熟悉使用 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_url}”时出错:源路径错误:stat/home/vagrant/code/Terraform/Examples/Lab-US-West-1/${var.source_url}: 没有这样的文件或目录

最佳答案

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

实现为生产自动化提供与其他调用者(例如开发人员)不同的模块 View 的目标的另一种方法是使用 Terraform 的 native 模块注册表机制及其相关的服务发现协议(protocol)。

要做到这一点,需要运行一个实现 the registry protocol 的服务。 ,这本质上只是对模块源的额外间接级别,允许它们由远程服务器决定,而不是在配置中进行硬编码。如果您的模块注册表在 terraform.example.com 运行那么您的模块源字符串可能如下所示:

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

bucket_name = "thereoncewasakingguardinghisgardenallalone"
}

注册表协议(protocol)可以返回 Terraform 支持的任何类型的模块源地址,包括 git::对于 git 存储库。所以你可以设置registry,让上面的模块地址指向一个普通的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 具有内置的私有(private)模块注册表,但您可以在自己的基础架构上部署任何使用相同协议(protocol)的内容,如果正确设置了服务发现协议(protocol),则可以使用它。 HashiCorp 没有您可以自己运行的官方私有(private)注册表,但是该协议(protocol)有一些社区实现,并且该协议(protocol)最重要的部分(列出可用版本和查找下载 URL)非常简单,它们可以由由 AWS S3 或类似服务提供的静态网站。

关于terraform - 是否可以将 "variableize"设为 Terraform 中模块的源路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com