如何避免空"Objects have changed outside of Terraform"?
How to avoid empty "Objects have changed outside of Terraform"?
上下文:尽管这个问题与 相关,但并不完全相同。
我无法分享我的确切 TF 配置,但我的想法是我收到 一个空的“对象已在 Terraform 之外更改”警告消息?
$ terraform plan
Note: Objects have changed outside of Terraform
Terraform detected the following changes made outside of Terraform since the last "terraform apply":
Unless you have made equivalent changes to your configuration, or ignored the relevant attributes using ignore_changes, the following plan may include actions to undo or respond to
these changes.
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
No changes. Your infrastructure matches the configuration.
没有显示任何潜在的变化。
当我复制当前状态然后将其与 运行 terraform apply --auto-approve
之后的新状态进行比较时,也没有任何变化:
diff terraform.tfstate old.tfstate
4c4
< "serial": 25,
---
> "serial": 24,
217d216
< "data.foo.test",
219c218,219
< "data.bar.test2"
---
> "data.bar.test2",
> "data.bar.test2"
似乎唯一的区别是 TF 状态下的资源排序。是 TF 错误还是什么?
$ terraform version
Terraform v0.15.4
还在 GitHub 上发现了相关问题:https://github.com/hashicorp/terraform/issues/28776
这种奇怪的行为可能是为了响应特定提供商处理“刷新”步骤的方式中的怪癖而发生的。为了与使用为 Terraform v0.11 及更早版本设计的旧版 SDK 编写的 Terraform 提供程序向后兼容,计划渲染器将抑制由于该 SDK 中的 limitations/flaws 而容易出现的某些差异,例如值为 null
刷新前,但刷新后 ""
(空字符串)。
不幸的是,如果那种变化是 唯一的 变化,那么它可能会以这种方式混淆 Terraform,Terraform 可以看到存在差异,但是当它尝试渲染时它作为旧版 SDK 噪声被抑制的差异,因此最终报告没有差异。
此行为在 Terraform 的更高版本中得到改进,因此升级到最新的 v1.x.y 版本可能会避免该问题,假设这是 Terraform 团队已经解决的问题之一。
我认为您在这里看不到 状态 有任何变化的原因可能是因为没有针对您的配置差异做出任何更改, Terraform 跳过了“应用”步骤,因此实际上并未提交刷新状态。您可以通过创建和应用 refresh-only 计划强制 Terraform 将刷新更改视为要提交的内容:
terraform apply -refresh-only
假设此处行为不当的提供者在其行为不端方面是一致的(即:一旦它返回一个略有不同的值,如果它将保持返回该值),之后应用仅刷新计划,您将不会再看到此消息,因为同一对象的未来刷新将不会检测到任何此类无关紧要的差异。
上下文:尽管这个问题与
我无法分享我的确切 TF 配置,但我的想法是我收到 一个空的“对象已在 Terraform 之外更改”警告消息?
$ terraform plan
Note: Objects have changed outside of Terraform
Terraform detected the following changes made outside of Terraform since the last "terraform apply":
Unless you have made equivalent changes to your configuration, or ignored the relevant attributes using ignore_changes, the following plan may include actions to undo or respond to
these changes.
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
No changes. Your infrastructure matches the configuration.
没有显示任何潜在的变化。
当我复制当前状态然后将其与 运行 terraform apply --auto-approve
之后的新状态进行比较时,也没有任何变化:
diff terraform.tfstate old.tfstate
4c4
< "serial": 25,
---
> "serial": 24,
217d216
< "data.foo.test",
219c218,219
< "data.bar.test2"
---
> "data.bar.test2",
> "data.bar.test2"
似乎唯一的区别是 TF 状态下的资源排序。是 TF 错误还是什么?
$ terraform version
Terraform v0.15.4
还在 GitHub 上发现了相关问题:https://github.com/hashicorp/terraform/issues/28776
这种奇怪的行为可能是为了响应特定提供商处理“刷新”步骤的方式中的怪癖而发生的。为了与使用为 Terraform v0.11 及更早版本设计的旧版 SDK 编写的 Terraform 提供程序向后兼容,计划渲染器将抑制由于该 SDK 中的 limitations/flaws 而容易出现的某些差异,例如值为 null
刷新前,但刷新后 ""
(空字符串)。
不幸的是,如果那种变化是 唯一的 变化,那么它可能会以这种方式混淆 Terraform,Terraform 可以看到存在差异,但是当它尝试渲染时它作为旧版 SDK 噪声被抑制的差异,因此最终报告没有差异。
此行为在 Terraform 的更高版本中得到改进,因此升级到最新的 v1.x.y 版本可能会避免该问题,假设这是 Terraform 团队已经解决的问题之一。
我认为您在这里看不到 状态 有任何变化的原因可能是因为没有针对您的配置差异做出任何更改, Terraform 跳过了“应用”步骤,因此实际上并未提交刷新状态。您可以通过创建和应用 refresh-only 计划强制 Terraform 将刷新更改视为要提交的内容:
terraform apply -refresh-only
假设此处行为不当的提供者在其行为不端方面是一致的(即:一旦它返回一个略有不同的值,如果它将保持返回该值),之后应用仅刷新计划,您将不会再看到此消息,因为同一对象的未来刷新将不会检测到任何此类无关紧要的差异。