我来了解一下 Terraform 的 Workspace

在部署基础设施之前,有一个要求希望测试Terraform脚本,因此决定考虑使用Workspace,于是我尝试了一下。

工作空间是一个术语,它指的是一个人或团队用来进行工作的区域或环境。

Workspace是用来管理具有一个配置文件的多个实例的后端。具体来说,通过指定工作区,可以管理多个状态文件。

阅读文件后,典型的用途似乎是在将基础设施脚本应用到生产环境之前,希望实际部署并进行测试的需求。这个目的非常适合本次的情况。

入门指南

Terraform脚本

准备一个简单的Terraform脚本。虽然这个脚本是针对Azure创建的,但最简单的方式是即使选择并创建/删除资源。

terraform.tf 的中文翻译选项:terraform.tf

provider "azurerm" {
  version = "=1.39.0"
}

resource "azurerm_resource_group" "test" {
  name     = "testResourceGroup1"
  location = "West US"

  tags = {
    environment = "${terraform.workspace} branch"
  }
}

添加工作空间

$ terraform workspace new test

似乎有这样的选项。

$ terraform workspace new --help
Usage: terraform workspace new [OPTIONS] NAME [DIR]

  Create a new Terraform workspace.


Options:

    -lock=true          Lock the state file when locking is supported.

    -lock-timeout=0s    Duration to retry a state lock.

    -state=path    Copy an existing state file into the new workspace.

通过list命令可以看到工作区从默认(default)切换到了另一个状态。默认工作区与以前相同,在当前目录下创建了一个状态(state)文件。

$ terraform workspace list
  default
* test   

申请的实施

执行terraform apply命令后,可以看到生成了名为terraform.tfstate.d的目录,并在其中创建了一个与所创建的工作区同名的目录。

image.png

此外,还可以确认当前工作区名称已被替换为${terraform.workspace}。

$ terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # azurerm_resource_group.test will be created
  + resource "azurerm_resource_group" "test" {
      + id       = (known after apply)
      + location = "westus"
      + name     = "testResourceGroup1"
      + tags     = {
          + "environment" = "test branch"
        }
    }

指定后端时的行为

在Terraform中,可以指定保存状态的后端。当指定后端时,工作空间会如何工作呢?
下面的示例是使用Azure后端(存储账户),但还可以指定其他各种后端。标准后端。

更新tf文件以使用后端。

provider "azurerm" {
  version = "=1.39.0"
}
terraform {
    backend "azurerm" {
        resource_group_name = "RemoveTerraform"
        storage_account_name = "tsushistatetf"
        container_name = "tfstate"
        key = "terraform.tfstate"
    }
}
resource "azurerm_resource_group" "test" {
  name     = "testResourceGroup1-${terraform.workspace}"
  location = "West US"

  tags = {
    environment = "${terraform.workspace} branch"
  }
}

在这个配置中,你需要提前在名为RemoveTerraform的资源组中创建一个名为tsushistatetf的存储账户。此外,你还需要提前创建一个名为tfstate的容器,并将其放入存储账户中。

通过指定键,你可以设置存储对象在后端的存储名称。在这次的设置中,我选择了相同的terraform.tfstate。

顺便说一句,如果指定了后端,就需要重新运行terraform init。据说如果已经有了tfstate文件,它会帮我们迁移,但此次没有,所以没有进行迁移。

$ terraform init

创建工作空间

好的,我们来创建两个工作区,然后试着应用。

$ terraform workspace new test
$ terraform apply 
$ terraform workspace new pr-branch-one
$ terraform apply 

在 Storage Account 上,状态文件是如何存储的?

image.png

简单地说,Workspace被追加了一个后缀,其形式是env:workspace_name。我认为这是Azure提供商的规范,但是对于其他后端如consul、s3和etcd,可能会有不同的行为。

下一步

因为我对State的理解比较浅,所以很想阅读一下关于State的章节。

广告
将在 10 秒后关闭
bannerAds