模块声明非HashiCorp Provider时,如何删除Terraform模块引用?
问题
尝试删除一个包含Providers块的模块(该块指定了非HashiCorp的azuredevops Provider),但注释模块引用后执行Terraform操作时,报错找不到hashicorp/azuredevops Provider。
模块内配置:
# Defined in module terraform { required_version = ">= 0.13" required_providers { azuredevops = { source = "microsoft/azuredevops" version = ">= 0.1.0" } } }
根配置:
# Defined in root terraform { required_version = ">= 0.13" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.19.1" } azuredevops = { source = "microsoft/azuredevops" version = ">= 0.1.0" } } }
模块引用(创建时正常):
module "example" { source = "../modules/example/" application_name = "example" location = var.location environment = var.environment }
注释模块引用后报错:
│ Error: Failed to query available provider packages │ │ Could not retrieve the list of available versions for provider │ hashicorp/azuredevops: provider registry registry.terraform.io does not │ have a provider named registry.terraform.io/hashicorp/azuredevops
执行terraform providers输出:
Providers required by configuration: . ├── provider[registry.terraform.io/hashicorp/azurerm] └── module.example ├── provider[registry.terraform.io/hashicorp/azuredevops] Providers required by state: provider[registry.terraform.io/microsoft/azuredevops] provider[registry.terraform.io/hashicorp/azurerm]
需要让模块继承根配置的microsoft/azuredevops Provider,成功删除模块引用。
解决方法
1. 修正模块的Provider配置,确保继承根配置
模块内的required_providers块如果仅需复用根配置的Provider,无需重复指定source。修改模块内的terraform块:
# Defined in module terraform { required_version = ">= 0.13" required_providers { azuredevops = { # 移除source,让模块继承根配置的source version = ">= 0.1.0" } } }
如果模块不需要独立指定版本约束,甚至可以直接删除required_providers里的azuredevops块,完全继承根配置的版本和source。
2. 同步Provider依赖并更新状态
执行命令让Terraform重新识别Provider依赖:
terraform init -upgrade
这一步会确保模块使用根配置中指定的microsoft/azuredevops,而非错误的hashicorp/azuredevops。
3. 清理模块的状态引用
手动移除模块的状态记录,避免状态与配置不一致:
terraform state rm module.example
4. 验证并完成删除
注释根配置中的模块引用后,执行:
terraform plan
确认无报错后,执行terraform apply完成模块删除操作。
内容的提问来源于stack exchange,提问作者Kevvv
相关产品推荐
相关产品推荐

