Terraform CLI 基础命令
Terraform 的所有功能通过单一可执行文件 terraform 暴露。输入 terraform 可查看所有可用子命令,输入 terraform <subcommand> -help 可查看单个子命令的详细用法。
INFO
init、plan、apply、destroy、validate、show、output、state、import、providers、workspace、test 等核心子命令将在后续章节中各自单独讲解。本章重点介绍全局参数与其余常用命令。
跨命令通用参数
以下参数不属于任何特定子命令,而是 Terraform CLI 的通用参数,可以附加在大多数子命令后面使用,例如 terraform init、terraform plan、terraform apply、terraform validate 等。
-no-color
禁用输出中的 ANSI 颜色转义码。在 CI/CD 日志系统(如 GitHub Actions、Jenkins)或将输出写入文件时,颜色码会产生乱码,使用 -no-color 可获得纯文本输出:
terraform init -no-color
terraform plan -no-color-input
控制 Terraform 是否在需要时提示用户交互输入。默认为 true。设为 false 时,若执行过程需要输入则直接报错退出,适合 CI/CD 等无人值守场景:
terraform init -input=false
terraform apply -input=false-lock 与 -lock-timeout
-lock=false 跳过状态文件的加锁步骤。仅在本地开发调试时临时使用,生产环境请勿关闭,否则并发执行可能导致状态文件损坏:
terraform plan -lock=false-lock-timeout 设置等待锁释放的超时时间(默认 0s,即立即失败)。适合多进程短暂竞争锁的场景:
terraform apply -lock-timeout=60s
-lock和-lock-timeout仅对涉及状态文件读写的命令有效(plan、apply、destroy等),对只读命令(version、fmt)无意义。
-json
将输出切换为机器可读的 NDJSON 格式(Newline-Delimited JSON,每行一个 JSON 对象)。适合在脚本或 CI 流水线中解析 Terraform 的执行结果:
terraform init -json
terraform validate -json输出示例:
{"@level":"info","@message":"Initializing the backend...","@module":"terraform.ui","type":"log"}
{"@level":"info","@message":"Terraform has been successfully initialized!","@module":"terraform.ui","type":"log"}TIP
在 CI 中同时使用 -json 和 -no-color 可以避免 JSON 字符串中混入颜色码。
全局参数 -chdir
通常需要先 cd 到包含 .tf 文件的目录才能运行 Terraform。-chdir 全局参数允许不切换当前目录直接指定目标路径:
terraform -chdir=environments/production plan该参数让 Terraform 在执行子命令之前切换工作目录,所有文件读写都发生在指定路径下。常用于自动化脚本和 CI/CD 流水线。
有两种情况 Terraform 会坚持使用原始工作目录:
- 处理命令行配置文件时(发生在解析
-chdir之前) - 计算
path.cwd时仍返回真实当前目录;使用path.root获取-chdir指定的路径
terraform version
检查当前安装的 Terraform 版本,同时向 HashiCorp Checkpoint 服务查询是否有新版本:
terraform versionCheckpoint 服务
Terraform 会定期与 HashiCorp Checkpoint 服务交互,发送不含用户身份信息的匿名数据,用于检查版本更新和关键安全公告。可以通过以下方式关闭:
- 设置环境变量
CHECKPOINT_DISABLE=1完全禁用 - 在命令行配置文件中设置
disable_checkpoint = true(仅关闭交互)或disable_checkpoint_signature = true(仅关闭匿名 ID 发送)
命令行自动补全
在 bash 或 zsh 中安装 Terraform 命令行自动补全:
terraform -install-autocomplete安装完成后重开 shell,输入 terraform 后按 Tab 键即可补全子命令名和常用参数。
卸载:
terraform -uninstall-autocompleteterraform fmt
将 .tf 文件格式化为 HashiCorp 标准风格(统一缩进、属性对齐、换行规范等)。强烈建议在提交代码前运行。
# 检查是否有文件需要格式化(非零退出码表示存在不规范文件)
terraform fmt -check
# 查看具体改动 diff(不修改文件)
terraform fmt -diff
# 格式化当前目录所有 .tf 文件(原地修改)
terraform fmt
# 递归格式化子目录
terraform fmt -recursiveTIP
terraform fmt -check 非常适合放在 CI 流水线里做格式强制检查,有格式问题则构建失败。
terraform console
交互式 HCL 表达式计算器。在当前工作区的上下文中实时求值任意表达式,适合调试变量、locals 和内置函数:
terraform console进入交互式 REPL 后可以输入任意 HCL 表达式:
> var.environment
"dev"
> local.name_prefix
"my-app-dev"
> length("hello world")
11
> upper("terraform")
"TERRAFORM"
> toset(["a", "b", "a"])
toset(["a", "b"])
> { for k, v in {a=1, b=2} : k => v * 2 }
{
"a" = 2
"b" = 4
}输入 exit 或按 Ctrl+D 退出。
TIP
terraform console 是理解 HCL 内置函数的最佳工具。遇到不确定某个表达式结果时,直接在 console 里试。
terraform get
下载并安装配置中 module 块引用的模块(仅处理模块,不涉及 Provider):
# 下载所有引用的模块
terraform get
# 更新已安装的模块到最新兼容版本
terraform get -update
terraform init也会执行模块下载,但terraform get仅处理模块,速度更快,适合在只新增了module块时按需调用。
terraform graph
生成资源依赖关系的有向图(DOT 格式输出):
terraform graph配合 Graphviz 可以渲染成图片:
terraform graph | dot -Tsvg > graph.svg-type 参数可指定图的类型:
terraform graph -type=plan # 计划图
terraform graph -type=apply # 应用图terraform force-unlock
在分布式团队中,如果 Terraform 进程意外中断,可能留下孤儿锁导致后续操作被阻塞。此时可以手动释放锁:
terraform force-unlock LOCK_IDWARNING
只在确认没有其他 Terraform 进程正在运行时才使用此命令,否则可能导致状态文件损坏。
terraform login / logout
用于向 Terraform Cloud / Terraform Enterprise 或其他私有 Registry 保存认证凭据(这方面的内容不是本教程的方向,仅做简略介绍):
# 交互式登录(会打开浏览器完成认证流程)
terraform login
# 登录指定 hostname
terraform login app.terraform.io
# 移除本地存储的凭据
terraform logout动手实验
在以下实验中,你将在真实终端里练习 -chdir、fmt、console、get、graph 和 force-unlock 命令:
实验环境(Azure / miniblue 版)
点击下方按钮在新标签页中打开 Azure 版 Killercoda 实验环境,预装了 Terraform + miniblue(Azure 本地模拟器)+ azlocal CLI;CLI 基础命令与 AWS 版完全一致,force-unlock 改用本地 backend + 长时 apply + kill -9 模拟孤儿锁。
打开实验环境 ↗