Terraform引入Azure DevOps与MySQL第三方Provider模块后init执行报错
问题根因
每个Terraform子模块不会自动继承根模块的provider源配置,必须独立声明依赖的provider源地址。你直接在根目录编写.tf配置时,根模块的required_providers声明了正确的非官方provider源,因此运行正常;而封装为模块后,子模块没有显式声明provider源,Terraform会默认去拉取hashicorp命名空间下的对应provider,这两个provider不在hashicorp官方维护列表内,因此触发报错。
修复步骤
- 第一步:执行命令查看当前所有模块的provider依赖,确认引用错误源的模块
terraform providers - 第二步:在所有使用mysql、azuredevops provider的自定义模块中,添加provider源声明,你可以在模块目录下的
versions.tf文件中添加如下配置:terraform { required_providers { azuredevops = { source = "microsoft/azuredevops" # 可根据需求指定版本约束,例如 version = ">=0.11.0" } mysql = { source = "terraform-providers/mysql" # 可根据需求指定版本约束 } } } - 第三步:清理本地Terraform缓存,重新初始化
# 清理旧缓存和锁文件,Windows系统可手动删除对应目录和文件 rm -rf .terraform .terraform.lock.hcl # 重新初始化 terraform init
额外注意事项
- 如果你的模块使用了自定义provider别名,在调用模块时需要显式传递provider实例,避免子模块自动拉取错误源的provider
- 根模块和子模块声明的同一个provider的版本约束需要兼容,避免出现版本冲突
内容的提问来源于stack exchange,提问作者Devops-Learner
相关产品推荐
相关产品推荐

