我想设置Terraform来管理dev / stage / prod环境。所有环境中的基础架构都是相同的,但每个环境中的变量都存在差异。
现在Terraform 0.10引入了工作空间,理想的Terraform项目结构是什么样的?在命名/标记基础架构时如何引用工作区?
答案 0 :(得分:6)
我不建议在静态环境中使用工作区(以前的环境'),因为它们会增加一些复杂性并且难以跟踪。
您可以为所有环境使用单个文件夹结构,使用工作区分隔环境,然后使用基于工作区的条件值来设置差异。在实践中(尤其是超过2个导致嵌套三元语句的环境),您可能会发现这很难管理。
相反,我仍然主张separate folders for every static environment并使用符号链接在所有环境中保留所有.tf文件,并在terraform.tfvars文件中保留每个环境中的任何差异。
我建议动态环境的工作空间,例如短期审查/实验室环境,因为这样可以提供很大的灵活性。我目前正在使用它们在Gitlab CI中创建审阅环境,因此每个分支都可以有一个可选的部署审阅环境,可用于手动集成或探索性测试。
答案 1 :(得分:1)
在旧世界中,您可能在运行terraform时传递了var'environment',您将在.tf文件中插入"${var.environment}"
。
使用工作区时,无需传入环境变量,只需确保您位于正确的工作区中,然后使用"${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'的状态。