如何将 ansible 变量.query_result 显示为带标题的分号分隔的 CSV

问题描述 投票:0回答:1

我正在构建一本 ansible 剧本。

我想在远程数据库上运行

\COPY (...) TO file;
查询并将结果转储到分号 (;) 分隔的 CSV 中,并带有标题。

通常我会用模块来完成

community.postgresql.postgresql_copy

- name: extract my table from DB
  community.postgresql.postgresql_copy:
    login_host: '{{ db_host }}'  # remote host
    login_user: '{{ db_username }}'
    login_password: '{{ db_password }}'
    db: '{{ db_database }}'
    port: '{{ db_database_port }}'
    src: "{{ lookup('template', 'extract_my_table.sql.j2') }}"
    copy_to: "{{ log_base_path }}/{{ csv_file }}"
    options:
      format: csv
      delimiter: ';'
      header: yes

但是,即使我可以访问远程数据库,我也无法通过SSH登录或访问该数据库所在服务器的磁盘。
因此,我将查询结果保存为 var,然后将其转储到主机上的 csv 文件中。

- name: extract my table from DB
  community.postgresql.postgresql_query:
    login_host: '{{ db_host }}'
    login_user: '{{ db_username }}'
    login_password: '{{ db_password }}'
    db: '{{ db_database }}'
    port: '{{ db_database_port }}'
    query: "{{ lookup('template', 'extract_my_table.sql.j2') }}"

  register: my_table__qres

现在,

my_table__qres.query_result
是一个字典列表,其键等于查询提取的字段(每个字典都是一行)。

如何将

my_table__qres.query_result
内容显示到新的分号 (;) 分隔的 CSV 中,并带有标题?

postgresql csv ansible
1个回答
0
投票

通过创建一个

Jinja2
模板(
my_table_template.j2)
)来尝试以下操作,该模板迭代查询结果并将其格式化为 CSV 格式。

{% for row in my_table__qres.query_result %}
{{ row.values() | join(';') }}
{% endfor %}

然后,使用剧本中的模板模块应用此模板并创建 CSV 文件。

- name: Generate CSV from query result
  ansible.builtin.template:
    src: my_table_template.j2
    dest: "{{ log_base_path }}/{{ csv_file }}"
  vars:
    my_table__qres: "{{ my_table__qres }}"
© www.soinside.com 2019 - 2024. All rights reserved.