terraform plan 通知基础设施的变化,但也说没有变化

Posted

技术标签:

【中文标题】terraform plan 通知基础设施的变化,但也说没有变化【英文标题】:terraform plan notifies of changes in infrastructure but also saying No changes 【发布时间】:2021-08-12 09:52:31 【问题描述】:

当我跑步时

terraform plan

它显示了由 Terraform 所做的更改列表,并且在输出结束时,它还通知“没有更改。您的基础架构与配置匹配。”:

Note: Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the last "terraform apply":

  # google_sql_database_instance.db1 has been changed
  ~ resource "google_sql_database_instance" "db1" 
        id                            = "db1"
        name                          = "db1"
        # (12 unchanged attributes hidden)

....
whole list of objects to update
....
....

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.

Your configuration already matches the changes detected above. If you'd like to update the Terraform state to match, create and apply a refresh-only plan:
  terraform apply -refresh-only

不知道为什么它首先说基础设施发生了变化,但又说配置与基础设施相匹配。 我运行了一个“应用”测试,Terraform 没有改变任何东西,但我想知道为什么它会显示这两个不同的语句,并且还想确保没有任何意外更改。

【问题讨论】:

【参考方案1】:

当 Terraform 创建计划时,它会为您的每个资源实例执行两个单独的操作:

从远程系统读取与对象关联的最新值,以确保 Terraform 考虑到您在 Terraform 之外所做的任何更改。 将更新后的对象与配置进行比较以查看是否存在任何差异,如果存在差异,则提出 Terraform 将采取的措施以使远程对象与配置匹配。

您分享的输出是关于这两个步骤的。 Terraform 首先报告说,当它读取最新值时,它检测到某些东西在 Terraform 之外已经发生了变化,并解释了它检测到的内容。然后,它将这些更新的对象与您的配置进行比较,发现您的配置已经匹配,因此 Terraform 不需要对您的基础架构进行任何其他更改。

输出的最后一段包括“您的配置已经与上面检测到的更改匹配”,这表明您已经对 Terraform 之外的对象进行了一些更改,但您更新了配置匹配。因此,Terraform 不需要对远程对象进行任何更改以使它们与配置匹配,因为 Terraform 之外的其他东西已经更新了它们。

【讨论】:

是否有一个选项来禁止此类消息,因为它们有点过于冗长,并且有terraform 通知用户将有实际更新(create / destroy / update) ? 如果您在运行任何其他 Terraform 命令之前运行 terraform apply -refresh-only -auto-approve,那么您可以让 Terraform 将所有远程系统更改作为单独的步骤首先合并到状态中——您可以隐藏其输出或忽略 - 然后后续操作将根据更新后的状态进行,因此第二次运行时不会报告任何“Terraform 之外的更改”。

以上是关于terraform plan 通知基础设施的变化,但也说没有变化的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 学习笔记

terraform plan 未检测到漂移

在 Terraform 中为 azurerm_app_service_plan 创建 azurerm_sql_firewall_rule

Terraform:通知 SNS 的 CloudWatch 事件

Terraform常用命令

01.terraform概述