Terraform 状态文件
在默认情况下,Terraform 将状态文件 terraform.tfstate
存储在本地。
如果一个人使用 Terraform 的话是可以的,如果是团队维护的话,就不太合适了。因为团队中的每一个成员都有可能执行 Terraform,所以每个人都有可能产生自己的状态文件。如何能够同步状态文件,并且让它们能够保持一致,将成为团队成员维护的额外负担。
Terraform 通过支持远程状态从而解决团队成员协作的使用 Terraform 的状态文件的问题。
Terraform 远端状态
Terraform 远端状态以及将 Terraform 所产生的基础设施资源的状态数据写入到远端的存储中,Terraform 支持很多远端存储类型,包括 Terraform Cloud,AWS S3,ETCD等。其中 Terraform Cloud 不仅提供免费的远端状态存储,而且配置和使用都比较简单。
Terraform Cloud 创建和设置
- 创建组织
注册 Terraform Cloud 之后,先创建一个组织。
- 输入组织名字,名字必须唯一
- 创建工具区
- 输入工作区的名称
- 设置执行模式为local
执行 terraform 命令的地方是在本地执行,而不是在 terraform cloud 上执行。
设置之后 Terraform 只用于存储和同步远端状态
Terraform Cloud 存储状态文件
配置 Terraform 后端,以便把状态文件存储到远端。
把 Terraform 状态文件存储到 Terraform Cloud 上,团队的每个成员都能共享该状态文件。
- 创建 backends.tf 文件
terraform {
backend "remote" {
hostname = "app.terraform.io" // 域名
organization = "terraform-wsj" // 组织
workspaces { // 工作区
name = "tfdemo"
}
}
}
- 创建token
- 复制令牌内容备用
- 创建 terraformrc 文件
将令牌内容写到 token 里面。
touch ~/.terraformrc
vim ~/.terraformrc
credentials "app.terraform.io" {
token = "9dgzJqU************MJH3D0II"
}
- 初始化项目
% terraform init
Initializing the backend...
Successfully configured the backend "remote"! Terraform will automatically
use this backend unless the backend configuration changes.
Initializing modules...
Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Using previously-installed hashicorp/aws v5.14.0
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
- apply 代码,状态文件会存储到 TF Cloud 上
terraform plan
terraform apply
- 查看 TF Cloud
状态锁
在执行 terraform apply
的时候会
% terraform apply
Acquiring state lock. This may take a few moments...
....
Terraform 在执行命令之前会检查状态锁,看是否有别人在使用状态,若没有人使用才会继续往下执行,当命令执行完成之后才会释放状态锁。
状态锁的好处是可以阻止多人在同一时刻同时执行Terraform,避免出现错误。
Terraform 上也可以看到状态锁的相关信息。在右边可以设置锁定状态文件。
建议锁定状态文件,有需要更新的时候再进行开启。
Terraform 工作区
通过 Terraform 工作区可以创建互相隔离的工作环境,这是由于 Terraform 将状态文件于工作区绑定在一起的缘故。
不同的工作区有不同的状态文件,在真实的工作环境中:开发环境,测试环境,生产环境的基础设施状态可能都将不同,在同一个 Terraform 代码的当前目录,很难满足多个环境的要求。为此 Terraform 提供工作区机制,解决多环境问题。当我们准备 Terraform Cloud 时,我们创建工作区管理状态文件。
Terraform 提供了 workspace 子命令用来执行有关工作区的出操作。
Terraform workspace 使用说明
terraform workspace delete 删除工作区
terraform workspace list 列出工作空间
terraform workspace new 创建新的工作空间
terraform workspace select 选择工作空间
terraform workspace show 显示当前工作区的名称
创建工作区
之前的代码可能不支持 workspace。这里新建一个目录来使用workspace。
- 新建目录
% mkdir workspace
% cd workspace
- 新建工作区
% terraform workspace new new
Created and switched to workspace "new"!
You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.
- 查看工作区
% terraform workspace list
default
* new
- 切换工作区
% terraform workspace select default
Switched to workspace "default".
% terraform workspace list
* default
new
- 删除工作区
% terraform workspace delete new
Deleted workspace "new"!
% terraform workspace list
* default