为不同的环境重用 Terraform 模块

Reuse Terraform modules for different environments

我很难理解如何在一个 GCP 项目中将 terraform-google-modules/terraform-google-kubernetes-engine 等模块重复用于多个环境,例如生产、暂存和开发。

我习惯了这样的结构:

├── backend.tf
├── development
│   └── development.tfvars
├── firewall.tf
├── gcp-apis.tf
├── gke.tf
├── outputs.tf
├── production
│   └── production.tfvars
├── providers.tf
├── staging
│   └── staging.tfvars
├── variables.tf
├── versions.tf
└── vpc.tf

我刚刚用值填写了 .tfvars 文件。现在我不知何故迷失了模块结构。查看 terraform-google-modules/terraform-google-kubernetes-engine example 我不确定如何为不同类型的 machines/disks.

定义多个节点池

对我来说,example in README.md 看起来不像是模板和变量的完全分离,它似乎是某种混淆(请不要冒犯,我想我只是不明白)。

更具体一点:如果我想拥有多个节点池,我需要在 development.tfvars、staging.tfvars 和 production.tfvars 中定义什么?

希望你能帮帮我。 干杯

在 Terraform 中,将模块视为单元块,您可以在不同状态 {环境} 中调用它们或使用列表迭代它们。

环境/工作空间

为每个环境创建工作区,并相应地使用 tfvars 文件,以便将每个环境跟踪到单独的状态文件中

terraform workspace create/list/switch 

迭代法

  • 使用,您只需要环境之间几乎没有相同和差异。
  • 在单个 tfvars 文件下统一您的配置并定义列表

使用 for_each 遍历列表,如

module "eks" {
  for_each = var.listed_envs  #where listed envs is a list type variable .
  source = "../path_to_module "

检查 terraform 重要函数,例如 yaml encode/decode,可以将您的变量文件更改为基于 yaml 的 .

我会更好地解释 terraform workspace 用法。

如果您想跨多个环境重用模块或资源,terraform workspace 是更好的解决方案。您需要遵循一些步骤。

让我们创建开发和生产工作区:

terraform workspace new prod
terraform workspace new dev

让我们检查一下它们是否已创建 运行 terraform workspace list,您将看到如下内容:

  default
* dev
  prod

现在我们有两个工作区,我们在 dev。由于我们想重用 gke 模块,我们需要传递我们想要更改的所有内容,在映射中使用 workspace 名称。

我们先像settings.tf一样创建一个文件,看下面的例子,随意定制你想要的一切。

locals {
  env = terraform.workspace

  disk_size_gb = {
    dev  = 50
    prod = 100
  }

  machine_type = {
    dev  = "e2-standard-2"
    prod = "e2-medium"
  }
...
}

现在我们需要在gke模块中使用我们的自定义配置,您需要做的就是:

module "gke" {
   source = "terraform-google-modules/kubernetes-engine/google"
   project_id = "<PROJECT ID>"
   name = "${local.env}-gke-cluster" #your cluster name will be dev-gke-cluster"
  ...
   disk_size_gb = local.disk_size_gb #50 for dev
   machine_type = local.machine_type #e2-standard-2 for dev
  ...
}

完成后,让我们部署:

terraform workspace select dev
terraform apply
terraform workspace select prod
terraform apply

正如我所说,您可以在模块和资源上使用这种方法。您不需要复制 terraform 代码,只需像我一样将值放在 locals 块上并在其中使用它你要。