Nous utilisons airflow comme planificateur. Je veux appeler un opérateur bash simple dans un DAG. Le script bash a besoin du mot de passe comme argument pour effectuer un traitement ultérieur.
Comment puis-je stocker un mot de passe en toute sécurité dans airflow (config/variables/connection) et y accéder dans le fichier de définition dag.
Je suis nouveau dans le domaine des flux d’air et de Python, donc un extrait de code sera apprécié.
Vous pouvez stocker le mot de passe dans un crochet. Celui-ci sera crypté aussi longtemps que vous aurez configuré votre clé de réseau.
Voici comment vous pouvez créer une connexion.
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)
Ensuite, ce mot de passe est crypté dans la base de données que vous avez configurée.
Pour accéder à ce mot de passe:
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.
MODIFIER:
Il existe un moyen plus simple de créer une connexion via l'interface utilisateur:
Dans ce cas, j'utiliserais un opérateur Python à partir duquel vous pouvez obtenir un Hook
sur votre connexion à la base de données en utilisant hook = PostgresHook(postgres_conn_id=postgres_conn_id)
. Vous pouvez ensuite appeler get_connection
sur ce hook, ce qui vous donnera un objet Connection à partir duquel vous pourrez obtenir l'hôte, le nom d'utilisateur et le mot de passe pour votre connexion à la base de données.
Enfin, utilisez par exemple subprocess.call(your_script.sh, connection_string)
en transmettant les détails de la connexion en tant que paramètre.
Cette méthode est un peu compliquée, mais elle vous permet de conserver le cryptage des connexions à la base de données dans Airflow. En outre, vous devriez pouvoir extraire cette stratégie dans une classe d'opérateur distincte héritant du comportement de base de PythonOperator, mais en ajoutant la logique permettant d'obtenir le raccordement et d'appeler le script bash.
C'est ce que j'ai utilisé.
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,
)
Vous pouvez stocker le mot de passe dans des variables de flux d’air, 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)