Terraform init未生成provider文件 plan报错无法创建Azure资源组
Terraform v0.12.14 Azure资源创建异常排查方案
问题1:执行terraform init后工作目录未生成provider相关文件
按以下顺序排查:
- 首先确认终端当前工作路径和存放
.tf配置文件的路径完全一致,路径错误时init会在其他目录生成文件,当前目录自然无相关内容。正常init成功后,当前目录会生成隐藏的.terraform文件夹,存放模块缓存、provider软链接等内容,如果连这个文件夹都不存在,优先排查路径问题。 - Terraform v0.12版本默认不会把provider二进制文件存在当前工作目录:未指定自定义插件路径时,下载的provider默认存放在用户目录下的插件路径,你可以直接到对应路径查找:
- Windows系统:
%APPDATA%\terraform.d\plugins - macOS/Linux系统:
~/.terraform.d/plugins
路径下terraform-provider-azurerm开头的文件就是AzureRM provider程序。
- Windows系统:
- 检查init执行命令是否带了错误参数:如果加了
-get-plugins=false参数,init不会自动下载provider;如果加了-plugin-dir=xxx参数,所有provider会被下载到你指定的自定义路径,不会存到默认位置。 - 执行
terraform init时观察终端输出,如果没有出现provider下载进度条、也没有初始化成功提示,说明init流程本身执行失败,优先检查本地网络是否能正常访问HashiCorp插件仓库、以及Azure身份认证配置是否正确。
问题2:执行terraform plan持续返回no changes, infrastructure is up-to-date,无法创建资源组
按以下顺序排查:
- 再次确认执行plan命令的终端路径,和你存放资源配置
.tf文件的路径一致,路径错误时Terraform扫描不到配置文件,会直接返回无变更。 - 检查配置文件后缀:Windows系统默认隐藏已知文件扩展名,确认你写的配置文件后缀真的是
.tf,不要存成.tf.txt这类格式,Terraform只会加载执行目录下后缀为.tf/.tf.json的配置文件。 - 执行
terraform version确认当前调用的Terraform程序版本确实是v0.12.14,本地安装多版本Terraform时,容易因为环境变量优先级问题调用到其他版本,读取到其他工作目录的state文件,返回无变更提示。 - 检查配置内容是否符合v0.12版本的AzureRM provider语法,v0.12最高兼容2.x版本的azurerm provider,3.x及以上版本完全无法适配,且必须显式声明
features块,最小可用配置参考:
provider "azurerm" { version = "~>2.0" features {} } resource "azurerm_resource_group" "test" { name = "test-rg-001" location = "East US" # 中国区用户替换为对应区域名,比如China East }
- 检查资源配置是否被注释、是否设置了
count = 0的条件判断,这类配置会被Terraform判定为不需要创建的资源,不会出现在变更列表里。 - 执行
terraform providers命令查看当前上下文识别到的provider列表,如果列表中没有azurerm,说明provider初始化未完成,回到问题1的排查步骤重新执行init。 - 如果你配置了远程state存储(比如Azure Blob),先检查远程state的访问权限是否正常,权限异常时Terraform可能读取空state、同时扫描不到本地配置,返回无变更提示。
快速验证流程
你可以新建一个空测试文件夹,把上面给出的最小配置保存为main.tf放入文件夹,cd到该文件夹依次执行:
terraform init,确认终端输出初始化成功提示、能看到azurerm provider的下载进度terraform plan,正常场景下会输出1个资源将被新增的提示,不会再返回无变更结果,后续执行terraform apply即可完成资源组创建。
内容的提问来源于stack exchange,提问作者Thebeginner
相关产品推荐
相关产品推荐

