我正在构建一本 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 中,并带有标题?
通过创建一个
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 }}"