适用于terraform中不同环境的多个后端

IAm*_*der 6 terraform

我曾经使用多个运行不同"terraform remote config"命令的.sh文件来切换不同Google Cloud项目中的桶状态文件,用于不同的环境(开发,测试和产品).

在0.9.0版本中,我知道这现在进入了一个.tf文件:

terraform {
  backend "gcs" {
    bucket = "terraform-state-test"
    path   = "terraform.tfstate"
    project = "cloud-test"
  }
}
Run Code Online (Sandbox Code Playgroud)

在0.9.0版本中,现在还有State Environment("terraform env"):

resource "google_container_cluster" "container_cluster" {
  initial_node_count = "${terraform.env == "prod" ? 5 : 1}"
}
Run Code Online (Sandbox Code Playgroud)

但是,我现在应该如何使用新的后端配置管理同一目录结构中的多个环境?

Mar*_*ins 4

在撰写本文时,Terraform 中的所有远程后端尚未更新为支持状态环境。对于那些有的人来说,每个后端对于如何表示数据存储中当前的多个状态都有自己的约定。

从版本 0.9.2 开始,“consul”、“s3”和“local”后端已更新。“gcs”后端还没有,但是一旦有了,这里描述的过程也将适用于它。

最初有一个“默认”环境,但如果您从未terraform apply选择此环境运行,那么您可以忽略它并根据需要命名您的环境。

要创建一个名为“生产”的新环境并切换到它:

terraform workspace new production
Run Code Online (Sandbox Code Playgroud)

这将在后端建立一个完全独立的状态,因此terraform plan应该表明所有资源都需要重新创建。

您可以在现有环境之间切换,如下所示:

terraform workspace select production
Run Code Online (Sandbox Code Playgroud)

在 0.9 之前,许多团队(听起来包括你的团队)编写了包装器脚本来模拟这种行为。这些脚本很可能在存储后端中没有遵循完全相同的命名约定,因此需要一些手动工作才能进行迁移。

进行迁移的一种方法是开始使用“本地”后端,它将状态存储在名为 的本地目录中terraform.state.d。在本地工作时,您可以创建所需的环境,然后小心地使用先前脚本解决方案中的现有状态文件覆盖本地目录中的空状态文件。一旦所有本地环境都具有适当的状态,您就可以将backend配置中的块更改为适当的远程后端并运行terraform init以触发所有本地环境迁移到新后端。

此后,该terraform workspace select命令将开始在远程环境而不是本地环境之间切换。

如果您选择的远程后端尚不支持环境,最好暂时继续使用脚本解决方案。这意味着terraform remote config使用 部分配置模式替换现有的包装器脚本,将特定于环境的配置传递到terraform init.

  • “工作空间”现在是早期 Terraform 版本称为“环境”的首选术语,以减少后一个术语与其他概念冲突造成的歧义。 (3认同)