如何在CI/CD中自动获取Databricks工作区URL与访问令牌
自动获取Databricks Domain与Token实现CI/CD集成
一、获取Databricks工作区Domain(Workspace URL)
当通过ARM模板创建Databricks工作区后,可通过以下步骤自动获取Domain:
- 在ARM模板中定义输出参数
在ARM模板的outputs段添加工作区URL的输出,确保部署完成后能捕获该值:"outputs": { "databricksWorkspaceUrl": { "type": "string", "value": "[reference(resourceId('Microsoft.Databricks/workspaces', parameters('workspaceName'))).workspaceUrl]" } } - 在构建流水线中捕获输出并传递到发布流水线
- 在Azure DevOps的ARM部署任务中,勾选**“输出变量”**选项,将
databricksWorkspaceUrl保存为构建流水线变量。 - 发布流水线通过链接构建工件或直接引用构建变量的方式,将该值传递到发布阶段。
- 在Azure DevOps的ARM部署任务中,勾选**“输出变量”**选项,将
二、自动生成并获取Databricks Access Token
推荐两种安全的自动生成方式:
方式1:通过Azure AD服务主体生成Token
利用Azure CLI直接生成适用于Databricks的AD令牌,无需提前创建Databricks本地Token:
- 在发布流水线中添加Azure CLI任务,执行以下命令:
注:az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --query accessToken -o tsv2ff814a6-3304-4ab8-85cb-cd0e6f879c1d是Databricks服务的固定资源ID,所有Azure租户通用。 - 将命令输出保存为保密流水线变量(例如
DBRKS_TOKEN),避免明文泄露。
方式2:通过Databricks API创建专用Token
如果需要创建带有特定权限、有效期的Databricks本地Token,可先通过AD令牌调用API生成:
import requests def create_databricks_token(domain, aad_token): response = requests.post( f"https://{domain}/api/2.0/token/create", headers={'Authorization': f'Bearer {aad_token}'}, json={ "lifetime_seconds": 3600, # 设置1小时有效期,按需调整 "comment": "CI/CD pipeline专用Token" } ) if response.status_code == 200: return response.json()['token_value'] else: raise Exception(f"Token创建失败: {response.json()}")
三、在发布流水线中传递变量到Python脚本
修改你的Python集群创建脚本,从环境变量读取Domain和Token:
import os import requests def cluster_create(): DOMAIN = os.environ.get("DBRKS_DOMAIN") TOKEN = os.environ.get("DBRKS_TOKEN") response = requests.post( f'https://{DOMAIN}/api/2.0/clusters/create', headers={'Authorization': f'Bearer {TOKEN}'}, json={ "cluster_name": "cluster", "spark_version": "7.3.x-scala2.12", "node_type_id": "Standard_DS3_v2", "autotermination_minutes": 10, "autoscale" : { "min_workers": 1, "max_workers": 3 } } ) if response.status_code == 200: cluster_id = response.json()['cluster_id'] print(cluster_id) os.environ["DBRKS_CLUSTER_ID"] = cluster_id return cluster_id else: print(f"集群创建失败: {response.json()['error_code']}: {response.json()['message']}") raise Exception("Cluster creation failed")
在发布流水线的Python脚本任务中,设置环境变量:
- 添加
DBRKS_DOMAIN=$(databricksWorkspaceUrl) - 添加
DBRKS_TOKEN=$(DBRKS_TOKEN)(标记为保密变量)
注意事项
- Token安全:将Token变量标记为保密,避免在流水线日志中明文显示;设置较短有效期,每次发布时重新生成。
- 权限最小化:确保用于生成Token的Azure AD服务主体仅拥有Databricks工作区的必要权限(如集群创建、库安装)。
内容的提问来源于stack exchange,提问作者Syamala Kumar Rama Koti Reddy
相关产品推荐
相关产品推荐

