我如何使用 Azure 资源管理器凭证在 Azure DevOps 中 运行 Python 脚本?
How can I run a Python script in Azure DevOps with Azure Resource Manager credentials?
我有一个 Python 脚本,我想 运行 在 Azure DevOps 管道任务中的 Azure 资源管理器上下文中,以便能够访问 Azure 资源(例如 Azure CLI 或 Azure PowerShell 任务) .
如何将存储在 Azure DevOps 中的 Azure RM 服务端点凭据作为 ServicePrincipal/Secret 或 OAuth 令牌传递到脚本中?
取决于您所说的 python 脚本,但无论哪种方式,Azure DevOps 都没有原生支持来验证 python sdk(或您的自定义 python 脚本),但是您可以将 build\release 变量中的凭据传递给您的脚本,或者尝试从 Azure Cli 中提取它(我认为它将数据存储在 /home/.azure/
.
下的某处
根据 4c74356b41 above and with some dissecting of Azure CLI 给出的提示,我创建了这个函数,允许从 Service Princial 中提取 OAuth 令牌 ADAL
Azure DevOps - Azure CLI 任务
import os
import json
import adal
_SERVICE_PRINCIPAL_ID = 'servicePrincipalId'
_SERVICE_PRINCIPAL_TENANT = 'servicePrincipalTenant'
_TOKEN_ENTRY_TOKEN_TYPE = 'tokenType'
_ACCESS_TOKEN = 'accessToken'
def get_config_dir():
return os.getenv('AZURE_CONFIG_DIR', None) or os.path.expanduser(os.path.join('~', '.azure'))
def getOAuthTokenFromCLI():
token_file = (os.environ.get('AZURE_ACCESS_TOKEN_FILE', None)
or os.path.join(get_config_dir(), 'accessTokens.json'))
with open(token_file) as f:
tokenEntry = json.load(f)[0] # just assume first entry
tenantID = tokenEntry[_SERVICE_PRINCIPAL_TENANT]
appId = tokenEntry[_SERVICE_PRINCIPAL_ID]
appPassword = tokenEntry[_ACCESS_TOKEN]
authURL = "https://login.windows.net/" + tenantID
resource = "https://management.azure.com/"
context = adal.AuthenticationContext(authURL, validate_authority=tenantID, api_version=None)
token = context.acquire_token_with_client_credentials(resource,appId,appPassword)
return token[_TOKEN_ENTRY_TOKEN_TYPE] + " " + token[_ACCESS_TOKEN]
如果我对问题的理解正确,您想使用 Python Azure CLI 包装器 类 来管理或访问 Azure 资源。而不是使用 shell 或 PowerShell 命令。我 运行 遇到了同样的问题,并使用以下步骤解决了它。
import sys
from azure.identity import ClientSecretCredential
tenant_id = sys.argv[1]
client_id = sys.argv[2]
client_secret = sys.argv[3]
credentials = ClientSecretCredential(tenant_id, client_id, client_secret)
- 添加“用户 Python 版本”步骤以将 python 的正确版本添加到代理的 PATH
- 添加“Azure CLI”步骤。这里的目标是安装您的要求并执行脚本。
- 在 Azure CLI 步骤中,确保选中“高级”部分中的“访问脚本中的服务主体详细信息”复选框。这将允许您将服务主体详细信息作为参数传递到脚本中。
- 传入 $tenantId $servicePrincipalId $servicePrincipalKey 变量作为参数。只要选中步骤 3 中的框,这些变量就是管道定义的。您无需采取任何行动来定义它们。
- 设置您的 Python 脚本以接受这些值并设置您的
证书。见上面的脚本
我有一个 Python 脚本,我想 运行 在 Azure DevOps 管道任务中的 Azure 资源管理器上下文中,以便能够访问 Azure 资源(例如 Azure CLI 或 Azure PowerShell 任务) .
如何将存储在 Azure DevOps 中的 Azure RM 服务端点凭据作为 ServicePrincipal/Secret 或 OAuth 令牌传递到脚本中?
取决于您所说的 python 脚本,但无论哪种方式,Azure DevOps 都没有原生支持来验证 python sdk(或您的自定义 python 脚本),但是您可以将 build\release 变量中的凭据传递给您的脚本,或者尝试从 Azure Cli 中提取它(我认为它将数据存储在 /home/.azure/
.
根据 4c74356b41 above and with some dissecting of Azure CLI 给出的提示,我创建了这个函数,允许从 Service Princial 中提取 OAuth 令牌 ADAL
Azure DevOps - Azure CLI 任务
import os
import json
import adal
_SERVICE_PRINCIPAL_ID = 'servicePrincipalId'
_SERVICE_PRINCIPAL_TENANT = 'servicePrincipalTenant'
_TOKEN_ENTRY_TOKEN_TYPE = 'tokenType'
_ACCESS_TOKEN = 'accessToken'
def get_config_dir():
return os.getenv('AZURE_CONFIG_DIR', None) or os.path.expanduser(os.path.join('~', '.azure'))
def getOAuthTokenFromCLI():
token_file = (os.environ.get('AZURE_ACCESS_TOKEN_FILE', None)
or os.path.join(get_config_dir(), 'accessTokens.json'))
with open(token_file) as f:
tokenEntry = json.load(f)[0] # just assume first entry
tenantID = tokenEntry[_SERVICE_PRINCIPAL_TENANT]
appId = tokenEntry[_SERVICE_PRINCIPAL_ID]
appPassword = tokenEntry[_ACCESS_TOKEN]
authURL = "https://login.windows.net/" + tenantID
resource = "https://management.azure.com/"
context = adal.AuthenticationContext(authURL, validate_authority=tenantID, api_version=None)
token = context.acquire_token_with_client_credentials(resource,appId,appPassword)
return token[_TOKEN_ENTRY_TOKEN_TYPE] + " " + token[_ACCESS_TOKEN]
如果我对问题的理解正确,您想使用 Python Azure CLI 包装器 类 来管理或访问 Azure 资源。而不是使用 shell 或 PowerShell 命令。我 运行 遇到了同样的问题,并使用以下步骤解决了它。
import sys
from azure.identity import ClientSecretCredential
tenant_id = sys.argv[1]
client_id = sys.argv[2]
client_secret = sys.argv[3]
credentials = ClientSecretCredential(tenant_id, client_id, client_secret)
- 添加“用户 Python 版本”步骤以将 python 的正确版本添加到代理的 PATH
- 添加“Azure CLI”步骤。这里的目标是安装您的要求并执行脚本。
- 在 Azure CLI 步骤中,确保选中“高级”部分中的“访问脚本中的服务主体详细信息”复选框。这将允许您将服务主体详细信息作为参数传递到脚本中。
- 传入 $tenantId $servicePrincipalId $servicePrincipalKey 变量作为参数。只要选中步骤 3 中的框,这些变量就是管道定义的。您无需采取任何行动来定义它们。
- 设置您的 Python 脚本以接受这些值并设置您的 证书。见上面的脚本