web-dev-qa-db-fra.com

Stocker et accéder au mot de passe en utilisant Apache Airflow

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é.

9
Anup

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:

 Main Menu Ensuite:  Create Connection

18
Daniel Lee

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.

1
Matthijs Brouns

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,
    )
0
Don Bar

Vous pouvez stocker le mot de passe dans des variables de flux d’air, https://airflow.incubator.Apache.org/ui.html#variable-view

  1. Créez une variable avec la clé et la valeur dans l'interface utilisateur, par exemple, mypass: XXX
  2. Variable d'importation from airflow.models import Variable
  3. MyPass = Variable.get ("mypass")
  4. Passez MyPass à votre script bash:
command = """
          echo "{{ params.my_param }}"
          """



task = BashOperator(
        task_id='templated',
        bash_command=command,
        params={'my_param': MyPass},
        dag=dag)
0
Chengzhi