气流参数传递

时间:2017-02-28 15:09:29

标签: bash airflow

如果可能的话,我有一份简单的工作,我想在Airflow流程下工作。按照目前的情况,我有一串bash脚本访问服务器并下载最新版本的文件,然后对该文件执行各种下游操作。

exec ./somescript.sh somefileurl

我想知道的是:每次我需要运行此过程时,如何将URL传递给此文件?

似乎如果我尝试将bash脚本作为bash命令运行,如下所示:

download = BashOperator(
task_id='download_release',
bash_command='somescript.sh',
# params={'URL': 'somefileurl'},
dag=dag)

我无法传递bash脚本所需的一个参数。否则,如果我尝试像这样的bash命令发送bash脚本:

download = BashOperator(
task_id='download_release',
bash_command='./somescript.sh {{ URL }}',
params={'URL': 'somefileurl'},
dag=dag)

程序尝试在临时目录的上下文中执行脚本时收到执行错误。这会破坏脚本,因为它需要访问位于同一目录中的某些凭据文件,并且我希望保持相对文件位置不变...

思想?

更新:什么对我有用

download = BashOperator(
task_id='download_release',
bash_command='cd {{ params.dir }} && ./somescript.sh {{ params.url }}',
params={'url': 'somefileurl',
        'dir': 'somedir'},
dag=dag)

但我还没有实现任何参数传递。

1 个答案:

答案 0 :(得分:1)

以下是将参数传递给BashOperator的示例:

templated_command = """
cd /working_directory
somescript.sh {{ dag_run.conf['URL'] }}
"""
download = BashOperator(
   task_id='download_release',
   bash_command=templated_command,
   dag=dag)

有关此问题的讨论,请参阅passing parameters to externally trigged dag。 Airflow有两个示例DAG,证明了这一点:example_trigger_controller_dagexample_trigger_target_dag。另请参阅Airflow api reference on macros