在 Terraform 中使用多个环境/变量

Kar*_*hik 7 amazon-web-services terraform

我们使用 terraform 在 AWS 中启动我们的基础设施,我们有 3 个独立的环境:Dev、Stage 和 Prod

Dev :需要 - public、private1a、privatedb 和 privatedb2 子网 Stage & Prod :需要 - public、private_1a、private_1b、privatedb 和 privatedb2 子网

我有 main.tf、变量、dev.tfvars、stage.tfvars 和 prod.tfvars。我试图了解如何使用当前用于开发环境的 main.tf 文件,并使用 .tfvars 文件创建阶段和产品所需的资源。

terraform apply -var-file=dev.tfvars

terraform apply -var-file=stage.tfvars (除了其他子网之外,这还应该创建子网 private_1b)

terraform apply -var-file=prod.tfvars (除了其他子网之外,这还应该创建子网 private_1b)

如果您需要进一步说明,请告诉我。

谢谢,

Tho*_*rge 9

您正在尝试做的确实是正确的方法。您还必须使用terraform 工作区

Terraform 从名为“default”的单个工作区开始。该工作区很特别,因为它是默认工作区,而且永远无法删除。如果您从未明确使用过工作区,那么您只在“默认”工作区上工作过。

工作空间通过 terraform 工作空间命令集进行管理。要创建一个新的工作空间并切换到它,可以使用 terraformworkspacenew; 要切换环境,您可以使用 terraform Workspace select;ETC。

从本质上讲,这意味着您将拥有适合您所拥有的每个环境的工作空间。

让我们看一些例子。

我有以下文件:

  1. 主.tf
  2. 变量.tf
  3. dev.tfvars
  4. 生产.tfvars

主.tf

该文件包含VPC模块9可以是c)的任何资源。我们通过 var 来调用变量。功能:

module "vpc" {
  source          = "modules/vpc"
  cidr_block      = "${var.vpc_cidr_block}"
  subnets_private = "${var.vpc_subnets_private}"
  subnets_public  = "${var.vpc_subnets_public}"
}
Run Code Online (Sandbox Code Playgroud)

变量.tf

该文件包含我们所有的变量。请注意,我们不会在这里分配默认值,这将确保我们 100% 确定我们正在使用 .tfvars 文件中的变量。

variable "vpc_cidr_block" {}

variable "vpc_subnets_private" {
  type = "list"
}

variable "vpc_subnets_public" {
  type = "list"
}
Run Code Online (Sandbox Code Playgroud)

基本上就是这样。我们的 .tfvars 文件将如下所示:

dev.tfvars

vpc_cidr_block = "10.40.0.0/16"
vpc_subnets_private = ["10.40.0.0/19", "10.40.64.0/19", "10.40.128.0/19"]
vpc_subnets_public = ["10.40.32.0/20", "10.40.96.0/20", "10.40.160.0/20"]
Run Code Online (Sandbox Code Playgroud)

生产.tfvars

vpc_cidr_block = "10.30.0.0/16"
vpc_subnets_private = ["10.30.0.0/19", "10.30.64.0/19", "10.30.128.0/19"]
vpc_subnets_public = ["10.30.32.0/20", "10.30.96.0/20", "10.30.160.0/20"]
Run Code Online (Sandbox Code Playgroud)

如果我想为我的开发环境运行 terraform,这些是我将使用的命令(假设工作区已创建,请参阅Terraform 工作区文档):

  1. 选择开发环境:terraform workspace select dev
  2. 运行计划以查看更改:terraform plan -var-file=dev.tfvars -out=plan.out
  3. 应用更改:terraform apply plan.out

您可以将其复制到任意数量的环境中。

  • 此答案中链接的文档明确指出,工作区不是分离不同环境(例如登台和生产)的合适方法:“特别是,组织通常希望在服务于不同开发阶段的同一基础设施的多个部署之间创建强大的分离(例如舞台与制作)或不同的内部团队。在这种情况下,用于每个部署的后端通常属于该部署,具有不同的凭据和访问控制。命名工作空间不是适合这种情况的隔离机制。 (5认同)