🎁 立即注册,最多可免费使用 30 分钟在线 AI,无需信用卡。

Terraform 面试问题与答案:关于状态、模块和安全变更的 25 个问题

August 28, 2026
Terraform 面试问题与答案,涵盖状态、后端、锁定、模块、环境、漂移、导入、生命周期规则和安全变更工作流。
Terraform 面试问题与答案:关于状态、模块和安全变更的 25 个问题
terraform 面试问题
terraform 面试问题与答案
terraform 状态面试
devops terraform 面试

Terraform 面试的重点在 state,因为大多数实际问题都出在 state 上:谁持有它、谁能同时修改它,以及当现实与它发生偏离时会发生什么。接下来才是模块、环境、安全变更,以及你如何在团队中运行 Terraform。

以下是 25 道面试题及参考答案。HashiCorp 在 2023 年更改了 Terraform 的许可证,社区分叉 OpenTofu 也随之出现,所以如果面试中提到,可以说明团队用的是哪一个。两者的核心概念和命令是一样的。

基础

1. 什么是 Terraform?什么是基础设施即代码?

Terraform 是一种用配置文件定义基础设施、并通过 provider API 将其应用的工具。基础设施即代码意味着这套配置被写下来、纳入版本控制、经过评审、可重复执行,而不是在控制台里点出来的。

2. 声明式和命令式有什么区别?

Terraform 是声明式的:你描述想要的最终状态,Terraform 自己算出步骤。而命令式脚本里,步骤由你自己写,跑两次可能就会出问题。

3. Terraform 的主要命令有哪些?

命令作用
terraform init下载 provider 和模块,初始化 backend
terraform validate检查配置是否合法
terraform fmt格式化文件
terraform plan显示将要发生的变更
terraform apply执行变更
terraform destroy删除所管理的资源
terraform import将已有资源纳入管理
terraform state查看和编辑 state

4. 什么是 provider、resource 和 data source?

provider 是一个插件,用来与 AWS、Azure、Kubernetes 等 API 通信。resource 是 Terraform 创建并管理的东西。data source 用来读取已存在对象的信息,比如已有的 VPC 或最新的 AMI。

5. 什么是变量、输出和 locals?

输入变量用于给配置参数化。输出用于暴露值,供命令行或其他模块使用。locals 是模块内部命名的表达式,用来避免重复。

State

6. 什么是 Terraform state 文件?为什么它很重要?

State 把你的配置和真实资源对应起来,并保存它们的属性。Terraform 通过对比配置、state 和现实世界来规划变更。丢了 state,Terraform 可能会试图重建已经存在的资源。state 里还可能包含敏感信息,所以要按敏感数据对待。

7. State 应该存在哪里?

放在远程 backend,而不是某个人的笔记本上,比如 S3 加 DynamoDB 表或较新的 S3 原生锁、Azure Storage、Google Cloud Storage,或者 Terraform Cloud。给存储桶开启版本控制、加密,并限制访问权限。

8. 什么是 state 锁?

它防止两个人或两条流水线同时 apply 而损坏 state。大多数远程 backend 都支持。如果某次运行崩溃了,你可能需要用 terraform force-unlock 释放残留的锁,但在此之前要确认没有其他人还在 apply。

9. 什么是漂移(drift)?怎么处理?

漂移是指真实基础设施与 state 不一致,通常是因为有人手动改了它。terraform plan(或 plan -refresh-only)能显示出来。你要决定是通过 apply 把改动回退,还是更新代码去匹配现状。

10. 如何把已有资源纳入 Terraform 管理?

先写好 resource 块,然后运行 terraform import <address> <id>,或者在较新版本中使用 import 块。之后运行 plan,调整代码直到它显示没有变更。

11. 如何按环境或团队拆分 state?

每个环境和组件使用独立的 state,比如网络一个、每个应用一个、每个环境一个。这样可以限制影响范围,并加快 plan 速度。通过输出和数据源或远程 state 来共享值。

模块与结构

12. 什么是模块?什么时候需要编写模块?

模块是一组可复用的资源,带有输入和输出。当你反复使用相同的模式(比如一个 VPC 或一个服务),并且希望有一个经过统一审查的版本时,就应该编写模块。模块要保持小而专注,提供合理的默认值,并且做好版本管理。

