% git init
% git add .gitignore
% git commit -m "init"
% git remote add origin https://github.com/<username>/<repository>
% git push
.gitignore
를 로컬 Airflow 설치 경로에 복제하여 불필요한 /logs
경로 등을 Git에서 제외% tree -a -F .
./
├── .env
├── .git/
├── .gitignore
├── config/
│ └── airflow.cfg
├── dags/
├── docker-compose.yaml
├── logs/
└── plugins/
# docker-compose.yaml
AIRFLOW__CORE__LOAD_EXAMPLES: 'false'
airflow db reset
등 여러가지 초기화 방법을 탐색했지만, 결과적으로 localhost:8080
에 대한 크롬 브라우저 캐시를 삭제하니 해결https://airflow.apache.org/docs/apache-airflow-providers-standard/stable/operators/bash.html
dags/
경로 아래에 bash_operator.py
파일을 생성example_bash_operator
를 복제 및 일부를 수정하여 DAG 선언# dags/bash_operator.py
from airflow.sdk import DAG
from airflow.providers.standard.operators.bash import BashOperator
import pendulum
with DAG(
dag_id="bash_operator",
schedule="0 0 * * *",
start_date=pendulum.datetime(2025, 1, 1, tz="Asia/Seoul"),
catchup=False,
tags=["example", "bash"],
) as dag:
bash_task1 = BashOperator(
task_id="bash_task1",
bash_command="echo whoami",
)
bash_task2 = BashOperator(
task_id="bash_task2",
bash_command="echo $HOSTNAME",
)
bash_task1 >> bash_task2
dag_id
: UI에서 표시되는 DAG 명칭, 관리의 용이성을 위해 파일 명칭과 동일하게 지정schedule
: 크론탭(Crontab)을 사용하여 스케줄 지정start_date
: 작업 시작일을 지정, 예시에는 시간대가 UTC로 적용되어 Asia/Seoul로 변경catchup
: 시작일(start_date
)부터 현재까지 실행되지 않은 작업을 일괄로 실행 (True
)dagrun_timeout
: DAG 실행 시간을 제한tags
: UI에서 DAG를 구별하기 위한 태그 지정BashOperator
를 사용하여 두 개의 bash 명령어를 실행하는 Task를 정의task_id
: UI에서 표시되는 Task 명칭, 관리의 용이성을 위해 객체명과 동일하게 지정bash_command
: 실행할 bash 명령어>>
기호로 연결하여 종속성을 표시task1 >> [task2, task3]
)task1 >> task2 >> task3
)bash_task
과 bash_task2
의 관계를 그래프로 조회 가능bash_task1
과 bash_task2
에 대해 각각의 로그를 확인bash_task1
에는 echo whoami
명령어가 전달되어 whoami
를 결과로 출력bash_task2
에는 echo $HOSTNAME
명령어가 전달되어 컨테이너의 HOSTNAME
을 출력# bash_task1
[2025-05-30, 00:16:56] INFO - Running command: ['/usr/bin/bash', '-c', 'echo whoami']: source="airflow.task.hooks.airflow.providers.standard.hooks.subprocess.SubprocessHook"
[2025-05-30, 00:16:56] INFO - Output:: source="airflow.task.hooks.airflow.providers.standard.hooks.subprocess.SubprocessHook"
[2025-05-30, 00:16:56] INFO - whoami: source="airflow.task.hooks.airflow.providers.standard.hooks.subprocess.SubprocessHook"
# bash_task2
[2025-05-30, 00:16:57] INFO - Running command: ['/usr/bin/bash', '-c', 'echo $HOSTNAME']: source="airflow.task.hooks.airflow.providers.standard.hooks.subprocess.SubprocessHook"
[2025-05-30, 00:16:57] INFO - Output:: source="airflow.task.hooks.airflow.providers.standard.hooks.subprocess.SubprocessHook"
[2025-05-30, 00:16:57] INFO - wha439072926: source="airflow.task.hooks.airflow.providers.standard.hooks.subprocess.SubprocessHook"