反向目标覆盖检查后端 应用发布错误警告并错过部分目标覆盖
作者: Abhirup0创建于 2026年9月6日更新于 2026年9月16日
标签bug
QQ Terraform 版本
贝壳 地平面v1.17.0-dev/主(承诺c571b6ac82)
QQ Terraform 配置文件
***************************** ******** ****** *****
三角形 {
需要的提供者 {
无效={
来源="桥公司/倒"
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
资源“ null resource” “ a” QQ
资源“ null request” “ b” QQ
QQ 调试输出
N/A(行为在CLI标准输出中直接被观察到,通过单位测试可复制)
• 预期行为
在应用包含多个目标资源的被保存计划(如:law resource.a和law resource.b)时,将-target=null resource.a'通过applely'不能缩小或过滤计划中文件中已经计算过的更改。
Terraform应警告用户,计划文件包含额外的目标(null resource.b),尽管有"-target=null resource.a"的旗帜,但仍会被应用.
实际行为
Terraform以零警告完全无声运行,并应用了两种资源:
页:1 无效资源. a: 正在创建... 无效资源. b: 正在创建... free resource.a: 0s后完成创建 [id=6482619472648123912] free resource.b: 0s后完成创建 [id=3194827501928472911]
应用完成! 资源:新增2个,变更0个,销毁0个.
没有向用户说明他们的 " 目标 " 旗帜被置之不理,并且使用了 " 无效资源 " b。
* 重现步骤
1. 制定有两个目标的计划:
三角形计划 - 目标=null resource.a - 目标=null resource.b -out=test.tfplan
2. 试图仅采用所节省的计划之一:
三角形应用 - 目标=nall resource.a test.tfplan
3. 注意既采用无资源.a,又采用无资源.b,没有发出警告诊断。
++ 附加上下文
这涉及到最近在 " 内部/后端/本地/后端 apply.go " 中增加的PR#38698(承诺c571b6ac82):
开始
如果为 len( op.) 。 目标)!=0{.
/ 目标旗帜是否都与计划中的目标相匹配?
为 ,目标:=范围操作。 目标{
发现 := 虚假
目标:=范围计划。 目标添加器{
如果目标。 目标( 目标) {
发现=真实
换行
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
如果发现 {
// 发出警告
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
在这个块中有两个不同的逻辑问题:
- 反向封装检查: 目标 目标目标(计划目标) " 检查CLI目标是否包含计划目标,而不是计划目标是否包含CLI目标.
- 如果计划针对
module.foo',而用户运行applic=module.foo.null resource.bar',module.foo.null resource.bar.TargetContains(module.foo)',则返回错误。 这发出了虚假的警告,表示资源与计划文件中的目标不符,尽管它被列入module.foo'。 - 如果计划针对
module.foo.null resource.bar',用户运行apply-target=module.foo',则返回真实,不发出警告。
- 子集/重新瞄准盲点: 检查只是核实 . . . . . . .
内容来源: hashicorp/terraform