1.6.14.1. plan
terraform plan命令被用来创建变更计划。Terraform会先运行一次refresh(我们后面的章节会介绍,该行为也可以被显式关闭),然后决定要执行哪些变更使得现有状态迁移到代码描述的期待状态。
该命令可以方便地审查状态迁移的所有细节而不会实际更改现有资源以及状态文件。例如,在将代码提交到版本控制系统前可以先执行terraform plan,确认变更行为如同预期一般。
可选参数-out可以将变更计划保存在一个文件中,以便日后使用terraform apply命令来执行该计划。
如果Terraform检测不到任何变更,那么terraform plan会提示没有任何需要执行的变更。
1.6.14.1.1. 用法
terraform plan [options] [dir]
默认情况下,plan命令不需要参数,使用当前工作目录下的代码和状态文件执行refresh。
有如下参数可以使用:
- -compact-warnings:如果Terraform生成了一些告警信息而没有伴随的错误信息,那么以只显示消息总结的精简形式展示告警
- -destroy:生成销毁所有资源的计划
-detailed-exitcode:当命令退出时返回一个详细的返回码。如果有该参数,那么返回码将会包含更详细的含义:
0 = 成功的空计划(没有变更)
- 1 = 错误
2 = 成功的非空计划(有变更)
-input=true:在取不到值的情况下是否提示用户给定输入变量值
- -lock=true:与apply类似,不再赘述
- -lock-timeout=0s:与apply类似,不再赘述
- -no-color:关闭彩色输出
- -out=path:将变更计划保存到指定路径下的文件中,随后我们可以使用terraform apply执行该计划
- -parallelism-n:限制Terraform遍历图的最大并行度,默认值为10
- -refresh=true:计算变更前先执行refresh
- -state=path:状态文件的位置,默认为"terraform.tfstate"。如果启用了远程Backend则该参数设置无效
- -target=resource:目标资源的地址,该参数可反复声明,用以对基础设施进行部分更新
- -var 'foo=bar':与apply类似,不再赘述
- -var-file=foo:与apply类似,不再赘述
1.6.14.1.2. 部分更新
使用-target参数可以使得Terraform专注于一部分的资源。可以使用资源地址来标记这个集合。资源地址按如下规则被解释:
- 如果给定地址能够定位到一个资源,那么只该资源会被标记;如果该资源使用了count参数而没有给定具体访问下标,该资源所有实例都会被标记
- 如果给定地址定位到的不是资源而是一个模块,那么该模块内所有资源及其内嵌模块资源都会被标记
这种标记部分资源并计算更新计划的能力是为了一些比较罕见的场景设计的,例如从先前的错误中恢复或是绕过某些Terraform的设计限制。对于常规操作不推荐使用-target参数,因为它会造成无法检测的配置漂移以及使人无法从代码推导出当前真实的状态。
1.6.14.1.3. 安全警告
被保存的变更计划文件(使用-out参数)内部可能含有敏感信息,Terraform本身并不会加密计划文件。如果你要移动或是保存该文件一段时间,强烈建议你自行加密该文件。
Terraform未来打算增强计划文件的安全性。