如何在Airflow BashOperator中向外部Bash脚本传递JSON变量
Airflow BashOperator传递JSON变量到外部脚本的解决方法
问题原因
你之前的写法存在两个核心问题:
- Airflow的模板语法
{{ params.val }}仅在BashOperator的bash_command中会被渲染,外部脚本里的模板字符串不会被解析,脚本只会原封不动输出{{ params.val }} - 没有通过命令行参数将JSON变量传递给脚本,脚本无法直接获取Airflow上下文里的参数
解决步骤
1. 修改Airflow DAG代码
需要将JSON变量作为命令行参数传入脚本,同时用tojson过滤器把Python对象转成安全的JSON字符串,避免空格或特殊字符导致参数拆分:
example_vars = Variable.get("example_vars", deserialize_json=True) dag = DAG('NEW_DAG', description='NEW_DAG', schedule_interval=None, default_args=default_args, catchup=False ) # 将JSON变量作为命令行参数传递,用双引号包裹确保完整传递 shell_command = 'path-to-my-file/my_script.sh "{{ params.val | tojson }}"' running_task = BashOperator( task_id='task_to_run', bash_command=shell_command, trigger_rule="all_done", params={"val": example_vars}, dag=dag )
2. 修改外部Bash脚本
在脚本中通过命令行参数($1表示第一个参数)接收传递过来的JSON内容:
#!/bin/bash # 输出接收到的完整JSON内容 echo "实际JSON内容:$1" # 如果需要解析JSON字段,可使用jq工具(需提前安装),例如提取某个key的值: # echo "$1" | jq '.your_key'
额外说明
- 确保脚本有可执行权限:执行
chmod +x path-to-my-file/my_script.sh - 如果JSON内容包含特殊字符,用双引号包裹参数是必须的,避免被shell拆分
tojson过滤器会把Python字典转成标准JSON字符串,保证传递过程中格式正确
内容的提问来源于stack exchange,提问作者Brij Bhushan Maurya
相关产品推荐
相关产品推荐

