在Terraform Cloud中使用多Azure服务主体遇CLI路径错误咨询
问题
刚学习Terraform,希望通过Terraform Cloud在Azure的两个订阅中部署基础设施。已通过多个带别名的azurerm provider块实现,配置如下:
provider "azurerm" { alias = "dev" subscription_id = var.DEV_SUB_ID tenant_id = var.DEV_TENANT_ID client_id = var.DEV_CLIENT_ID client_secret = var.DEV_CLIENT_SECRET features {} } provider "azurerm" { alias = "prod" subscription_id = var.PROD_SUB_ID tenant_id = var.PROD_TENANT_ID client_id = var.PROD_CLIENT_ID client_secret = var.PROD_CLIENT_SECRET features {} }
已将代码库配置为使用GitHub Actions,但执行plan阶段时失败,报错信息如下:
terraform error: building azurerm client: please ensure you have installed azure cli version 2.0.79 or newer. error parsing json result from the azure cli: launching azure cli: exec: "az": executable file not found in $path.
了解到该错误是因未在Terraform Cloud中设置ARM_SUBSCRIPTION_ID、ARM_CLIENT_ID、ARM_CLIENT_SECRET和ARM_TENANT_ID变量导致。但使用的是多订阅及对应的多服务主体,为何必须设置这些默认变量?若设置后,所有操作是否都会指向该服务主体对应的订阅?
回答
- 报错的核心原因不是没设置默认ARM变量,而是Terraform Cloud执行环境里没有安装Azure CLI,且你的provider配置没有明确指定认证方式,导致Terraform默认尝试调用Azure CLI获取凭据,找不到
az命令才报错。 - 你不需要设置默认的ARM_全局变量,只要确保每个带别名的provider块都明确通过变量传入了订阅和服务主体信息,并且在Terraform Cloud中正确配置了这些变量(DEV_、PROD_*开头的变量)即可。
- 当你在资源块中通过
provider = azurerm.dev或provider = azurerm.prod指定使用哪个provider时,资源会分别对应到各自的订阅,和全局ARM变量无关。如果没设置全局变量,Terraform只会用你在provider块里配置的认证信息。 - 解决当前报错的两种方式:
- 给每个azurerm provider块添加
skip_provider_registration = true,并确保所有DEV_*、PROD_*变量都已在Terraform Cloud中正确配置为环境变量或Terraform变量,让Terraform直接使用服务主体认证,跳过Azure CLI调用。 - 在GitHub Actions的执行步骤中先安装Azure CLI,不过这种方式不如直接用服务主体认证高效。
- 给每个azurerm provider块添加
内容的提问来源于stack exchange,提问作者Thomas Read
相关产品推荐
相关产品推荐

