Python 使用相同的DAG文件在不同的服务器中调度shell脚本

Python 使用相同的DAG文件在不同的服务器中调度shell脚本,python,airflow,airflow-scheduler,Python,Airflow,Airflow Scheduler,我对Apache Airflow完全陌生。我有个情况。我使用的代码是 import airflow from airflow import DAG from airflow.operators.bash_operator import BashOperator from datetime import datetime, timedelta from airflow.contrib.operators.ssh_operator import SSHOperator from airflow.co

我对Apache Airflow完全陌生。我有个情况。我使用的代码是

import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
from airflow.contrib.operators.ssh_operator import SSHOperator
from airflow.contrib.hooks.ssh_hook import SSHHook

default_args = {
                 'owner': 'john',
                 'depends_on_past': False,
                 'email': [''],
                 'email_on_failure': False,
                 'email_on_retry': False,
                 'retries': 0,
                 'retry_delay': timedelta(minutes=5)
               }
  
 dag = DAG(
            'tutorial',
            default_args = default_args,
            description='A simple tutorial DAG',
            schedule_interval=None)

bash_tutorial = """
  echo "Execute shell file: /A/B/server/tutorial.ksh"
  echo "{{macros.ds_format(ds, "%Y-%m-%d", "%m-%d-%Y"}}"
  source /home/johnbs/.profile
  /A/B/server/tutorial.ksh
 """

t1 = SSHOperator(
                ssh_conn_id='dev'
                task_id='tutorial.ksh'
                command=bash_tutorial,
                dag=dag
        )
使用airflow,我想在不同的服务器(如开发和测试服务器)中触发一个ksh脚本


tutorial.ksh存在于路径(/A/B/C/tutorial.ksh)的dev server(conn_id为“dev”)和路径(/A/B/D/tutorial.ksh)的test server(conn_id为“test”)中。在这里,您可以看到dev中的C文件夹和test中的D文件夹……我应该在哪个区域更新代码?

SSHOperator
的每个实例在单个服务器上执行命令。 您需要按照中的说明分别定义每个连接,然后可以执行以下操作:

server_connection_ids = ['dev', 'test']
start_op = DummyOperator(task_id="start_task", dag=dag)
for conn in server_connection_ids:
    bash_tutorial = f"""
      echo "Execute shell file: /A/B/server/tutorial.ksh"
      echo "{{macros.ds_format(ds, "%Y-%m-%d", "%m-%d-%Y"}}"
      source /home/johnbs/.profile
      /A/B/{conn}/tutorial.ksh
     """
    ssh_op = SSHOperator(
        ssh_conn_id=f'{conn}',
        task_id=f'ssh_{conn}_task',
        command=bash_tutorial,
        dag=dag
    )

这将为每台服务器创建一个任务。

bash\u tutorial=“”echo”执行shell文件:/a/B/server/tutorial.ksh“echo”{{macros.ds\u格式(ds,“%Y-%m-%d”,“%m-%d-%Y”}}”source/home/johnbs/.profile/a/B/server/tutorial.ksh”“”关于服务器,我需要在路径中提到什么?即/A/B/?/tutorial.ksh?有人能帮助我理解上述解决方案吗please@Johnbsdk10请参阅editI已通过更改路径更新了问题,如dev和test server中特定文件夹中的ksh文件..在dev中,ksh文件位于/A/B/C/tutorial.ksh…在test中,其/A/B/D/tutorial.kshy您的问题似乎在发展,您当前的问题与气流无关。这是一个知道如何使用python对象的问题。您可以将列表更改为dict,存储与每个服务器相关的所有唯一信息。如果您不知道如何做,可以使用python标记打开一个新问题。