Linux环境下借助Token实现Terraform对接Azure认证的脚本方案咨询
Azure无交互Terraform部署认证方案
服务主体认证方案(适配本地/非Azure环境运行)
该方案完全满足无交互、不共享个人账号、不受MFA限制的要求,是你当前场景的最优选择:
- 首次配置仅需管理员执行一次,使用有权限的账号运行Azure CLI命令创建专属服务主体:
az ad sp create-for-rbac --name terraform-vm-deploy-sp --role Contributor --scopes /subscriptions/替换为你的订阅ID
运行后会输出包含appId、password、tenant的JSON结果,将这三个值和订阅ID统一存入独立的凭据文件(例如azure_creds.env),该文件禁止提交到代码仓库,仅分发给授权团队成员,文件格式参考:
ARM_CLIENT_ID=输出的appId值 ARM_CLIENT_SECRET=输出的password值 ARM_TENANT_ID=输出的tenant值 ARM_SUBSCRIPTION_ID=你的Azure订阅ID
- 你的Python脚本无需调用
az login命令,Terraform的AzureRM Provider会自动读取上述四个环境变量完成认证,你只需要在执行Terraform命令前加载凭据文件的环境变量即可,全程无交互操作。如果需要使用Azure CLI执行其他操作,也可以用服务主体完成无交互登录:
az login --service-principal -u $ARM_CLIENT_ID -p $ARM_CLIENT_SECRET --tenant $ARM_TENANT_ID
你可以随时吊销服务主体的密钥、调整权限范围,安全性远高于共享个人账号。
Azure托管标识说明(适配Azure环境内运行)
托管标识是Azure官方提供的免凭据管理的认证方案,不需要你手动维护任何密钥/Token文件,分两类:
- 系统分配托管标识:和单个Azure资源绑定,资源删除时标识同步销毁,每个资源仅能绑定一个系统分配托管标识
- 用户分配托管标识:为独立的Azure资源,可绑定到多个Azure资源上,生命周期自主管理
如果你的部署脚本是在Azure资源上运行(例如Azure虚拟机、Azure Function、Azure DevOps代理等),可直接给运行脚本的资源绑定托管标识,给该标识分配对应订阅的部署权限,脚本运行时Terraform和Azure CLI会自动获取托管标识的认证信息,无需任何凭据配置,安全性最高。如果脚本在本地或非Azure环境运行,无法直接使用该方案。
核心Python脚本逻辑参考
import os import subprocess from dotenv import load_dotenv # 加载外部独立凭据文件 load_dotenv("azure_creds.env") # 无交互执行Terraform命令 subprocess.run(["terraform", "init"], check=True) subprocess.run(["terraform", "validate"], check=True) # 加-auto-approve参数跳过人工确认环节 subprocess.run(["terraform", "apply", "-auto-approve"], check=True)
团队成员使用时仅需将授权后的azure_creds.env放在脚本同级目录即可,无需额外操作。
内容的提问来源于stack exchange,提问作者Denis Kovalev
相关产品推荐
相关产品推荐

