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

Azure Runbook中Python脚本如何通过服务主体使用AZ CLI登录?

在Azure Runbook Python脚本中使用服务主体登录的替代方案

方法1:直接使用AZ CLI非交互式登录(无需转换SecureString)

AZ CLI的az login --service-principal命令不需要将密码转换为SecureString,你可以直接传入明文密码,但为了安全,建议通过Azure自动化的凭据资产存储敏感信息,避免硬编码。

实现步骤:

  1. 在Azure自动化账户中创建一个凭据资产,将服务主体的App ID设为用户名,密码设为凭据密码。
  2. 在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,更高效且原生。

实现步骤:

  1. 确保Runbook的Python环境已安装azure-identity及对应管理SDK(如azure-mgmt-compute,可通过自动化账户的Python包管理添加)。
  2. 编写认证及业务逻辑代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:10:44