Π£ ΠΏΡΠΈΠΏΡΠ΅ΠΌΠΈ Π½Π°ΡΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ Π½Π°ΠΈΠ»Π°Π·ΠΈΠΌΠΎ Π½Π° ΡΠ΅ΡΠΊΠΎΡΠ΅ Ρ ΡΠ°Π΄Ρ ΡΠ° Π½Π΅ΠΊΠΈΠΌ Π°Π»Π°ΡΠΈΠΌΠ°. Π Ρ ΡΡΠ΅Π½ΡΡΠΊΡ ΠΊΠ°Π΄Π° ΠΈΡ Π½Π°ΠΈΡΠ΅ΠΌΠΎ, Π½Π΅ΠΌΠ° ΡΠ²Π΅ΠΊ Π΄ΠΎΠ²ΠΎΡΠ½ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ ΠΈ ΡΠ»Π°Π½Π°ΠΊΠ° ΠΊΠΎΡΠΈ Π±ΠΈ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·Π±ΠΎΡΠΈ ΡΠ° ΠΎΠ²ΠΈΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΌ.
Π’Π°ΠΊΠΎ ΡΠ΅ Π±ΠΈΠ»ΠΎ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, 2015. Π³ΠΎΠ΄ΠΈΠ½Π΅, Π° ΠΊΠΎΡΠΈΡΡΠΈΠ»ΠΈ ΡΠΌΠΎ Π₯Π°Π΄ΠΎΠΎΠΏ ΠΊΠ»Π°ΡΡΠ΅Ρ ΡΠ° Π‘ΠΏΠ°ΡΠΊΠΎΠΌ Π·Π° 35 ΠΈΡΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½ΠΈΡ
ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡ ΠΠΈΠ³ ΠΠ°ΡΠ° Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡ. ΠΠΈΡΠ΅ Π±ΠΈΠ»ΠΎ ΡΠ°ΡΠ½ΠΎ ΠΊΠ°ΠΊΠΎ Π³Π° ΠΏΡΠΈΠΏΡΠ΅ΠΌΠΈΡΠΈ Π·Π° ΡΠ°ΠΊΠ°Π² ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ ΠΠΠ Π. ΠΠ°ΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΡΠΎΠ³Π°, Π½Π°ΠΊΠΎΠ½ ΡΡΠΎ ΡΡ ΡΠ°ΠΌΠΈ ΡΡ
Π²Π°ΡΠΈΠ»ΠΈ ΠΈ ΠΏΡΠΎΡΠ΅ΡΠ°Π»ΠΈ ΡΡΠ°Π·ΠΎΠΌ, ΠΎΠ½ΠΈ ΡΡ ΡΠΎ ΡΡΠ°Π΄ΠΈΠ»ΠΈ
praistorija
ΠΠ²Π°Ρ ΠΏΡΡ ΡΠ΅ΠΌΠΎ ΠΏΡΠΈΡΠ°ΡΠΈ ΠΎ Π΄ΡΡΠ³Π°ΡΠΈΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡ -
Π‘Π²Π΅ ΡΠ΅ Π³Π΅Π½Π΅ΡΠ°Π»Π½ΠΎ Π΄ΠΎΠ±ΡΠΎ. ΠΠ΅ΠΊΠ° Π³ΡΠ°Π΄Π΅ ΡΠ²ΠΎΡΠ΅ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π΅. ΠΠ΅ΡΡΡΠΈΠΌ, ΠΏΠΎΡΡΠΎΡΠΈ βΠ°Π»ΠΈβ: ΡΠ²ΠΈ Π½Π°ΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΡΠΊΠΈ Π½Π°ΠΏΡΠ΅Π΄Π½ΠΈ Ρ ΡΠΌΠΈΡΠ»Ρ ΡΠ°ΠΌΠΎΠ³ ΠΏΡΠΎΡΠ΅ΡΠ° ΡΡΠ΅ΡΠ°. ΠΠ° Π±ΠΈΡΠΌΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΠ»ΠΈ Π»Π°Π±ΠΎΡΠ°ΡΠΎΡΠΈΡΡ, ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ Π°ΡΡΠΎΠΌΠ°ΡΡΠΊΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠ΅: ΡΡΠ΅ΡΠ½ΠΈΠΊ ΡΡΠ΅Π±Π° Π΄Π° ΠΎΠ΄Π΅ Π½Π° ΡΠ²ΠΎΡ Π»ΠΈΡΠ½ΠΈ Π½Π°Π»ΠΎΠ³, ΠΊΠ»ΠΈΠΊΠ½Π΅ Π½Π° Π΄ΡΠ³ΠΌΠ΅ βΠΡΠΎΠ²Π΅ΡΠΈβ ΠΈ Π½Π°ΠΊΠΎΠ½ Π½Π΅ΠΊΠΎΠ³ Π²ΡΠ΅ΠΌΠ΅Π½Π° Π²ΠΈΠ΄ΠΈ Π½Π΅ΠΊΡ Π²ΡΡΡΡ ΠΏΡΠΎΡΠΈΡΠ΅Π½Π΅ ΠΏΠΎΠ²ΡΠ°ΡΠ½Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ΅ ΠΎ ΡΠΎΠΌΠ΅ ΡΡΠ° ΡΠ΅ ΡΡΠ°Π΄ΠΈΠΎ. Π Ρ ΠΎΠ²ΠΎΠΌ ΡΡΠ΅Π½ΡΡΠΊΡ ΠΏΠΎΡΠΈΡΠ΅ΠΌΠΎ Π΄Π° ΠΏΡΠΈΡΡΡΠΏΠ°ΠΌΠΎ Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΡΠΎΠ²Π΅ΡΠ° ΠΎΠ²Π΅ Π»Π°Π±ΠΎΡΠ°ΡΠΎΡΠΈΡΠ΅ ΡΠ΅ ΡΡΠ΅ΡΠ΅Π½Π° Π½Π° ΡΠ»Π΅Π΄Π΅ΡΠΈ Π½Π°ΡΠΈΠ½: ΡΠ°ΡΠ΅ΠΌΠΎ ΠΏΠ°ΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈΡ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΠ°ΡΠΊΠΈ ΡΡΠ΅ΡΠ½ΠΈΠΊΠ°, Π·Π°ΡΠΈΠΌ ΠΠΎΠ±Π»ΠΈΠ½ ΠΏΡΠ΅Π½ΠΎΡΠΈ ΠΎΠ²Π°Ρ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Ρ Π₯ΠΠ€Π‘, Π·Π°ΡΠΈΠΌ ΠΠΈΡΡΠ»ΠΎΠ² ΡΠ·ΠΈΠΌΠ° ΠΎΠ²Π°Ρ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΈ ΡΡΠ°Π²ΡΠ° Π³Π° Ρ Π¦Π»ΠΈΡΠΊΠ₯ΠΎΡΡΠ΅. Π’ΡΠΈΠΊ ΡΠ΅ Ρ ΡΠΎΠΌΠ΅ ΡΡΠΎ ΠΠΈΡΡΠ»ΠΎΠ² Π½Π΅ ΠΌΠΎΡΠ° ΡΠΎ Π΄Π° ΡΠ°Π΄ΠΈ Ρ ΡΠ΅Π°Π»Π½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Ρ, Π²Π΅Ρ ΠΏΠΎ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄Ρ: ΡΠ΅Π΄Π½ΠΎΠΌ ΡΠ²Π°ΠΊΠΈΡ 15 ΠΌΠΈΠ½ΡΡΠ° ΡΠ·ΠΈΠΌΠ° Π³ΠΎΠΌΠΈΠ»Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠ° ΠΈΡ .
ΠΡΠΏΠΎΡΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΅ Π΄Π° ΠΌΠΎΡΠ°ΠΌΠΎ Π½Π΅ΠΊΠ°ΠΊΠΎ ΡΠ°ΠΌΠΈ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΠΌΠΎ ΡΠΈΡ
ΠΎΠ² ΠΠΠ Π½Π° Π½Π°Ρ Π·Π°Ρ
ΡΠ΅Π² Π΄ΠΎΠΊ ΡΠ΅ΠΊΠΊΠ΅Ρ ΡΠ°Π΄ΠΈ ΠΎΠ²Π΄Π΅ ΠΈ ΡΠ°Π΄Π°. ΠΡΠ³Π»Π°ΡΡΡΠΈ, ΡΠ°Π·Π½Π°Π»ΠΈ ΡΠΌΠΎ Π΄Π° Π·Π° ΠΊΠ°ΡΠ½ΠΈΡΠ΅ Π²Π΅ΡΠ·ΠΈΡΠ΅ ΠΠΈΡΡΠ»ΠΎΠ²-Π° ΠΏΠΎΡΡΠΎΡΠΈ ΡΠ·Π² experimental
, Π½Π°ΡΠ°Π²Π½ΠΎ, Π·Π²ΡΡΠΈ Π·Π°ΡΡΡΠ°ΡΡΡΡΡΠ΅, Π°Π»ΠΈ ΡΡΠ° Π΄Π° ΡΠ΅ ΡΠ°Π΄ΠΈ ... ΠΠ΄ΡΠ΅Π΄Π½ΠΎΠΌ ΡΠ΅ ΡΠ·Π»Π΅ΡΠΈ.
ΠΠ°ΡΠΈΠΌ ΡΠ΅ΠΌΠΎ ΠΎΠΏΠΈΡΠ°ΡΠΈ ΡΠ΅ΠΎ ΠΏΡΡ: ΠΎΠ΄ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ° ΠΠΈΡΡΠ»ΠΎΠ²-Π° Π΄ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ° ΠΠΠ‘Π’ Π·Π°Ρ ΡΠ΅Π²Π° ΠΊΠΎΡΠΈ ΠΏΠΎΠΊΡΠ΅ΡΠ΅ ΠΠΠ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈ ΠΠΠ. Π Π°Π΄ΠΈΡΠ΅ΠΌΠΎ ΡΠ° Π£Π±ΡΠ½ΡΡ 16.04.
1. ΠΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ° ΠΏΡΠΎΡΠΎΠΊΠ° Π²Π°Π·Π΄ΡΡ Π°
Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌΠΎ Π΄Π° Π»ΠΈ ΠΈΠΌΠ°ΠΌΠΎ ΠΠΈΡΡ ΠΎΠ½ 3 ΠΈ Π²ΠΈΡΡΡΠ°Π»Π΅Π½Π².
$ python3 --version
Python 3.6.6
$ virtualenv --version
15.2.0
ΠΠΊΠΎ ΡΠ΅Π΄Π°Π½ ΠΎΠ΄ ΠΎΠ²ΠΈΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠ΅, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ Π³Π°.
Π‘Π°Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌ Ρ ΠΊΠΎΠΌΠ΅ ΡΠ΅ΠΌΠΎ Π½Π°ΡΡΠ°Π²ΠΈΡΠΈ Π΄Π° ΡΠ°Π΄ΠΈΠΌΠΎ ΡΠ° ΠΠΈΡΡΠ»ΠΎΠ²-ΠΎΠΌ.
$ mkdir <your name of directory>
$ cd /path/to/your/new/directory
$ virtualenv -p which python3 venv
$ source venv/bin/activate
(venv) $
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ ΠΏΡΠΎΡΠΎΠΊ Π²Π°Π·Π΄ΡΡ Π°:
(venv) $ pip install airflow
ΠΠ΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΊΠΎΡΠΎΡ ΡΠΌΠΎ ΡΠ°Π΄ΠΈΠ»ΠΈ: 1.10.
Π‘Π°Π΄Π° ΡΡΠ΅Π±Π° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌ airflow_home
, Π³Π΄Π΅ ΡΠ΅ ΡΠ΅ Π½Π°Π»Π°Π·ΠΈΡΠΈ ΠΠΠ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΈ Π΄ΠΎΠ΄Π°ΡΠΈ ΠΠΈΡΡΠ»ΠΎΠ². ΠΠ°ΠΊΠΎΠ½ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΠ°, ΠΏΠΎΠ΄Π΅ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Ρ ΠΎΠΊΡΡΠΆΠ΅ΡΠ° AIRFLOW_HOME
.
(venv) $ cd /path/to/my/airflow/workspace
(venv) $ mkdir airflow_home
(venv) $ export AIRFLOW_HOME=<path to airflow_home>
Π‘Π»Π΅Π΄Π΅ΡΠΈ ΠΊΠΎΡΠ°ΠΊ ΡΠ΅ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΊΠΎΡΠ° ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°ΡΠΈ ΠΈ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΠΈ Π±Π°Π·Ρ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΡΠΎΠΊΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Ρ Π‘ΠΠΠΈΡΠ΅-Ρ:
(venv) $ airflow initdb
ΠΠ°Π·Π° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΡΠ΅ Π±ΠΈΡΠΈ ΠΊΡΠ΅ΠΈΡΠ°Π½Π° Ρ airflow.db
Π£ΠΎΠ±ΠΈΡΠ°ΡΠ΅Π½ΠΎ.
ΠΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π΄Π° Π»ΠΈ ΡΠ΅ ΠΠΈΡΡΠ»ΠΎΠ² ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½:
$ airflow version
[2018-11-26 19:38:19,607] {__init__.py:57} INFO - Using executor SequentialExecutor
[2018-11-26 19:38:19,745] {driver.py:123} INFO - Generating grammar tables from /usr/lib/python3.6/lib2to3/Grammar.txt
[2018-11-26 19:38:19,771] {driver.py:123} INFO - Generating grammar tables from /usr/lib/python3.6/lib2to3/PatternGrammar.txt
____________ _____________
____ |__( )_________ __/__ /________ __
____ /| |_ /__ ___/_ /_ __ /_ __ _ | /| / /
___ ___ | / _ / _ __/ _ / / /_/ /_ |/ |/ /
_/_/ |_/_/ /_/ /_/ /_/ ____/____/|__/
v1.10.0
ΠΠΊΠΎ ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°Π»Π°, ΠΎΠ½Π΄Π° ΡΠ΅ ΠΠΈΡΡΠ»ΠΎΠ² ΠΊΡΠ΅ΠΈΡΠ°ΠΎ ΡΠΎΠΏΡΡΠ²Π΅Π½Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ airflow.cfg
Π² AIRFLOW_HOME
:
$ tree
.
βββ airflow.cfg
βββ unittests.cfg
ΠΠΈΡΡΠ»ΠΎΠ² ΠΈΠΌΠ° Π²Π΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ. ΠΠΎΠΆΠ΅ ΡΠ΅ ΠΏΠΎΠΊΡΠ΅Π½ΡΡΠΈ ΠΏΠΎΠΊΡΠ΅ΡΠ°ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π΅:
(venv) $ airflow webserver --port 8081
Π‘Π°Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΈΡΡΡΠΏΠΈΡΠ΅ Π²Π΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΡ Ρ ΠΏΡΠ΅ΡΡΠ°ΠΆΠΈΠ²Π°ΡΡ Π½Π° ΠΏΠΎΡΡΡ 8081 Π½Π° Ρ
ΠΎΡΡΡ Π³Π΄Π΅ ΡΠ΅ ΠΠΈΡΡΠ»ΠΎΠ² Π±ΠΈΠΎ ΠΏΠΎΠΊΡΠ΅Π½ΡΡ, ΠΎΠ²Π°ΠΊΠΎ: <hostname:8081>
.
2. Π Π°Π΄ ΡΠ° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈΠΌ ΠΠΠ-ΡΠ΅ΠΌ
ΠΠ° ΠΎΠ²ΠΎΠΌ ΠΠΈΡΡΠ»ΠΎΠ² ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ ΠΈ ΡΠΏΡΠ΅ΠΌΠ°Π½ Π·Π° ΡΠ°Π΄. ΠΠ΅ΡΡΡΠΈΠΌ, ΡΠ°ΠΊΠΎΡΠ΅ ΠΌΠΎΡΠ°ΠΌΠΎ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΠΌΠΎ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈ ΠΠΠ. ΠΠ°ΡΠΈ ΡΠ΅ΠΊΠ΅ΡΠΈ ΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π½Π° ΠΠΈΡΡ
ΠΎΠ½-Ρ, ΡΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ Π΄Π°ΡΠ΅ ΡΠ²ΠΈ Π·Π°Ρ
ΡΠ΅Π²ΠΈ Π±ΠΈΡΠΈ Π½Π° ΡΠ΅ΠΌΡ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ requests
.
Π£ ΡΡΠ²Π°ΡΠΈ, ΠΠΠ Π²Π΅Ρ ΡΠ°Π΄ΠΈ Π·Π° ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π΅ Π·Π°Ρ ΡΠ΅Π²Π΅. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΠ°Π² Π·Π°Ρ ΡΠ΅Π² Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡΡΠ°Π²Π° Π΄Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎΠ² ΡΠ°Π΄:
>>> import requests
>>> host = <your hostname>
>>> airflow_port = 8081 #Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΠΊΠΎΠΉ, Π° ΠΏΠΎ Π΄Π΅ΡΠΎΠ»ΡΡ 8080
>>> requests.get('http://{}:{}/{}'.format(host, airflow_port, 'api/experimental/test').text
'OK'
ΠΠΊΠΎ ΡΡΠ΅ Π΄ΠΎΠ±ΠΈΠ»ΠΈ ΡΠ°ΠΊΠ²Ρ ΠΏΠΎΡΡΠΊΡ ΠΊΠ°ΠΎ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ, ΡΠΎ Π·Π½Π°ΡΠΈ Π΄Π° ΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ΅.
ΠΠ΅ΡΡΡΠΈΠΌ, ΠΊΠ°Π΄Π° ΠΆΠ΅Π»ΠΈΠΌΠΎ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΠΌΠΎ ΠΠΠ, Π½Π°ΠΈΠ»Π°Π·ΠΈΠΌΠΎ Π½Π° ΡΠΈΡΠ΅Π½ΠΈΡΡ Π΄Π° ΡΠ΅ ΠΎΠ²Π° Π²ΡΡΡΠ° Π·Π°Ρ ΡΠ΅Π²Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ ΡΠΏΡΡΠΈΡΠΈ Π±Π΅Π· Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ΅.
ΠΠ° Π±ΠΈΡΡΠ΅ ΡΠΎ ΡΡΠ°Π΄ΠΈΠ»ΠΈ, ΠΌΠΎΡΠ°ΡΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ Π½ΠΈΠ· ΡΠ°Π΄ΡΠΈ.
ΠΡΠ²ΠΎ, ΠΌΠΎΡΠ°ΡΠ΅ Π΄ΠΎΠ΄Π°ΡΠΈ ΠΎΠ²ΠΎ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡ:
[api]
auth_backend = airflow.contrib.auth.backends.password_auth
ΠΠ°ΡΠΈΠΌ ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠ²ΠΎΠ³ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° ΡΠ° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΠΊΠΈΠΌ ΠΏΡΠ°Π²ΠΈΠΌΠ°:
>>> import airflow
>>> from airflow import models, settings
>>> from airflow.contrib.auth.backends.password_auth import PasswordUser
>>> user = PasswordUser(models.Admin())
>>> user.username = 'new_user_name'
>>> user.password = 'set_the_password'
>>> session = settings.Session()
>>> session.add(user)
>>> session.commit()
>>> session.close()
>>> exit()
ΠΠ°ΡΠΈΠΌ ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° ΡΠ° Π½ΠΎΡΠΌΠ°Π»Π½ΠΈΠΌ ΠΏΡΠ°Π²ΠΈΠΌΠ° ΠΊΠΎΠΌΠ΅ ΡΠ΅ Π±ΠΈΡΠΈ Π΄ΠΎΠ·Π²ΠΎΡΠ΅Π½ΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΠΠ ΠΎΠΊΠΈΠ΄Π°Ρ.
>>> import airflow
>>> from airflow import models, settings
>>> from airflow.contrib.auth.backends.password_auth import PasswordUser
>>> user = PasswordUser(models.User())
>>> user.username = 'newprolab'
>>> user.password = 'Newprolab2019!'
>>> session = settings.Session()
>>> session.add(user)
>>> session.commit()
>>> session.close()
>>> exit()
Π‘Π°Π΄Π° ΡΠ΅ ΡΠ²Π΅ ΡΠΏΡΠ΅ΠΌΠ½ΠΎ.
3. ΠΠΎΠΊΡΠ΅ΡΠ°ΡΠ΅ ΠΠΠ‘Π’ Π·Π°Ρ ΡΠ΅Π²Π°
Π‘Π°ΠΌ ΠΠΠ‘Π’ Π·Π°Ρ ΡΠ΅Π² ΡΠ΅ ΠΈΠ·Π³Π»Π΅Π΄Π°ΡΠΈ ΠΎΠ²Π°ΠΊΠΎ:
>>> dag_id = newprolab
>>> url = 'http://{}:{}/{}/{}/{}'.format(host, airflow_port, 'api/experimental/dags', dag_id, 'dag_runs')
>>> data = {"conf":"{"key":"value"}"}
>>> headers = {'Content-type': 'application/json'}
>>> auth = ('newprolab', 'Newprolab2019!')
>>> uri = requests.post(url, data=json.dumps(data), headers=headers, auth=auth)
>>> uri.text
'{n "message": "Created <DagRun newprolab @ 2019-03-27 10:24:25+00:00: manual__2019-03-27T10:24:25+00:00, externally triggered: True>"n}n'
ΠΠ°Ρ ΡΠ΅Π² ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½.
Π‘Ρ ΠΎΠ΄Π½ΠΎ ΡΠΎΠΌΠ΅, ΠΎΠ½Π΄Π° Π΄Π°ΡΠ΅ΠΌΠΎ ΠΠΠ-Ρ ΠΌΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π° Π΄Π° ΠΎΠ±ΡΠ°Π΄ΠΈ ΠΈ ΡΠΏΡΡΠΈ Π·Π°Ρ ΡΠ΅Π² ΡΠ°Π±Π΅Π»ΠΈ Π¦Π»ΠΈΡΠΊΠ₯ΠΎΡΡΠ΅, ΠΏΠΎΠΊΡΡΠ°Π²Π°ΡΡΡΠΈ Π΄Π° ΡΡ Π²Π°ΡΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°.
ΠΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ΅ Π·Π°Π²ΡΡΠ΅Π½Π°.
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ Π°Π±Ρ.ΡΠΎΠΌ