如何使用bash批量检索Airflow连接? (Google Composer)

编程入门 行业动态 更新时间:2024-10-24 14:22:36
本文介绍了如何使用bash批量检索Airflow连接? (Google Composer)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试使用基础架构作为代码的方法创建一个作曲者环境. 为此,我需要能够以编程方式存储和检索气流变量,并将它们的版本保持在某个地方.

I am trying to create a composer environment with the approach of infrastructure as code. For this, I need to be able to store and retrieve airflow variables programmatically, and keep them versioned somewhere.

以下命令可让我列出指定的$COMPOSER_ENV

The following command lets me list all my connections within the specified $COMPOSER_ENV

gcloud composer environments run `$COMPOSER_ENV` --location <location> connections -- --list

这是输出:

╒════════════════════════════════╤═════════════════════════════╤════════════════════════════════╤════════╤════════════════╤══════════════════════╤════════════════════════════════╕ │ Conn Id │ Conn Type │ Host │ Port │ Is Encrypted │ Is Extra Encrypted │ Extra │ ╞════════════════════════════════╪═════════════════════════════╪════════════════════════════════╪════════╪════════════════╪══════════════════════╪════════════════════════════════╡ │ 'airflow_db' │ 'mysql' │ 'airflow-sqlp...rvice.default' │ None │ True │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'beeline_default' │ 'beeline' │ 'localhost' │ 10000 │ False │ True │ 'gAAAAABfdZs0...yjt7nj1C2Dzgm' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'bigquery_default' │ 'google_cloud_platform' │ None │ None │ False │ True │ 'gAAAAABfdZs2...AOdwY-EnZLg==' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'local_mysql' │ 'mysql' │ 'localhost' │ None │ True │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'presto_default' │ 'presto' │ 'localhost' │ 3400 │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'google_cloud_default' │ 'google_cloud_platform' │ None │ None │ False │ True │ 'gAAAAABfdZs2...oMm2saUwAxQ==' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'hive_cli_default' │ 'hive_cli' │ None │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'pig_cli_default' │ 'pig_cli' │ None │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'hiveserver2_default' │ 'hiveserver2' │ 'localhost' │ 10000 │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'metastore_default' │ 'hive_metastore' │ 'localhost' │ 9083 │ False │ True │ 'gAAAAABfdZs0...vNSgFh1mE1HY=' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'mongo_default' │ 'mongo' │ 'mongo' │ 27017 │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'mysql_default' │ 'mysql' │ 'mysql' │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'postgres_default' │ 'postgres' │ 'postgres' │ None │ True │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'sqlite_default' │ 'sqlite' │ '/tmp/sqlite_default.db' │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'http_default' │ 'http' │ 'www.httpbin/' │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'mssql_default' │ 'mssql' │ 'localhost' │ 1433 │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'vertica_default' │ 'vertica' │ 'localhost' │ 5433 │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'wasb_default' │ 'wasb' │ None │ None │ False │ True │ 'gAAAAABfdZs0...ST7E2347-uG4=' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'webhdfs_default' │ 'hdfs' │ 'localhost' │ 50070 │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'ssh_default' │ 'ssh' │ 'localhost' │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'sftp_default' │ 'sftp' │ 'localhost' │ 22 │ False │ True │ 'gAAAAABfdZs0...guLrr1ky5XpN2' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'fs_default' │ 'fs' │ None │ None │ False │ True │ 'gAAAAABfdZs0...WqhP9ZLa8gQ==' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'aws_default' │ 'aws' │ None │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'spark_default' │ 'spark' │ 'yarn' │ None │ False │ True │ 'gAAAAABfdZs0...18ws2BelkcL8=' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'druid_broker_default' │ 'druid' │ 'druid-broker' │ 8082 │ False │ True │ 'gAAAAABfdZs0...sC6Kcd9mOKhE=' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'druid_ingest_default' │ 'druid' │ 'druid-overlord' │ 8081 │ False │ True │ 'gAAAAABfdZs0...CpBdCkHuk5lqw' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'redis_default' │ 'redis' │ 'redis' │ 6379 │ False │ True │ 'gAAAAABfdZs0...E1qdjhMngIg==' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'sqoop_default' │ 'sqoop' │ 'rmdbs' │ None │ False │ False │ '' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'emr_default' │ 'emr' │ None │ None │ False │ True │ 'gAAAAABfdZs0...GsJIS8IjaBuM=' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'databricks_default' │ 'databricks' │ 'localhost' │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'qubole_default' │ 'qubole' │ 'localhost' │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'segment_default' │ 'segment' │ None │ None │ False │ True │ 'gAAAAABfdZs0...oawClUj4Qzj8i' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'azure_data_lake_default' │ 'azure_data_lake' │ None │ None │ False │ True │ 'gAAAAABfdZs0...DMIAMmOeZNg==' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'azure_cosmos_default' │ 'azure_cosmos' │ None │ None │ False │ True │ 'gAAAAABfdZs0...tusOfGrWviAk=' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'azure_contai...ances_default' │ 'azure_container_instances' │ None │ None │ False │ True │ 'gAAAAABfdZs0...q460BKvTu4Lk=' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'cassandra_default' │ 'cassandra' │ 'cassandra' │ 9042 │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'dingding_default' │ 'http' │ '' │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'opsgenie_default' │ 'http' │ '' │ None │ False │ False │ None │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'google_cloud...store_default' │ 'google_cloud_platform' │ None │ None │ False │ True │ 'gAAAAABfdZs2...ltsxQHWUgxA==' │ ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┼────────┼────────────────┼──────────────────────┼────────────────────────────────┤ │ 'google_cloud_storage_default' │ 'google_cloud_platform' │ None │ None │ False │ True │ 'gAAAAABfdZs2...RNLazPEE7gQ==' │ ╘════════════════════════════════╧═════════════════════════════╧════════════════════════════════╧════════╧════════════════╧══════════════════════╧════════════════════════════════╛

