Terraform:如何自动解决旧状态文件中已删除的提供程序问题?

Terraform: How to automatically resolve removed provider issues from old state files?

我正在努力将模板从 terraform 0.12.31 升级到 0.13.7,我们需要确保我们有一个自动系统来处理在旧版本下创建的部署。

我正在解决的一个问题是我删除了移动中所有 null 提供商的使用。当我尝试应用或计划使用 terraform 版本 0.13 时在 0.12 上创建的状态文件时,我收到以下错误:

$ terraform plan --var-file MY_VAR_FILE.json 
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

Error: Provider configuration not present

To work with
module.gcp_volt_site.module.ce_config.data.null_data_source.hosts_localhost
its original provider configuration at
provider["registry.terraform.io/-/null"] is required, but it has been removed.
This occurs when a provider configuration is removed while objects created by
that provider still exist in the state. Re-add the provider configuration to
destroy
module.gcp_volt_site.module.ce_config.data.null_data_source.hosts_localhost,
after which you can remove the provider configuration again.


Error: Provider configuration not present

To work with
module.gcp_volt_site.module.ce_config.data.null_data_source.cloud_init_master
its original provider configuration at
provider["registry.terraform.io/-/null"] is required, but it has been removed.
This occurs when a provider configuration is removed while objects created by
that provider still exist in the state. Re-add the provider configuration to
destroy
module.gcp_volt_site.module.ce_config.data.null_data_source.cloud_init_master,
after which you can remove the provider configuration again.


Error: Provider configuration not present

To work with
module.gcp_volt_site.module.ce_config.data.null_data_source.vpm_config its
original provider configuration at provider["registry.terraform.io/-/null"] is
required, but it has been removed. This occurs when a provider configuration
is removed while objects created by that provider still exist in the state.
Re-add the provider configuration to destroy
module.gcp_volt_site.module.ce_config.data.null_data_source.vpm_config, after
which you can remove the provider configuration again.

我的手动解决方案是 运行 terraform state rm 列出的所有模块:

terraform state rm module.gcp_volt_site.module.ce_config.data.null_data_source.vpm_config
terraform state rm module.gcp_volt_site.module.ce_config.data.null_data_source.hosts_localhost
terraform state rm module.gcp_volt_site.module.ce_config.data.null_data_source.cloud_init_master

我想知道如何自动执行此操作以启用脚本来进行这些更改。

是否可以使用某种 terraform 命令来列出这些已删除的模块而无需额外测试,以便我可以循环遍历 terraform state rm 的 运行 以将它们从状态文件中删除?

或者是否有某种 terraform 命令可以像 terraform state rm -all-not-present 这样的通用方式自动执行此操作?

有几种可能性。没有模块的源代码很难说,所以提供可能会有帮助。

一些建议

清理缓存

删除 .terraform 目录(通常在您 运行 启动、计划和申请的目录中)。可以缓存仍然包含空引用的旧版本模块。

状态刷新

使用 Terraform Refresh 你应该能够扫描红外线并使状态对齐。

可能很危险,Hashicorp 不推荐。

手动删除

您所建议的 state rm 命令可以在此处提供帮助并且相当安全。您可以选择 --dry-run 并专门指向资源 使用 terraform state rm 就像您建议的那样手动删除处于状态的模块中的那些资源。同样,您要检查模块引用是否指向模块的旧版本或缓存旧版本,否则它们将被重新创建。

不,没有 rm --all-missing,但如果您知道将丢失所有空数据源,您可以使用 terraform state ls 列出所有这些资源,然后遍历每个资源并删除他们在一个循环中。

这给了我一个列表,我可以使用 terraform state rm $MODULE_NAME:

迭代
$ terraform state list | grep 'null_data_source' 
module.gcp_volt_site.module.ce_config.data.null_data_source.cloud_init_master
module.gcp_volt_site.module.ce_config.data.null_data_source.hosts_localhost
module.gcp_volt_site.module.ce_config.data.null_data_source.vpm_config