Databricks资产包(DAB)中不同场景下run_as配置的优雅切换方案咨询
Databricks资产包(DAB)中不同场景下run_as配置的优雅切换方案咨询
我完全懂你这种每次手动注释、切换run_as配置的痛苦!不用再折腾yml文件的注释了,给你两个优雅的解决方案,完美适配本地终端用个人用户、流水线用不同工作区服务主体的场景:
方案一:利用Target配置实现多环境隔离(推荐)
DAB的Target机制本来就是用来区分不同部署环境/工作区的,我们可以给每个场景定义专属Target,把run_as配置和对应工作区绑定在一起,运行时只需要指定Target就行。
配置步骤
- 完善你的
bundle.targets.yml,给本地和各个工作区分别定义Target:
targets: # 本地开发用的Target local: workspace: host: ${env:LOCAL_DATABRICKS_HOST} # 本地环境变量配置你的工作区地址 run_as: user_name: ${workspace.current_user.userName} # 自动用当前登录用户 # 工作区1的流水线Target ws1-prod: workspace: host: ${env:WS1_DATABRICKS_HOST} # 流水线环境变量配置该工作区地址 run_as: service_principal_name: ${env:WS1_SP_ID} # 流水线环境变量传入该工作区的服务主体ID # 工作区2的流水线Target ws2-staging: workspace: host: ${env:WS2_DATABRICKS_HOST} run_as: service_principal_name: ${env:WS2_SP_ID}
- 运行时指定Target:
- 本地终端运行:
dab deploy --target local - 流水线针对不同工作区运行:
比如部署到ws1-prod时,设置好对应的环境变量后执行:dab deploy --target ws1-prod
这种方式的好处是每个环境的配置完全隔离,清晰直观,后续新增工作区只需要加新的Target就行,不用修改主配置。
方案二:用条件变量+环境变量动态切换
如果你的场景不需要太多复杂的Target隔离,也可以通过DAB支持的Jinja2条件语法,结合环境变量来动态选择run_as的配置。
配置示例
修改你的主databricks.yml里的run_as部分:
run_as: {% if env:USE_SERVICE_PRINCIPAL == "true" %} service_principal_name: ${env:SERVICE_PRINCIPAL_ID} {% else %} user_name: ${workspace.current_user.userName} {% endif %}
使用方式
- 本地终端运行:不需要设置任何额外环境变量,直接执行
dab deploy,会自动使用当前用户。 - 流水线运行:在流水线中设置两个环境变量:
USE_SERVICE_PRINCIPAL=trueSERVICE_PRINCIPAL_ID=对应工作区的服务主体ID
然后执行dab deploy即可自动切换到服务主体运行。
两种方案都能彻底解决你手动注释配置的麻烦,看你实际的工作区数量和复杂度选就行~
备注:内容来源于stack exchange,提问作者eemilk
相关产品推荐
相关产品推荐

