Azure Runbook中Python脚本如何通过服务主体使用AZ CLI登录?
在Azure Runbook Python脚本中使用服务主体登录的替代方案
方法1:直接使用AZ CLI非交互式登录(无需转换SecureString)
AZ CLI的az login --service-principal命令不需要将密码转换为SecureString,你可以直接传入明文密码,但为了安全,建议通过Azure自动化的凭据资产存储敏感信息,避免硬编码。
实现步骤:
- 在Azure自动化账户中创建一个凭据资产,将服务主体的App ID设为用户名,密码设为凭据密码。
- 在Python脚本中读取凭据并执行登录:
import subprocess # 从自动化凭据资产获取服务主体信息(替换为你的凭据名称) sp_id = subprocess.check_output(["Get-AutomationPSCredential", "-Name", "SP_Credential"]).decode().splitlines()[0] sp_secret = subprocess.check_output(["Get-AutomationPSCredential", "-Name", "SP_Credential"]).decode().splitlines()[1] # 执行AZ CLI服务主体登录 subprocess.run([ "az", "login", "--service-principal", "-u", sp_id, "-p", sp_secret, "--tenant", "你的租户ID" ], check=True) # 示例:执行后续AZ CLI操作 subprocess.run(["az", "vm", "list", "--subscription", "你的订阅ID"], check=True)
你也可以通过环境变量传递凭据,避免在命令行显式暴露密码:
import os import subprocess # 从自动化变量/凭据读取后设置环境变量 os.environ["AZURE_CLIENT_ID"] = "你的服务主体App ID" os.environ["AZURE_CLIENT_SECRET"] = "你的服务主体密码" os.environ["AZURE_TENANT_ID"] = "你的租户ID" # 无需额外参数,直接完成登录 subprocess.run(["az", "login", "--service-principal"], check=True)
方法2:使用Azure Python SDK原生认证(推荐)
如果你的脚本以Python逻辑为主,推荐直接使用Azure官方的azure-identity SDK完成服务主体认证,无需依赖AZ CLI,更高效且原生。
实现步骤:
- 确保Runbook的Python环境已安装
azure-identity及对应管理SDK(如azure-mgmt-compute,可通过自动化账户的Python包管理添加)。 - 编写认证及业务逻辑代码:
from azure.identity import ClientSecretCredential from azure.mgmt.compute import ComputeManagementClient # 从自动化凭据/变量读取敏感信息(避免硬编码) tenant_id = "你的租户ID" client_id = "你的服务主体App ID" client_secret = "你的服务主体密码" # 创建服务主体凭据对象 credential = ClientSecretCredential( tenant_id=tenant_id, client_id=client_id, client_secret=client_secret ) # 初始化资源管理客户端(以虚拟机管理为例) compute_client = ComputeManagementClient( credential=credential, subscription_id="你的订阅ID" ) # 示例:列出订阅下所有虚拟机 for vm in compute_client.virtual_machines.list_all(): print(f"虚拟机名称:{vm.name},资源组:{vm.id.split('/')[4]}")
安全优化:从自动化凭据资产读取密码
避免硬编码密码,可通过自动化SDK读取凭据资产:
from azure.identity import DefaultAzureCredential, ClientSecretCredential from azure.mgmt.automation import AutomationClient # 用Runbook托管身份登录自动化账户 automation_client = AutomationClient( credential=DefaultAzureCredential(), subscription_id="你的自动化账户订阅ID" ) # 获取预创建的服务主体凭据 sp_cred = automation_client.credentials.get( resource_group_name="你的资源组名称", automation_account_name="你的自动化账户名称", credential_name="SP_Credential" ) # 用读取到的凭据创建服务主体认证对象 credential = ClientSecretCredential( tenant_id="你的租户ID", client_id=sp_cred.user_name, client_secret=sp_cred.password )
关键注意事项
- 所有敏感信息(App ID、密码、租户ID)必须存储在Azure自动化的凭据资产或加密变量资产中,禁止硬编码在脚本内。
- Azure自动化的Python Runbook环境默认预装AZ CLI,无需额外安装。
内容的提问来源于stack exchange,提问作者Sadhna Pandey
相关产品推荐
相关产品推荐

