简体   繁体   English

Airflow 从 BashOperator 到 SSHOperator 的 XCOM 通信

[英]Airflow XCOM communication from BashOperator to SSHOperator

I just began learning Airflow, but it is quite difficult to grasp the concept of Xcom.刚开始学习Airflow,但是Xcom的概念还是比较难掌握的。 Therefore I wrote a dag like this:因此我写了一个这样的dag:

from airflow import DAG
from airflow.utils.edgemodifier import Label

from datetime import datetime
from datetime import timedelta

from airflow.operators.bash import BashOperator
from airflow.contrib.operators.ssh_operator import SSHOperator
from airflow.contrib.hooks.ssh_hook import SSHHook

#For more default argument for a task (or creating templates), please check this website
#https://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/models/index.html#airflow.models.BaseOperator

default_args = {
    'owner': '...',
    'email': ['...'],
    'email_on_retry': False,
    'email_on_failure': True,
    'retries': 3,
    'retry_delay': timedelta(minutes=5),
    'start_date': datetime(2021, 6, 10, 23, 0, 0, 0),
    
}

hook = SSHHook(
    remote_host='...',
    username='...',
    password='...## Heading ##',
    port=22,
)

with DAG(
    'test_dag',
    description='This is my first DAG to learn BASH operation, SSH connection, and transfer data among jobs',
    default_args=default_args,
    start_date=datetime(2021, 6, 10, 23, 0, 0, 0),
    schedule_interval="0 * * * *",
    tags = ['Testing', 'Tutorial'],
) as dag:
    # Declare Tasks
    Read_my_IP = BashOperator(
        # Task ID has to be the combination of alphanumeric chars, dashes, dots, and underscores 
        task_id='Read_my_IP',
        # The last line will be pushed to next task
        bash_command="hostname -i | awk '{print $1}'",
    )

    Read_remote_IP = SSHOperator(
        task_id='Read_remote_IP',
        ssh_hook=hook,
        environment={
            'Pi_IP': Read_my_IP.xcom_pull('Read_my_IP'),
        },
        command="echo {{Pi_IP}}",
    )

    # Declare Relationship between tasks
    Read_my_IP >> Label("PI's IP address") >> Read_remote_IP

The first task ran successfully, but I could not obtain the XCom return_value from task Read_my_IP , which is the IP address of the local machine.第一个任务运行成功,但是我无法从任务Read_my_IP获取 XCom return_value,即本地机器的 IP 地址。 This might be very basic, but the documentation does not mention how to declare task_instance .这可能是非常基本的,但文档没有提到如何声明task_instance

Please help to complete the Xcom flow and pass the IP address from the local machine to the remote machine for further procedure.请帮助完成 Xcom 流程并将 IP 地址从本地机器传递到远程机器以进行进一步的过程。

The command parameter of SSHOperator is templated thus you can get the xcom directly: SSHOperatorcommand参数是模板化的,因此您可以直接获取 xcom:

Read_remote_IP = SSHOperator(
    task_id='Read_remote_IP',
    ssh_hook=hook,
    command="echo {{ ti.xcom_pull(task_ids='Read_my_IP') }}"
)

Note that you need also to explicitly ask for xcom to be pushed from BashOperator (see operator description ):请注意,您还需要明确要求从 BashOperator 推送BashOperator (请参阅操作员描述):

Read_my_IP = BashOperator(
    # Task ID has to be the combination of alphanumeric chars, dashes, dots, and underscores 
    task_id='Read_my_IP',
    # The last line will be pushed to next task
    bash_command="hostname -i | awk '{print $1}'",
    do_xcom_push=True
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM