理想的terraform工作空间项目结构

时间:2017-08-16 15:33:55

标签: terraform infrastructure

我想设置Terraform来管理dev / stage / prod环境。所有环境中的基础架构都是相同的,但每个环境中的变量都存在差异。

现在Terraform 0.10引入了工作空间,理想的Terraform项目结构是什么样的?在命名/标记基础架构时如何引用工作区?

2 个答案:

答案 0 :(得分:6)

我不建议在静态环境中使用工作区(以前的环境'),因为它们会增加一些复杂性并且难以跟踪。

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

相反,我仍然主张separate folders for every static environment并使用符号链接在所有环境中保留所有.tf文件,并在terraform.tfvars文件中保留每个环境中的任何差异。

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

答案 1 :(得分:1)

在旧世界中,您可能在运行terraform时传递了var'environment',您将在.tf文件中插入"${var.environment}"

使用工作区时,无需传入环境变量,只需确保您位于正确的工作区中,然后使用"${terraform.workspace}"

插入.tf文件内部

至于你如何管理所有变量,我建议使用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'的状态。