You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:27:11