将所有气流连接导出到新环境

时间:2019-04-11 06:42:38

标签: airflow

我正在尝试将所有现有的气流连接迁移到新的气流。

我当时在看cli选项airflow connections --help,它提供了一个列出选项,但没有提供从json格式导出/导入到json格式的选项。

是否可以通过cli / airui ui跨多个气流迁移连接?

4 个答案:

答案 0 :(得分:2)

您可以直接连接到Airflow meta db并转储这些连接,然后将它们加载到单独的数据库中。 但是,如果要自动化这样的操作,可以先将其转储到CSV文件中:

from airflow.utils import db
from airflow.models import Connection
import csv

outfile = open('myconnections.csv', 'w')
outcsv = csv.writer(outfile)

with db.create_session() as session:
    connections = session.query(Connection).all()

conn_list = [
    [getattr(c, column.name) for column in Connection.__mapper__.columns]
    for c in connections
]
outcsv.writerows(conn_list)
outfile.close()

之后,您可以手动或使用类似的脚本将其加载到新数据库中。

重要:如果启用了加密,则为这些连接存储的密码将被加密,并且在将它们加载到新的数据库时,必须使用相同的Fernet密钥,否则您将获得成功。无法解密它们。

答案 1 :(得分:2)

这将允许您导出所有连接,以便可以通过CLI(https://airflow.apache.org/docs/stable/howto/connection/index.html#creating-a-connection-from-the-cli)在其他位置重新添加它们。无论您现有的安装位置在哪里,都可以在Python中运行它:

from airflow.hooks.base_hook import BaseHook

for c in ['my', 'list', 'of', 'connections']:
    conn = BaseHook.get_connection(c)
    print("airflow connections --add \\ \n \
    --conn_id '{conn_id}' \\ \n \
    --conn_type '{conn_type}' \\ \n \
    --conn_host '{conn_host}' \\ \n \
    --conn_schema '{conn_schema}' \\ \n \
    --conn_login '{conn_login}' \\ \n \
    --conn_password '{conn_password}' \\ \n \
    --conn_port '{conn_port}' \\ \n \
    --conn_extra '{conn_extra}' \\".format(
        conn_id=conn.conn_id,
        conn_type=conn.conn_type,
        conn_host=conn.host,
        conn_schema=conn.schema,
        conn_login=conn.login,
        conn_password=conn.password,
        conn_port=conn.port,
        conn_extra=conn.extra,
    ))

这还将输出解密的密码。经过测试并使用Airflow 1.10.12。

答案 2 :(得分:0)

对于那些使用 astronomer.io 的人,此 DAG 将输出适合粘贴到 <button id="myButton"> click me </button> <input type="text" id="numbers" /> 中的 YAML,然后在下次启动时导入:

https://gist.github.com/vshih/c486bef62d072f13ba21e327f094ec6f

答案 3 :(得分:0)

我只想补充一点,连接也可以使用 get_uri() 函数以 URL 格式轻松导出,如下所示:

outfile = open('conns.csv', 'w')
outcsv = csv.writer(outfile)

with db.create_session() as session:
    connections = session.query(Connection).all()

conn_list = []
for c in connections:
    if 'default' not in c.conn_id:
        conn_list.append([c.conn_id, c.get_uri()])

outcsv.writerows(conn_list)
outfile.close()