将数据写入CSV文件

4
我需要使用Ansible将一些内容写入到一个CSV格式的文件中。
shell: ps -ef | grep java | awk '{print $1}'
register: username

shell: ps -ef | grep java | awk '{print $2}'
register: id

用户名的输出将类似于:

root
admin
test_admin

id的输出结果与以下类似:

1232
4343
2233

因此,我希望将此写入CSV文件中

root,1232
admin,4343
test_admin,2233

请提供建议。
1个回答

5
您可以使用 zip、map 和 join 过滤器的组合来实现所需的结果:
- hosts: all
  tasks:
    - name: combination of two lists
      set_fact:
        lines: "{{ [1,2,3]|zip(['a','b','c'])|list }}"
    - debug:
        msg: "{{ lines }}"
    - name: transform each line into a string
      set_fact:
        lines: "{{ lines | map('join', ', ') | list }}"
    - debug:
        msg: "{{ lines }}"
    - name: combine lines
      set_fact:
        lines: "{{ lines | join('\n') }}"
    - debug:
        msg: "{{ lines }}"
    - name: write lines to file
      copy:
        content: "{{ lines }}"
        dest: "output.csv"

或者当你将这些过滤器组合在一起时:

- name: write lines to file
  copy:
    content: "{{ [1,2,3] | zip(['a','b','c']) | map('join', ', ')  | join('\n') }}"
    dest: "output.csv"

输出文件output.csv的内容如下:
1, a
2, b
3, c

1
我可以为您指向筛选器的文档:https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#id12。如果您运行第一个playbook,它会打印出我在每个步骤中所做的事情。有哪一步不清楚吗? - Alassane Ndiaye
谢谢,这个方法对于两个列表有效。lines: "{{tmp.stdout_lines| zip (tech.stdout_lines) |list }}" 但是对于三个列表无效 lines: "{{tmp.stdout_lines| zip (tech.stdout_lines)| zip (app.stdout_lines)|list }}" 请问需要做哪些修改? - Smily
1
它应该是 {{tmp.stdout_lines| zip (tech.stdout_lines, app.stdout_lines)|list }}。 - Alassane Ndiaye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接