如何将Ansible变量query_result转为带表头的分号分隔CSV
把postgresql_query查询结果转成带表头的分号分隔CSV
核心思路
在控制节点完成数据转换和文件生成,无需访问远程数据库服务器磁盘:
- 从查询结果的字典列表中提取字段名作为CSV表头
- 将每行字典的取值按表头顺序拼接成分号分隔的字符串
- 拼接表头与所有行内容后写入本地CSV文件
示例Playbook代码
- name: 将postgresql_query结果转换为分号分隔CSV hosts: localhost # 所有操作在控制节点执行 vars: # 模拟postgresql_query返回的my_table__qres变量结构 my_table__qres: query_result: - id: 1 name: "Alice" email: "alice@example.com" - id: 2 name: "Bob;Test" # 包含分号的特殊值示例 email: "bob@example.com" tasks: - name: 提取CSV表头(从第一个字典的键获取) set_fact: csv_header: "{{ my_table__qres.query_result[0] | keys | join(';') }}" when: my_table__qres.query_result | length > 0 - name: 转换每行数据为分号分隔格式 set_fact: csv_rows: "{{ csv_rows | default([]) + [ item | dict2items | sort(attribute='key') | map(attribute='value') | join(';') ] }}" loop: "{{ my_table__qres.query_result }}" loop_control: label: "{{ item.id }}" - name: 拼接表头和所有行内容 set_fact: csv_content: "{{ csv_header }}\n{{ csv_rows | join('\n') }}" when: my_table__qres.query_result | length > 0 - name: 将内容写入本地CSV文件 copy: content: "{{ csv_content }}" dest: "./output_data.csv" # 控制节点本地路径 mode: '0644' when: my_table__qres.query_result | length > 0
补充说明
- 加了空结果判断,避免查询无数据时抛出错误
- 若字段值包含分号、换行或引号,建议用
quote过滤器转义,比如把join(';')改成map('quote') | join(';'),生成符合标准的CSV - 确保
postgresql_query返回的query_result是字典列表结构,若返回格式不同需对应调整过滤器逻辑
内容的提问来源于stack exchange,提问作者Tms91
相关产品推荐
相关产品推荐