此输出的问题是它返回了几乎不可用的数据表(请参见下面的图像).理想情况下,它应该返回类似json的结构.

The issue with this output is that it returns a hardly usable table of data (See image bellow). Ideally, it should return a json like structure.

  • 问题1:有没有一种快速的方法可以将连接(和变量)导出(并导入)为json?
  • 问题2:如果问题1是没有办法",那么如何将这些数据转换成漂亮的字典或类似键值的结构?

此外,非常感谢您对awk/grep模式进行任何其他解释.

Also, any additional explanation on the awk/grep patterns would be very much appreciated.

推荐答案

使用cat file代替您的gcloud命令,我不必在您的问题中生成表格:

Using cat file instead of your gcloud command which I don't have to generate the table in your question:

$ cat tst.awk !/[[:space:]]/ { # Skip all lines that separate the data rows next } (++nr) == 1 { # Set FS to whatever the combination of control chars is at the start of the first data line match($0,/[^[:blank:]]+/) FS = "[[:blank:]]*" substr($0,1,RLENGTH) "[[:blank:]]*" } { # Get rid of the FSs at the start and end of the line to avoid leading/trailing null fields gsub("^" FS "|" FS "$","") } nr == 1 { # Store the header lines for later use for (i=1; i<=NF; i++) { gsub(/[[:blank:]]+/,"_",$i) hdr[i] = $i } print "{" next } { # Print the json-equivalent for the data on the current line gsub(/\047/,"\"") printf "%s %s: {\n", (nr>2 ? ",\n" : ""), $1 for (i=2; i<=NF; i++) { printf " \"%s\": %s%s\n", hdr[i], $i, (i<NF ? "," : "") } printf " }", $1 } END { print "\n}" }

$ cat file | awk -f tst.awk { "airflow_db": { "Conn_Type": "mysql", "Host": "airflow-sqlp...rvice.default", "Port": None, "Is_Encrypted": True, "Is_Extra_Encrypted": False, "Extra": None }, "beeline_default": { "Conn_Type": "beeline", "Host": "localhost", "Port": 10000, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...yjt7nj1C2Dzgm" }, "bigquery_default": { "Conn_Type": "google_cloud_platform", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs2...AOdwY-EnZLg==" }, "local_mysql": { "Conn_Type": "mysql", "Host": "localhost", "Port": None, "Is_Encrypted": True, "Is_Extra_Encrypted": False, "Extra": None }, "presto_default": { "Conn_Type": "presto", "Host": "localhost", "Port": 3400, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "google_cloud_default": { "Conn_Type": "google_cloud_platform", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs2...oMm2saUwAxQ==" }, "hive_cli_default": { "Conn_Type": "hive_cli", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "pig_cli_default": { "Conn_Type": "pig_cli", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "hiveserver2_default": { "Conn_Type": "hiveserver2", "Host": "localhost", "Port": 10000, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "metastore_default": { "Conn_Type": "hive_metastore", "Host": "localhost", "Port": 9083, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...vNSgFh1mE1HY=" }, "mongo_default": { "Conn_Type": "mongo", "Host": "mongo", "Port": 27017, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "mysql_default": { "Conn_Type": "mysql", "Host": "mysql", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "postgres_default": { "Conn_Type": "postgres", "Host": "postgres", "Port": None, "Is_Encrypted": True, "Is_Extra_Encrypted": False, "Extra": None }, "sqlite_default": { "Conn_Type": "sqlite", "Host": "/tmp/sqlite_default.db", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "http_default": { "Conn_Type": "http", "Host": "www.httpbin/", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "mssql_default": { "Conn_Type": "mssql", "Host": "localhost", "Port": 1433, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "vertica_default": { "Conn_Type": "vertica", "Host": "localhost", "Port": 5433, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "wasb_default": { "Conn_Type": "wasb", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...ST7E2347-uG4=" }, "webhdfs_default": { "Conn_Type": "hdfs", "Host": "localhost", "Port": 50070, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "ssh_default": { "Conn_Type": "ssh", "Host": "localhost", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "sftp_default": { "Conn_Type": "sftp", "Host": "localhost", "Port": 22, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...guLrr1ky5XpN2" }, "fs_default": { "Conn_Type": "fs", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...WqhP9ZLa8gQ==" }, "aws_default": { "Conn_Type": "aws", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "spark_default": { "Conn_Type": "spark", "Host": "yarn", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...18ws2BelkcL8=" }, "druid_broker_default": { "Conn_Type": "druid", "Host": "druid-broker", "Port": 8082, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...sC6Kcd9mOKhE=" }, "druid_ingest_default": { "Conn_Type": "druid", "Host": "druid-overlord", "Port": 8081, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...CpBdCkHuk5lqw" }, "redis_default": { "Conn_Type": "redis", "Host": "redis", "Port": 6379, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...E1qdjhMngIg==" }, "sqoop_default": { "Conn_Type": "sqoop", "Host": "rmdbs", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": "" }, "emr_default": { "Conn_Type": "emr", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...GsJIS8IjaBuM=" }, "databricks_default": { "Conn_Type": "databricks", "Host": "localhost", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "qubole_default": { "Conn_Type": "qubole", "Host": "localhost", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "segment_default": { "Conn_Type": "segment", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...oawClUj4Qzj8i" }, "azure_data_lake_default": { "Conn_Type": "azure_data_lake", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...DMIAMmOeZNg==" }, "azure_cosmos_default": { "Conn_Type": "azure_cosmos", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...tusOfGrWviAk=" }, "azure_contai...ances_default": { "Conn_Type": "azure_container_instances", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs0...q460BKvTu4Lk=" }, "cassandra_default": { "Conn_Type": "cassandra", "Host": "cassandra", "Port": 9042, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "dingding_default": { "Conn_Type": "http", "Host": "", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "opsgenie_default": { "Conn_Type": "http", "Host": "", "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": False, "Extra": None }, "google_cloud...store_default": { "Conn_Type": "google_cloud_platform", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs2...ltsxQHWUgxA==" }, "google_cloud_storage_default": { "Conn_Type": "google_cloud_platform", "Host": None, "Port": None, "Is_Encrypted": False, "Is_Extra_Encrypted": True, "Extra": "gAAAAABfdZs2...RNLazPEE7gQ==" } }

请注意,如果idk实际上不是有效的json,我只是将文本块从输入位置移动到输出位置.希望对您来说,进行所需的任何更改以产生您实际想要的输出(问题中遗漏了)就足够容易了.

Note that idk if that's actually valid json or not, I'm just moving blocks of text from positions in your input to positions in your output. Hopefully it'll be easy enough for you to make whatever changes you need to make to produce whatever output you actually wanted to get (which was missing from your question).

更多推荐

如何使用bash批量检索Airflow连接? (Google Composer)

本文发布于:2023-10-26 09:47:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1529796.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:如何使用   批量   bash   Composer   Airflow

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!