我们大量使用 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.tfvarsmysql/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/

10-16 04:12