我来了解一下 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的目录,并在其中创建了一个与所创建的工作区同名的目录。
此外,还可以确认当前工作区名称已被替换为${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 上,状态文件是如何存储的?
简单地说,Workspace被追加了一个后缀,其形式是env:workspace_name。我认为这是Azure提供商的规范,但是对于其他后端如consul、s3和etcd,可能会有不同的行为。
下一步
因为我对State的理解比较浅,所以很想阅读一下关于State的章节。