我们大量使用 Terraform 进行 AWS 云配置。我们的基础地形结构如下所示:
├─ modules
├── x
├── y
├─ environments
├── dev
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── uat
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf
当我们达到了我们拥有许多模块和许多环境的地步时,代码重复现在变得更加令人头疼,我们希望尽可能多地摆脱它。
我们目前主要关注的是
output.tf
文件 - 每次我们扩展现有模块或添加新模块时,我们都需要为其设置特定于环境的配置(这是预期的),但我们仍然必须复制/粘贴所需的分成 output.tf
以输出配置结果(如 IP 地址、AWS ARN 等)。有没有办法摆脱重复的
output.tf
文件?我们是否可以在模块本身中定义所需的输出,并在我们为特定环境运行 terraform 时查看所有定义的输出? 最佳答案
我们构建并开源了 Terragrunt 来解决这个问题。 Terragrunt 的功能之一是能够下载远程 Terraform 配置。这个想法是,您只需在单个存储库中为您的基础设施定义一次 Terraform 代码,例如,名为 modules
:
└── modules
├── app
│ └── main.tf
├── mysql
│ └── main.tf
└── vpc
└── main.tf
此 repo 包含典型的 Terraform 代码,但有一个区别:代码中在不同环境之间应该不同的任何内容都应作为输入变量公开。例如,app 模块可能会公开以下变量:
variable "instance_count" {
description = "How many servers to run"
}
variable "instance_type" {
description = "What kind of servers to run (e.g. t2.large)"
}
在一个单独的 repo 中,例如,live,您定义所有环境的代码,现在每个组件只包含一个
.tfvars
文件(例如 app/terraform.tfvars
、 mysql/terraform.tfvars
等)。这为您提供以下文件布局:└── live
├── prod
│ ├── app
│ │ └── terraform.tfvars
│ ├── mysql
│ │ └── terraform.tfvars
│ └── vpc
│ └── terraform.tfvars
├── qa
│ ├── app
│ │ └── terraform.tfvars
│ ├── mysql
│ │ └── terraform.tfvars
│ └── vpc
│ └── terraform.tfvars
└── stage
├── app
│ └── terraform.tfvars
├── mysql
│ └── terraform.tfvars
└── vpc
└── terraform.tfvars
请注意,任何文件夹中都没有 Terraform 配置(
.tf
文件)。相反,每个 .tfvars
文件指定一个 terraform { ... }
块,该块指定从何处下载 Terraform 代码,以及该 Terraform 代码中输入变量的特定环境值。例如,stage/app/terraform.tfvars
可能如下所示:terragrunt = {
terraform {
source = "git::[email protected]:foo/modules.git//app?ref=v0.0.3"
}
}
instance_count = 3
instance_type = "t2.micro"
prod/app/terraform.tfvars
可能如下所示:terragrunt = {
terraform {
source = "git::[email protected]:foo/modules.git//app?ref=v0.0.1"
}
}
instance_count = 10
instance_type = "m2.large"
有关更多信息,请参阅 Terragrunt documentation。
关于amazon-web-services - Terraform 环境 - 如何让它变干,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49388931/