【问题标题】:Schedule the shell script in different servers using same DAG file使用相同的 DAG 文件在不同的服务器中调度 shell 脚本
【发布时间】:2021-04-19 10:56:55
【问题描述】:

我对 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
        )

使用气流,我想在开发和测试服务器等不同服务器中触发 ksh 脚本,即

tutorial.ksh 存在于路径 (/A/B/C/tutorial.ksh) 的开发服务器(conn_id 为 'dev') 和路径 (/A) 的测试服务器(conn_id 为 'test') /B/D/tutorial.ksh)...这里你可以看到来自dev的C文件夹和来自test的D文件夹......我应该在哪个区域更新代码?

【问题讨论】:

    标签: python airflow airflow-scheduler


    【解决方案1】:

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

    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_tutorial = """ echo "执行shell文件:/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 """ 我需要在关于服务器的路径中提到什么?即/ A/B/?/tutorial.ksh?
    • 有人可以帮我理解上述解决方案吗
    • 我已经通过更改路径(如存在于 dev 和 test server 中的特定文件夹中的 ksh 文件)来更新问题。在 dev 中,ksh 文件存在于 /A/B/C/tutorial.ksh 中。 . 在测试中,它的 /A/B/D/tutorial.ksh
    • 您的问题似乎在演变,您当前的问题与 Airflow 无关。知道如何使用 python 对象是一个问题。您可以将列表更改为存储与每个服务器相关的所有唯一信息的 dict。如果你不知道怎么做,你可以用 Python 标签打开一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多