如何在Bitbucket Pipeline中执行Terraform plan?Azure部署报错求解决
问题原因
azureadprovider未显式配置:你的Terraform根模块没有定义azureadprovider块,Terraform自动拉取provider后找不到对应配置,无法完成初始化。- 基础镜像缺少Azure CLI:你Pipeline使用的
hashicorp/terraform:latest是仅包含Terraform二进制的轻量镜像,没有预装az命令。azureadprovider默认会尝试调用Azure CLI完成认证,找不到命令就会抛出执行失败的报错。
解决方案
以下两个调整配合完成即可解决问题:
1. 补充Terraform代码中的provider配置
你可以选择直接通过环境变量自动认证,不需要依赖Azure CLI,在根目录的providers.tf(或main.tf)中添加如下配置:
terraform { required_providers { azuread = { source = "hashicorp/azuread" version = ">= 2.47.0" # 可替换为你需要的版本号 } azurerm = { source = "hashicorp/azurerm" version = ">= 3.0.0" # 可替换为你需要的版本号 } } } provider "azuread" { # 留空即可,provider会自动读取Pipeline中配置的环境变量完成认证 } provider "azurerm" { features {} # 留空即可,provider会自动读取Pipeline中配置的环境变量完成认证 }
同步在根目录的variables.tf中按需添加你用到的变量定义即可。
2. 调整Bitbucket Pipeline配置
方案A(推荐):配置环境变量直接认证,无需安装Azure CLI
Azure官方provider支持直接读取标准前缀的环境变量完成认证,你只需要先在Bitbucket仓库的「CI/CD变量」页面添加以下4个加密变量:
ARM_CLIENT_ID:Azure服务主体的客户端IDARM_CLIENT_SECRET:Azure服务主体的客户端密钥ARM_TENANT_ID:Azure租户IDARM_SUBSCRIPTION_ID:Azure订阅ID
不需要更换原有镜像,只需要在terraform apply命令后加-auto-approve参数适配非交互环境即可,调整后的Pipeline配置如下:
image: hashicorp/terraform:latest pipelines: default: - step: name: 部署到Azure开发环境 script: - terraform init -backend-config="storage_account_name=$DEV_TF_CONFIG_STORAGE_ACCOUNT" -backend-config="container_name=$DEV_TF_CONFIG_CONTAINER_NAME" -backend-config="key=$DEV_TF_CONFIG_KEY" -backend-config="sas_token=$DEV_TF_SAS_TOKEN" - terraform plan - terraform apply -auto-approve
生产环境建议拆分为两个step:plan步骤输出结果人工审核后,再执行apply步骤,避免误操作。
方案B:安装Azure CLI后通过az登录认证
如果你需要在Pipeline中用到其他az命令,可以更换基础镜像为预装了Azure CLI的版本,先完成服务主体登录再执行Terraform命令:
image: mcr.microsoft.com/azure-cli:latest pipelines: default: - step: name: 部署到Azure开发环境 script: # 安装Terraform - apk add terraform --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community # 登录Azure - az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID - terraform init -backend-config="storage_account_name=$DEV_TF_CONFIG_STORAGE_ACCOUNT" -backend-config="container_name=$DEV_TF_CONFIG_CONTAINER_NAME" -backend-config="key=$DEV_TF_CONFIG_KEY" -backend-config="sas_token=$DEV_TF_SAS_TOKEN" - terraform plan - terraform apply -auto-approve
注意事项
- 所有敏感凭证必须存储在Bitbucket的加密CI/CD变量中,禁止硬编码到YAML或Terraform代码中。
- 首次上线前建议在本地先执行
terraform init、terraform plan验证代码逻辑无误后,再推送到仓库触发Pipeline运行。
内容的提问来源于stack exchange,提问作者Dejan Subotic
相关产品推荐
相关产品推荐