13. 你如何管理开发、预发布和生产环境?

常见的做法是使用独立的目录或仓库,各自拥有自己的状态文件和变量文件,或者使用工作区。许多团队倾向于为每个环境使用独立的状态,因为工作区共享同一份代码,很容易误操作到错误的环境。使用相同的模块,但传入不同的变量值。

14. 什么是工作区?

工作区是同一个后端和配置中的命名状态。它们适合用于同一套配置的临时副本,比如按分支创建的测试环境,但不适合用来做生产环境的强隔离。

15. count 和 for_each 有什么区别?

count 按位置索引创建若干份副本。for_each 根据 map 或 set 中的每一项创建一份,以名称为键。优先使用 for_each,因为从 count 列表中间删除一项会导致索引偏移,可能造成资源的销毁和重建。

16. depends_on 有什么作用?

当 Terraform 无法从引用关系中推断出依赖时,它用来添加显式依赖。要少用,因为大多数依赖关系都可以通过引用另一个资源的属性来自动建立。

安全变更与操作

17. 什么是生命周期规则?

create_before_destroy 先创建替换资源,prevent_destroy 阻止删除,ignore_changes 跳过在 Terraform 之外被修改的属性,replace_triggered_by 在另一个资源发生变化时强制替换。

18. 在 Terraform 中如何处理密钥?

不要硬编码。使用密钥管理服务或环境变量,将变量和输出标记为 sensitive,并且要记住值仍然可能出现在状态文件中,所以要保护好状态。避免通过版本控制中的明文变量文件传递密钥。

19. 如何安全地审查和应用变更?

在拉取请求中运行 plan,审查计划输出,要求审批,然后从流水线中使用保存的计划来应用,确保审查的内容就是实际执行的内容。注意计划中的销毁或替换行。

20. 计划显示将销毁并重建一个数据库,你怎么办?

停下来,查明原因。常见原因包括不可变属性发生了变化、资源被重命名,或者模块被移动。使用 moved 块或 terraform state mv 来修复地址变更,视情况使用 ignore_changes 或 prevent_destroy,并在任何有风险的 apply 之前做好备份。

21. 如何在不销毁资源的情况下重命名或移动资源?

在代码中使用 moved 块,或者用 terraform state mv 更改它在状态中的地址。然后运行 plan,确认没有销毁操作。

22. 如何锁定版本?

使用 required_version 指定 Terraform 版本,使用 required_providers 加版本约束,并提交 .terraform.lock.hcl 文件,确保所有人使用相同的 provider 构建版本。有意识地升级,并阅读变更日志。

实践与场景题

23. 什么是 provisioner?应该使用它们吗?

Provisioner 在资源创建后在其上运行脚本。它们是最后的手段,因为不被状态跟踪,失败也很难处理。优先使用 cloud-init、用 Packer 等工具构建的镜像,或者配置管理工具。

24. 你会如何为一个有多个环境的团队组织 Terraform?

“一个仓库存放共享模块,带版本发布;另一个 live 仓库按环境和组件划分目录。每个都有自己带锁的远程状态。流水线在拉取请求时运行 fmt、validate 和 plan,需要审批,合并后执行 apply。访问通过短期凭证,策略检查拦截有风险的变更。”

25. 有人在控制台修改了资源,现在 Terraform 想要还原它。你怎么办?

先查明他们为什么修改。如果是紧急修复,就更新代码使其一致并 apply,这样变更就保留下来了。如果是误操作,就 apply 还原。然后加上管控措施,比如限制控制台的写权限,防止再次发生。

如何准备

创建一个小项目,包含远程后端、一个模块和两个环境。练习用 moved 块重命名、导入资源,以及修复漂移。准备好讲述一次计划出乎你意料的经历,以及你是怎么处理的。关于相关的云话题,请参阅我们的 AWS 面试指南 和 Kubernetes 指南。

把答案大声说出来,尤其是状态相关的问题,这些地方解释起来容易混乱。模拟面试的文字记录能看出你在哪里卡壳。在任何实时面试中,遵守雇主关于 AI 工具的规定。

使用 YesToTheOffer 练习 Terraform 面试答案

进行模拟技术面试,大声解释状态和模块,然后回顾你的记录。30 分钟免费,无需订阅。

iOS & Android — 即将推出
查看价格