如何向Databricks Asset Bundles的databricks.yml传递环境参数?
如何通过Azure DevOps流水线向Databricks资产包传递环境差异化参数
核心思路
不用在databricks.yml里硬编码所有环境的变量值,而是用占位符+流水线参数/环境变量的方式动态注入,实现不同环境的配置差异化。
步骤1:在databricks.yml中配置变量占位符
把需要动态调整的字段(比如quartz_cron_expression)替换为bundle变量引用,格式是${var.变量名}:
tasks: your_scheduled_task: job_clusters: - job_cluster_key: default_cluster new_cluster: # 你的集群配置... schedule: quartz_cron_expression: "${var.cron_expression}" timezone_id: "UTC"
这里的cron_expression就是我们要从流水线传递的变量名。
步骤2:在Azure DevOps流水线中传递参数
直接在流水线部署步骤里,通过前缀为DATABRICKS_BUNDLE_VAR_的环境变量把流水线参数传给Databricks bundle命令:
parameters: - name: environment type: string values: - dev - prod - name: cronExpression type: string default: "0 0 * * * ?" # Dev环境默认每天跑一次 steps: - task: Bash@3 displayName: 部署Databricks资产包 env: # 先配置Databricks连接信息 DATABRICKS_HOST: $(databricksHost) DATABRICKS_TOKEN: $(databricksToken) # 把流水线的cronExpression参数传给bundle变量cron_expression DATABRICKS_BUNDLE_VAR_cron_expression: ${{ parameters.cronExpression }} script: | databricks bundle deploy --environment ${{ parameters.environment }}
步骤3:自动根据环境设置参数(可选)
如果不想每次手动指定cron值,让流水线根据环境自动切换:
steps: - task: Bash@3 displayName: 自动设置Cron表达式 name: setCron script: | if [ "${{ parameters.environment }}" = "prod" ]; then # Prod环境每2小时跑一次 echo "##vso[task.setvariable variable=cronExpression]0 */2 * * * ?" else # 非Prod环境每天跑一次 echo "##vso[task.setvariable variable=cronExpression]0 0 * * * ?" fi - task: Bash@3 displayName: 部署Databricks资产包 env: DATABRICKS_HOST: $(databricksHost) DATABRICKS_TOKEN: $(databricksToken) DATABRICKS_BUNDLE_VAR_cron_expression: $(cronExpression) script: | databricks bundle deploy --environment ${{ parameters.environment }}
关于自定义变量的补充说明
Databricks资产包的自定义变量支持三种设置方式:
- 在
databricks.yml的vars块里定义默认值; - 通过命令行
--var key=value直接传递; - 通过
DATABRICKS_BUNDLE_VAR_前缀的环境变量传递(变量名用下划线替代连字符,比如cron-expression对应DATABRICKS_BUNDLE_VAR_cron_expression)。
内容的提问来源于stack exchange,提问作者Kim Jensen
相关产品推荐
相关产品推荐

