GitLab CI/CD部署AKS时terraform_plan阶段报找不到az命令错误
报错的核心原因是你使用的hashicorp/terraform:1.2.3是官方提供的精简镜像,基于Alpine Linux构建,镜像内仅预装了Terraform二进制文件,没有内置Azure CLI工具(即az命令)。
当你的Terraform配置中AzureRM Provider采用Azure CLI认证模式时,Provider会主动在系统$PATH路径下查找az可执行文件,通过调用CLI接口获取Azure认证凭据,找不到对应文件时就会抛出你看到的报错。你配置的entrypoint路径规则没有问题,本质是镜像本身缺少依赖组件。
你可以根据实际场景选以下任意一种方案修复:
方案1:换用无CLI依赖的服务主体认证(生产环境推荐)
不需要在镜像中安装Azure CLI,直接在GitLab CI项目的CI/CD变量配置中添加以下4个受保护、掩码的敏感变量:ARM_CLIENT_ID:Azure AD服务主体的应用(客户端)IDARM_CLIENT_SECRET:Azure AD服务主体的客户端密钥ARM_TENANT_ID:服务主体所属的Azure租户IDARM_SUBSCRIPTION_ID:要部署AKS的Azure订阅ID
AzureRM Provider启动时会自动读取这些环境变量完成身份认证,完全不依赖az命令,流水线执行速度更快,也不会出现CLI版本兼容问题,原有流水线配置不需要做其他改动。
方案2:在现有镜像基础上临时安装Azure CLI
如果确实需要用Azure CLI做认证,可以在流水线的before_script阶段添加Alpine系统对应的Azure CLI安装步骤,修改后的before_script配置参考如下:before_script: - cd ${TF_ROOT} # 新增Azure CLI安装及验证步骤 - apk add --no-cache py3-pip python3 openssl - pip install --no-cache-dir azure-cli>=2.0.79 - az version # 原有逻辑保留 - rm -rf .terraform - terraform --version - terraform init这种方式每次流水线运行都要执行安装步骤,会增加数分钟的流水线耗时,适合临时调试场景。
方案3:使用预装依赖的自定义镜像
可以提前构建一个同时预装对应版本Terraform、Azure CLI的自定义镜像,推送到自己的容器镜像仓库,流水线直接引用这个自定义镜像即可。这种方式既避免了每次流水线临时安装依赖的耗时,也能保证工具版本固定,不会出现版本不兼容问题,适合长期稳定运行的流水线场景。
内容的提问来源于stack exchange,提问作者Salvatore Calla'

