2017-08-16 168 views
3

我想设置Terraform来管理开发/阶段/产品环境。所有环境中的基础设施都是相同的,但每个环境中的变量都存在差异。理想的terraform工作区项目结构

现在Terraform 0.10中已经引入了工作空间,理想的Terraform项目结构是什么样的?在命名/标记基础设施时如何参考工作区?

回答

2

我不推荐在静态环境中使用工作空间(以前称为“环境”),因为它们添加了一点点复杂性并且难以跟踪。

您可以在所有环境中使用单个文件夹结构,使用工作区来分隔环境,然后使用基于工作区的条件值来设置差异。在实践中(特别是超过2个环境导致嵌套三元语句),您可能会发现难以管理。

相反,我仍然会为每个静态环境提倡单独的文件夹,并使用符号链接来保持所有.tf文件在所有环境中都相同,并提供一个terraform.tfvars文件以在每个环境中提供任何差异。

我会推荐用于动态环境的工作空间,例如短暂的审查/实验室环境,因为这可以提供很大的灵活性。我目前正在使用它们在Gitlab CI中创建审阅环境,因此每个分支都可以有一个可选的部署审阅环境,可用于手动集成或探索性测试。

1

在旧世界中,当运行terraform时,您可能已经在var'environment'中传入,您将在.tf文件中插入内容为"${var.environment}"

当使用工作区,也没有必要在环境变量来传递,你只要确保你是在正确的工作区,然后你.tf文件内插值与"${terraform.workspace}"

至于你如何管理所有的变量,我建议使用varmap,像这样:

variable "vpc_cidr" { 
    type = "map" 

    default = { 
    dev = "172.0.0.0/24" 
    preprod = "172.0.0.0/24" 
    prod = "172.0.0.0/24" 
    } 
} 

这将随后在aws_vpc资源引用使用查找

"${lookup(var.vpc_cidr, terraform.workspace)}" 

创建和选择工作的过程是很容易的:

terraform workspace 
Usage: terraform workspace 

    Create, change and delete Terraform workspaces. 


Subcommands: 

    show  Show the current workspace name. 
    list  List workspaces. 
    select Select a workspace. 
    new  Create a new workspace. 
    delete Delete an existing workspace. 

所以创建预生产新的工作区,你会做到以下几点: terraform workspace new preprod

,如果你跑了一个计划,你会发现应该没有资源。这将在后端做什么是创建一个新的文件夹来管理'preprod'的状态。

+1

在之前的项目中,我们使用文件夹来区分不同的环境。所以有一个名为模块的文件夹与所有模块,然后在提供程序文件夹中,我们为每个环境(DEV,TEST,PREPRD,...)创建了单独的文件夹。工作区是否意味着这不再是必要的?因为我认为TF网站上的解释有些模糊。 – Bjorn121

+0

@ Bjorn121这是我试图找出,他们的网站上的文档似乎说这仍然是从我的理解推荐。他们的最佳实践回购也过时了。你有没有发现它? –