为不同的环境重用 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
块上并在其中使用它你要。
我很难理解如何在一个 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
块上并在其中使用它你要。