
深入解读 Terraform 变更日志中的实验性功能deferred actions、test cleanup、backend/skip_cleanup 与 query -policies【免费下载链接】terraformTerraform enables you to safely and predictably create, change, and improve infrastructure. It is a source-available tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.项目地址: https://gitcode.com/GitHub_Trending/te/terraform本文以 .changes/footer-with-experiments.md 这份变更日志脚注为骨架系统梳理 Terraform CLI 中仅对 alpha 实验版本开放的四组实验特性terraform plan的-allow-deferraldeferred actions、实验性terraform test cleanup命令、terraform test新增的backend块与skip_cleanup属性、以及terraform query的-policies标志。你将掌握每一特性的启用方式、预期行为与使用边界并看到它们如何与仓库中internal/experiments、internal/configs/test_file.go、internal/moduletest等源码实现相互印证。写在前面所有实验特性只在 alpha 版本中生效变更日志脚注首先强调了一条重要前提实验Experiments只在 Terraform CLI 的 alpha 版本中启用以下列出的功能目前还不可用于稳定版本。这意味着若使用稳定版 Terraform 尝试调用-allow-deferral、backend/skip_cleanup或-policies配置解析或命令入口会直接报错而不是静默忽略。这套“当前实验/已结案实验”的管理机制在仓库中由 internal/experiments/experiment.go 实现每个实验以唯一的 HCL 标识符常量注册currentExperiments集合表示当前可选中的实验concludedExperiments映射则记录那些已经“结案”feature 落地为稳定功能或宣告失败被放弃的实验及其迁移说明。例如该文件中的unknown_instances实验结案信息是“未知实例正在被并入一个更大的 deferring 特性中”见 internal/experiments/experiment.go#L33这正是本文第一个实验特性 deferred actions 的前身脉络。一、deferred actions让count与for_each接受未知值第一项实验特性是“deferred actions延迟动作”启用方式是在terraform plan时传入-allow-deferral选项。其核心能力有两层允许module、resource、data块中的count与for_each参数取值为未知值unknown values即使遍历规模在计划阶段尚不确定也能继续推进计划生成允许 provider 对未知值作出更灵活的反应从而把“现在还不能确定”的实例推迟到后续阶段处理。在命令参数解析层该开关落实在 internal/command/arguments/extended.go#L279即f.BoolVar(operation.DeferralAllowed, allow-deferral, false, allow-deferral)默认关闭terraform test同样接收该选项见 internal/command/arguments/test.go#L51-L75 中与测试操作配套的DeferralAllowed字段。需要留意其语义边界开启后 Terraform 允许“推迟决策”不代表它能凭空确定未就绪实例的属性计划的apply仍要依据最终确定的结果执行。此特性尤其适合对未知实例规模做探索性验证在生产稳定链路上使用前必须确认 provider 支持对延迟实例的处理。二、实验性terraform test cleanup自动收拾测试留下的状态文件第二项是实验性的test cleanup子命令。其背景行为是在实验构建中执行terraform test期间每一条失败清理cleanup操作对应的 manifest 文件与状态文件会被保存在本地.terraform目录中。若每次失败都留下文件日积月累会占用磁盘并干扰后续测试。terraform test cleanup会扫描这些残留自动清理本地的状态文件无需人工干预。该命令的实现入口是 internal/command/test_cleanup.go 中的TestCleanupCommand其配套测试位于 internal/command/test_test.go#L792 附近的test/cleanupfixture。清理逻辑与测试状态管理密切耦合状态写入点会为“跳过清理”的运行记录原因StateReasonSkip见 internal/moduletest/states/manifest.go#L33后续清理路径据此区分文件归属。实际使用中建议在 CI 与本地调试后定期执行该命令避免.terraform目录无限膨胀。三、terraform test新增的backend块与skip_cleanup属性这两项让terraform test从“每次从零构建”向“可持续复用长生命周期基础设施”迈出关键一步。3.1backend块复用长生命周期的测试基础设施terraform test现在允许测试作者在run块内声明backend块。带backend块的run会从指定后端加载状态而不是每次执行都从空状态起步。由此作者可以让运行时间较长的测试基础设施在多次测试操作之间保持存活显著节省常规测试期间的重复创建时间。从状态装配的实现看带backend的 run 会通过后端工厂实例化对应类型的后端并用StateMgr(backend.DefaultStateName)取得远端状态管理器见 internal/moduletest/graph/eval_context.go#L639-L643由于状态来自外部后端同名 run 之间共享的是同一份真实状态这同时引出了与skip_cleanup的语义冲突见下节。3.2skip_cleanup按需保留 run 块产生的状态文件skip_cleanup属性既可以直接写在测试文件顶层也可以写在单个run块内。将其置为true时terraform test不会清理该 run 块产生的状态文件这些状态文件会被写盘到.terraform目录中之后可由上一节同样是实验性的terraform test cleanup命令手动清理。解析层面对该属性的校验相当严格源码集中在 internal/configs/test_file.go测试文件级与 run 级都读取skip_cleanup布尔属性若在非实验构建中出现该关键字会报出“仅实验构建可用”的诊断internal/configs/test_file.go#L654-L664、#L919-L931一个 run 若与某个声明了backend的先前 run 共享同一状态键StateKey同时又设置skip_cleanup解析器会发出重复块诊断提示“后一个 run 生效但 backend 仍会管理该状态”internal/configs/test_file.go#L418-L432对应 fixture 见 internal/configs/testdata/invalid-test-files/skip_cleanup_after_backend.tftest.hcl反向约束同样存在带backend块的 run 若显式写skip_cleanup false会被判定为非法因为backend 的存在本身就意味着清理行为被隐式跳过internal/configs/test_file.go#L934-L940。上述规则可以概括为一句话只要 run 块用了backend它的状态就不归本地清理管归后端管skip_cleanup只针对“无 backend、从空状态起步”的本地 run用来把它们的产物暂留到.terraform以便人工或test cleanup复核。四、terraform query的-policies标志把策略评估引入查询第四项实验特性面向terraform query新增-policies标志允许指定一个或多个策略集目录路径在查询操作中针对 list 块发现的资源评估策略。即查询不再只是被动拉取/罗列资源还能顺带把策略检查挂在结果之上属于策略即代码policy-as-code链路在查询场景的延伸。该标志支持重复传入以覆盖多个策略目录测试用例 internal/command/arguments/query_test.go 中即覆盖了-policies/some/path、空格分隔以及多次-policies的解析场景若在非实验构建中使用命令会以“仅实验构建有效”的错误拒绝执行相关断言见 internal/command/command_test.go。实验阶段建议先以单目录、单一 list 块的配置做最小验证再逐步叠加多策略目录组合。五、使用建议与注意事项汇总版本前提上述四组功能全部属于实验范畴只随 alpha 版 Terraform CLI 提供升级到稳定版后相关标志、块与属性会按实验机制被拒绝或提示迁移。状态文件责任边界凡是声明了backend的 run状态统一由后端管理测试过程中应避免再依赖本地.terraform下的同名文件skip_cleanup与backend混用会触发诊断设计上二选一即可。清理纪律即使开启skip_cleanup保留文件也应周期性运行实验性的terraform test cleanup避免本地残留堆叠。deferred actions 的预期管理-allow-deferral解决的是“规模未知也能计划”它不会消除最终 apply 阶段对 provider 真实能力的依赖落地前务必在目标 provider 上做端到端演练。变更回溯若需了解这些实验在后续版本中的去留与稳定化结论可关注仓库 CHANGELOG.md 以及 .changes 目录下的逐版本条目实验的注册与结案状态则可随时在 internal/experiments/experiment.go 中核对。【免费下载链接】terraformTerraform enables you to safely and predictably create, change, and improve infrastructure. It is a source-available tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.项目地址: https://gitcode.com/GitHub_Trending/te/terraform创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考