You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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块里配置的认证信息。
  • 解决当前报错的两种方式:
    1. 给每个azurerm provider块添加skip_provider_registration = true,并确保所有DEV_*、PROD_*变量都已在Terraform Cloud中正确配置为环境变量或Terraform变量,让Terraform直接使用服务主体认证,跳过Azure CLI调用。
    2. 在GitHub Actions的执行步骤中先安装Azure CLI,不过这种方式不如直接用服务主体认证高效。

内容的提问来源于stack exchange,提问作者Thomas Read

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:16:05