気流をスケジューラとして使用しています。 DAGで単純なbash演算子を呼び出したい。 bashスクリプトでは、さらに処理を行うために引数としてパスワードが必要です。
エアフロー(config/variables/connection)にパスワードを安全に保存し、DAG定義ファイルでアクセスするにはどうすればよいですか。
私は気流が初めてなので、Pythonなので、コードスニペットをいただければ幸いです。
パスワードをフックに保存できます-これは、fernetキーをセットアップしている限り暗号化されます。
接続を作成する方法は次のとおりです。
from airflow.models import Connection
def create_conn(username, password, Host=None):
new_conn = Connection(conn_id=f'{username}_connection',
login=username,
Host=host if Host else None)
new_conn.set_password(password)
次に、このパスワードはセットアップしたdbで暗号化されます。
このパスワードにアクセスするには:
from airflow.hooks.base_hook import BaseHook
connection = BaseHook.get_connection("username_connection")
password = connection.password # This is a getter that returns the unencrypted password.
編集:
UIを介して接続を作成する簡単な方法があります。
パスワードをエアフロー変数に保存できます https://airflow.incubator.Apache.org/ui.html#variable-view
from airflow.models import Variable
command = """
echo "{{ params.my_param }}"
"""
task = BashOperator(
task_id='templated',
bash_command=command,
params={'my_param': MyPass},
dag=dag)
この場合、hook = PostgresHook(postgres_conn_id=postgres_conn_id)
を使用してデータベース接続でHook
を取得できるPythonOperatorを使用します。次に、このフックで_get_connection
_を呼び出すと、データベース接続のホスト、ログイン、パスワードを取得できるConnectionオブジェクトを取得できます。
最後に、たとえばsubprocess.call(your_script.sh, connection_string)
を使用して、接続の詳細をパラメーターとして渡します。
この方法は少し複雑ですが、Airflowでデータベース接続の暗号化を維持できます。また、PythonOperatorから基本動作を継承するが、フックを取得してbashスクリプトを呼び出すためのロジックを追加する別のOperatorクラスにこの戦略をプルできる必要があります。
これは私が使用したものです。
def add_slack_token(ds, **kwargs):
""""Add a slack token"""
session = settings.Session()
new_conn = Connection(conn_id='slack_token')
new_conn.set_password(SLACK_LEGACY_TOKEN)
if not (session.query(Connection).filter(Connection.conn_id ==
new_conn.conn_id).first()):
session.add(new_conn)
session.commit()
else:
msg = '\n\tA connection with `conn_id`={conn_id} already exists\n'
msg = msg.format(conn_id=new_conn.conn_id)
print(msg)
dag = DAG(
'add_connections',
default_args=default_args,
schedule_interval="@once")
t2 = PythonOperator(
dag=dag,
task_id='add_slack_token',
python_callable=add_slack_token,
provide_context=True,
)