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

时间:2018-07-03 03:37:19

标签: amazon-web-services terraform

我们正在使用terraform来提升AWS中的基础架构,我们拥有3个独立的环境:开发,阶段和产品

Dev:需要-公共,private1a,privatedb和privatedb2子网 阶段和产品:需要-公共,private_1a,private_1b,privatedb和privatedb2子网

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

terrain apply -var-file = dev.tfvars

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

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

您尝试做的确实是正确的方法。您还必须使用terraform workspaces

  

Terraform从一个名为“默认”的工作区开始。这个   工作区之所以特别是因为它是默认工作区,还因为   它永远不能被删除。如果您从未明确使用过工作区,   那么您只曾在“默认”工作区工作过。

     

工作空间使用terraform工作空间命令集进行管理。   要创建一个新的工作区并切换到它,可以使用terraform   新的工作空间;切换环境,您可以使用terraform工作区   选择;等

从本质上讲,这意味着您将为每个环境都拥有一个工作区。

让我们看一些例子。

我有以下文件:

  1. main.tf
  2. variables.tf
  3. dev.tfvars
  4. production.tfvars

main.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}"
}

variables.tf

此文件包含我们所有的变量。请不要在这里没有分配默认,这可以确保我们100%确信我们正在使用.tfvars文件中的变量。

variable "vpc_cidr_block" {}

variable "vpc_subnets_private" {
  type = "list"
}

variable "vpc_subnets_public" {
  type = "list"
}

基本上就是这样。我们的.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"]

production.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"]

如果我想在我的开发环境中运行terraform,我将使用以下命令(假设已经创建了工作空间,请参见Terraform workspace docs):

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

您可以将其复制到任意多个环境。