我正在尝试将所有现有的气流连接迁移到新的气流。
我当时在看cli选项airflow connections --help
,它提供了一个列出选项,但没有提供从json格式导出/导入到json格式的选项。
是否可以通过cli / airui ui跨多个气流迁移连接?
答案 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()