如果可能的话,我有一份简单的工作,我想在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)
但我还没有实现任何参数传递。
答案 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_dag和example_trigger_target_dag。另请参阅Airflow api reference on macros。