Terraform 与 OpenTofu 配置、模块、测试、状态管理及 HCL 代码审查。适用于使用 Terraform、OpenTofu、HCL、tfvars、tftest、state 等工具的场景。
Terraform & OpenTofu.是一项面向实际任务的技能,主要用于File Organization & nameing.File.Purpose.terraform.tf.Terraform + 供应商版本要求;提供者.tf. 提供方配置;
使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
| 文件 | 用途 |
|---|---|
terraform.tf |
Terraform 及 provider 版本要求 |
providers.tf |
Provider 配置 |
main.tf |
主要资源与数据源 |
variables.tf |
输入变量(按字母顺序排列) |
outputs.tf |
输出值(按字母顺序排列) |
locals.tf |
本地值 |
web_api,而非 webAPI 或 web-apiaws_instance.web_api,而非 aws_instance.web_api_instancethis 命名(即每模块中该类型仅存在一个)vpc_cidr_block,而非 cidr资源定义(Resources): count/for_each(其后空一行)→ 参数 → 嵌套块 → tags → depends_on → lifecycle(置于最后)
变量定义(Variables): description → type → default → validation → nullable
每个变量必须声明 type 和 description;每个输出必须声明 description;敏感字段须显式标记 sensitive = true。
| 类型 | 作用域 | 示例 |
|---|---|---|
| Resource Module | 单一逻辑单元 | VPC + 子网、安全组(SG)+ 规则 |
| Infrastructure Module | 多个 Resource Module 的集合 | 单区域内的网络 + 计算资源 |
| Composition | 完整基础设施部署 | 跨区域 / 跨账号部署 |
module-name/
├── main.tf, variables.tf, outputs.tf, versions.tf
├── examples/
│ ├── minimal/
│ └── complete/
└── tests/
└── defaults.tftest.hcl
保持模块轻量(单一职责原则)。examples/ 目录兼具文档说明与集成测试用例双重作用。所有对外发布的模块均须遵循语义化版本控制(Semantic Versioning)。
count 与 for_each 的选用| 场景 | 推荐方式 |
|---|---|
| 布尔开关(创建或跳过) | count = condition ? 1 : 0 |
| 带名称/键的项(可能重排序) | for_each = toset(list) 或 map |
| 固定数量的完全相同副本 | count = N |
默认优先使用 for_each —— 若从 count 列表中移除中间某一项,会导致其后所有资源被销毁重建。仅在布尔条件判断或真正完全一致的副本场景下使用 count。
| 场景 | 方法 |
|---|---|
| 快速校验 | terraform fmt -check && terraform validate |
| 提交前检查(Pre-commit) | 额外增加:tflint + trivy config . / checkov -d . |
| 逻辑校验(Terraform 1.6+) | 原生 terraform test,配合 command = plan |
| 零成本单元测试(Terraform 1.7+) | 原生测试 + mock_provider |
| 真实基础设施验证 | 原生测试配合 command = apply,或 Terratest(Go 实现) |
原生测试关键要点(.tftest.hcl 文件置于 tests/ 目录下):
command = plan 用于快速单元测试;command = apply 用于集成测试(默认行为)assert { condition = expr; error_message = "..." } —— 每个 run 块中可定义多个断言expect_failures = [var.name] 支持负向测试(例如验证非法输入是否被正确拒绝)mock_provider "aws" { mock_resource "..." { defaults = { ... } } } —— 仅适用于 plan 模式,无需凭据,CI 构建速度快variables {} 可置于文件顶层(影响全部 run 块),也可置于单个 run 块内(覆盖全局变量)run 的输出:如 run.setup.vpc_idparallel = true,后续顺序执行将自动成为同步点parallel = true 时,必须为每个并行 run 显式指定 state_key = "name"*_unit_test.tftest.hcl(plan 模式) vs *_integration_test.tftest.hcl(apply 模式)| 组件 | 策略 | 示例 |
|---|---|---|
| Terraform | 锁定次版本号(minor) | required_version = "~> 1.9" |
| Providers | 锁定主版本号(major) | version = "~> 5.0" |
| 模块(生产环境) | 精确锁定(exact) | version = "5.1.2" |
| 模块(开发环境) | 允许补丁更新(patch) | version = "~> 5.1" |
关键现代特性支持:
moved 块(1.1+)、带默认值的 optional() 类型(1.3+)、原生测试框架(1.6+)、模拟 Provider(1.7+)、跨变量校验(1.9+)、只写参数(write-only arguments,1.11+)。
Stacks(HCP —— 请查阅当前发布状态):将多个配置编排为统一部署单元 —— 建议评估其在多环境部署模式中的适用性。
.tfstate、.terraform/ 或 *.tfplan;必须提交 .terraform.lock.hcl。default_tags,确保资源标签一致性。0.0.0.0/0 入站规则。assume_role、OIDC 或密钥管理服务(如 AWS Secrets Manager)。terraform fmt -recursive —— 直接重写文件),再校验(terraform validate && tflint && trivy config .)moved { from = old; to = new } 避免销毁重建;该块在成功 apply 后应立即移除。terraform force-unlock —— 仅限确认无其他并发操作运行时使用terraform plan -refresh-only 检测,terraform apply -refresh-only 接受变更terraform apply -replace=ADDR(terraform taint 已弃用)import 块实现声明式导入;亦可使用命令行方式 terraform import ADDR ID使用 locals 结合 try() 函数控制销毁顺序,避免显式依赖 depends_on:
locals {
vpc_id = try(aws_vpc_ipv4_cidr_block_association.this[0].vpc_id, aws_vpc.this.id, "")
}
该写法强制 Terraform 在销毁 CIDR 关联前先销毁子网,从而规避删除失败错误。
cidrsubnet(var.vpc_cidr, 8, count.index) —— **禁止硬编码子网地址**provider "aws" { alias = "eu_west_1" } 定义别名 Provider,并在模块调用中以 providers = { aws = aws.eu_west_1 } 显式指定在确认完成前,请务必执行以下命令:
terraform fmt -check && terraform validate && tflint && trivy config .
所有命令必须**零错误通过**。
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章