Search code examples
ansibleansible-2.xansible-inventoryansible-factsansible-template

ansible print the stdout_lines in csv file in the exact format that playbook prints on the console


I have the following ansible playbook code which prints the some metrices of one remote server. Here I want to print the output in the csv file with the exact msg format shown in the output. How to print this in csv file.

Ansible playbook:

  tasks:
    - name: Get ip address of the remote node
      ansible.builtin.shell: hostname -i | awk '{print $2}'
      register: ipaddr

    - name: Check uptime
      shell: uptime | cut -d',' -f1
      register: uptime_op
    - debug:
        msg: "{{uptime_op.stdout_lines}}"

    - name: Get lsbkl value
      shell: lsblk
      register: lsblk_output

    - debug:
        msg: "{{lsblk_output.stdout_lines}}"

    - name: Get Disc space value
      shell: df -h
      register: df_output
    - debug:
        msg: "{{df_output.stdout_lines}}"

output:


PLAY [test_host] *************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************
Tuesday 20 December 2022  10:07:07 -0800 (0:00:00.017)       0:00:00.017 ******
ok: [hostname.domain.com]

TASK [Get ip address of the remote node] ************************************************************************************
Tuesday 20 December 2022  10:07:14 -0800 (0:00:07.399)       0:00:07.417 ******
changed: [hostname.domain.com]

TASK [Check uptime] *********************************************************************************************************
Tuesday 20 December 2022  10:07:18 -0800 (0:00:03.860)       0:00:11.278 ******
changed: [hostname.domain.com]

TASK [debug] ****************************************************************************************************************
Tuesday 20 December 2022  10:07:22 -0800 (0:00:03.781)       0:00:15.059 ******
ok: [hostname.domain.com] => {
    "msg": [
        " 23:37pm  up 359 days  5:53"
    ]
}

TASK [Get lsbkl value] ******************************************************************************************************
Tuesday 20 December 2022  10:07:22 -0800 (0:00:00.086)       0:00:15.145 ******
changed: [hostname.domain.com]

TASK [debug] ****************************************************************************************************************
Tuesday 20 December 2022  10:07:26 -0800 (0:00:03.815)       0:00:18.960 ******
ok: [hostname.domain.com] => {
    "msg": [
        "NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT",
        "sda       8:0    0   1.1T  0 disk ",
        "├─sda1    8:1    0    15G  0 part /",
        "├─sda2    8:2    0   518M  0 part /boot/efi",
        "├─sda3    8:3    0     1K  0 part ",
        "├─sda5    8:5    0     2G  0 part /ctools",
        "├─sda6    8:6    0    10G  0 part /var",
        "├─sda7    8:7    0    48G  0 part [SWAP]",
        "├─sda8    8:8    0   250M  0 part /dsm",
        "├─sda9    8:9    0   501M  0 part /var/cfengine",
        "├─sda10   8:10   0    10G  0 part /tmp",
        "└─sda11   8:11   0     1T  0 part /infrastructure",
        "sdb       8:16   0   1.8T  0 disk ",
        "├─sdb1    8:17   0 484.3G  0 part /p4depot",
        "├─sdb2    8:18   0 931.3G  0 part /p4meta",
        "└─sdb3    8:19   0 372.9G  0 part /p4log"
    ]
}

TASK [Get Disc space value] *************************************************************************************************
Tuesday 20 December 2022  10:07:26 -0800 (0:00:00.088)       0:00:19.049 ******
changed: [hostname.domain.com]

TASK [debug] ****************************************************************************************************************
Tuesday 20 December 2022  10:07:30 -0800 (0:00:03.787)       0:00:22.836 ******
ok: [hostname.domain.com] => {
    "msg": [
        "Filesystem                              Size  Used Avail Use% Mounted on",
        "devtmpfs                                189G  8.0K  189G   1% /dev",
        "tmpfs                                   189G     0  189G   0% /dev/shm",
        "tmpfs                                   189G  4.0G  185G   3% /run",
        "tmpfs                                   189G     0  189G   0% /sys/fs/cgroup",
        "/dev/sda1                                15G   11G  4.8G  69% /",
        "/dev/sda2                               518M     0  518M   0% /boot/efi",
        "/dev/sda10                               10G   83M   10G   1% /tmp",
        "/dev/sda11                              1.1T   34M  1.1T   1% /infrastructure",
        "/dev/sda8                               247M   62M  185M  25% /dsm",
        "/dev/sda6                                10G  1.5G  8.6G  15% /var",
        "/dev/sda9                               498M  119M  379M  24% /var/cfengine",
        "/dev/sdb2                               931G   30G  902G   4% /p4meta",
        "/dev/sdb3                               373G   61M  373G   1% /p4log",
        "/dev/sdb1                               485G  112G  373G  23% /p4depot",
        "/dev/sda5                               2.1G  3.6M  1.8G   1% /ctools",
        "tmpfs                                   1.0G     0  1.0G   0% /dsm/tmp/dsmbg.tmpfs",
        "10.223.232.121:/new_itools              951G  497G  454G  53% /nfs/site/itools",
        "incfs03n03b-04:/common_usr_local         11G  1.2G  8.9G  12% /nfs/iind/local",
        "incfs04n08b-1:/prod                     513M  1.5M  512M   1% /nfs/iind/proj/prod",
        "incfs06n11b-1:/home0                    351G  149G  202G  43% /nfs/iind/disks/home23",
        "incfs02n10a-1:/iind_disks_home24        501G   59G  442G  12% /nfs/iind/disks/home24",
        "incfs06n04a-05:/iind_gen_adm            301G  176G  125G  59% /nfs/site/gen/adm",
        "incfs03n06b-1:/ba_ctg_home01            301G  263G   38G  88% /nfs/iind/disks/home110",
        "inc08n07b-1:/home_tree                   11G   79M   10G   1% /nfs/iind/home",
        "incfs06n10a-1:/iind_gen_adm_netmeter_m   81G   28G   53G  35% /nfs/iind/disks/iind_gen_adm_netmeter",
        "tmpfs                                    38G     0   38G   0% /run/user/37124",
        "incfs07n05b-1:/common                   201G  158G   43G  79% /nfs/site/disks/iind_gen_adm_common",
        "tmpfs                                    38G     0   38G   0% /run/user/12142325"
    ]
}

PLAY RECAP ******************************************************************************************************************
hostname.domain.com   : ok=8    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Attaching the expected csv file how it should look like.


Solution

  • Given the registered data df_output.stdout_lines there must be also df_output.stdout attribute. Use the filter community.general.jc and parse the registered data

        - set_fact:
            df: "{{ df_output.stdout|community.general.jc('df') }}"
    

    gives

      df:
      - available: 189
        filesystem: devtmpfs
        mounted_on: /dev
        size: 189G
        use_percent: 1
        used: 8
      - available: 189
        filesystem: tmpfs
        mounted_on: /dev/shm
        size: 189G
        use_percent: 0
        used: 0
    
        ...
    

    Then, for each host create a CSV file on the controller. For example,

        - copy:
            dest: "/tmp/ansible_df_{{ item }}.csv"
            content: |
              {{ df_output.stdout_lines.0.split()[:-1]|join(',') }}
              {% for m in hostvars[item]['df'] %}
              {{ m.filesystem }},{{ m.size }},{{ m.used }},{{m.available }},{{ m.use_percent }},{{ m.mounted_on }}
              {% endfor %}
          loop: "{{ ansible_play_hosts }}"
          run_once: true
          delegate_to: localhost
    

    will create

    shel> cat /tmp/ansible_df_localhost.csv 
    Filesystem,Size,Used,Avail,Use%,Mounted
    devtmpfs,189G,8,189,1,/dev
    tmpfs,189G,0,189,0,/dev/shm
    tmpfs,189G,4,185,3,/run
    tmpfs,189G,0,189,0,/sys/fs/cgroup
    /dev/sda1,15G,11,4,69,/
    /dev/sda2,518M,0,518,0,/boot/efi
    /dev/sda10,10G,83,10,1,/tmp
    /dev/sda11,1.1T,34,1,1,/infrastructure
    /dev/sda8,247M,62,185,25,/dsm
    /dev/sda6,10G,1,8,15,/var
    /dev/sda9,498M,119,379,24,/var/cfengine
    /dev/sdb2,931G,30,902,4,/p4meta
    /dev/sdb3,373G,61,373,1,/p4log
    /dev/sdb1,485G,112,373,23,/p4depot
    /dev/sda5,2.1G,3,1,1,/ctools
    tmpfs,1.0G,0,1,0,/dsm/tmp/dsmbg.tmpfs
    10.223.232.121:/new_itools,951G,497,454,53,/nfs/site/itools
    incfs03n03b-04:/common_usr_local,11G,1,8,12,/nfs/iind/local
    incfs04n08b-1:/prod,513M,1,512,1,/nfs/iind/proj/prod
    incfs06n11b-1:/home0,351G,149,202,43,/nfs/iind/disks/home23
    incfs02n10a-1:/iind_disks_home24,501G,59,442,12,/nfs/iind/disks/home24
    incfs06n04a-05:/iind_gen_adm,301G,176,125,59,/nfs/site/gen/adm
    incfs03n06b-1:/ba_ctg_home01,301G,263,38,88,/nfs/iind/disks/home110
    inc08n07b-1:/home_tree,11G,79,10,1,/nfs/iind/home
    incfs06n10a-1:/iind_gen_adm_netmeter_m,81G,28,53,35,/nfs/iind/disks/iind_gen_adm_netmeter
    tmpfs,38G,0,38,0,/run/user/37124
    incfs07n05b-1:/common,201G,158,43,79,/nfs/site/disks/iind_gen_adm_common
    tmpfs,38G,0,38,0,/run/user/12142325
    

    Given the data for testing

    shell> cat data.json
    {
        "df_stdout_lines": [
            "Filesystem                              Size  Used Avail Use% Mounted on",
            "devtmpfs                                189G  8.0K  189G   1% /dev",
            "tmpfs                                   189G     0  189G   0% /dev/shm",
            "tmpfs                                   189G  4.0G  185G   3% /run",
            "tmpfs                                   189G     0  189G   0% /sys/fs/cgroup",
            "/dev/sda1                                15G   11G  4.8G  69% /",
            "/dev/sda2                               518M     0  518M   0% /boot/efi",
            "/dev/sda10                               10G   83M   10G   1% /tmp",
            "/dev/sda11                              1.1T   34M  1.1T   1% /infrastructure",
            "/dev/sda8                               247M   62M  185M  25% /dsm",
            "/dev/sda6                                10G  1.5G  8.6G  15% /var",
            "/dev/sda9                               498M  119M  379M  24% /var/cfengine",
            "/dev/sdb2                               931G   30G  902G   4% /p4meta",
            "/dev/sdb3                               373G   61M  373G   1% /p4log",
            "/dev/sdb1                               485G  112G  373G  23% /p4depot",
            "/dev/sda5                               2.1G  3.6M  1.8G   1% /ctools",
            "tmpfs                                   1.0G     0  1.0G   0% /dsm/tmp/dsmbg.tmpfs",
            "10.223.232.121:/new_itools              951G  497G  454G  53% /nfs/site/itools",
            "incfs03n03b-04:/common_usr_local         11G  1.2G  8.9G  12% /nfs/iind/local",
            "incfs04n08b-1:/prod                     513M  1.5M  512M   1% /nfs/iind/proj/prod",
            "incfs06n11b-1:/home0                    351G  149G  202G  43% /nfs/iind/disks/home23",
            "incfs02n10a-1:/iind_disks_home24        501G   59G  442G  12% /nfs/iind/disks/home24",
            "incfs06n04a-05:/iind_gen_adm            301G  176G  125G  59% /nfs/site/gen/adm",
            "incfs03n06b-1:/ba_ctg_home01            301G  263G   38G  88% /nfs/iind/disks/home110",
            "inc08n07b-1:/home_tree                   11G   79M   10G   1% /nfs/iind/home",
            "incfs06n10a-1:/iind_gen_adm_netmeter_m   81G   28G   53G  35% /nfs/iind/disks/iind_gen_adm_netmeter",
            "tmpfs                                    38G     0   38G   0% /run/user/37124",
            "incfs07n05b-1:/common                   201G  158G   43G  79% /nfs/site/disks/iind_gen_adm_common",
            "tmpfs                                    38G     0   38G   0% /run/user/12142325"
        ]
    }
    

    Example of a complete playbook for testing

    - hosts: localhost
      vars_files:
        - data.json
      vars:
        df_output:
          stdout: |
            Filesystem                              Size  Used Avail Use% Mounted on
            devtmpfs                                189G  8.0K  189G   1% /dev
            tmpfs                                   189G     0  189G   0% /dev/shm
            tmpfs                                   189G  4.0G  185G   3% /run
            tmpfs                                   189G     0  189G   0% /sys/fs/cgroup
            /dev/sda1                                15G   11G  4.8G  69% /
            /dev/sda2                               518M     0  518M   0% /boot/efi
            /dev/sda10                               10G   83M   10G   1% /tmp
            /dev/sda11                              1.1T   34M  1.1T   1% /infrastructure
            /dev/sda8                               247M   62M  185M  25% /dsm
            /dev/sda6                                10G  1.5G  8.6G  15% /var
            /dev/sda9                               498M  119M  379M  24% /var/cfengine
            /dev/sdb2                               931G   30G  902G   4% /p4meta
            /dev/sdb3                               373G   61M  373G   1% /p4log
            /dev/sdb1                               485G  112G  373G  23% /p4depot
            /dev/sda5                               2.1G  3.6M  1.8G   1% /ctools
            tmpfs                                   1.0G     0  1.0G   0% /dsm/tmp/dsmbg.tmpfs
            10.223.232.121:/new_itools              951G  497G  454G  53% /nfs/site/itools
            incfs03n03b-04:/common_usr_local         11G  1.2G  8.9G  12% /nfs/iind/local
            incfs04n08b-1:/prod                     513M  1.5M  512M   1% /nfs/iind/proj/prod
            incfs06n11b-1:/home0                    351G  149G  202G  43% /nfs/iind/disks/home23
            incfs02n10a-1:/iind_disks_home24        501G   59G  442G  12% /nfs/iind/disks/home24
            incfs06n04a-05:/iind_gen_adm            301G  176G  125G  59% /nfs/site/gen/adm
            incfs03n06b-1:/ba_ctg_home01            301G  263G   38G  88% /nfs/iind/disks/home110
            inc08n07b-1:/home_tree                   11G   79M   10G   1% /nfs/iind/home
            incfs06n10a-1:/iind_gen_adm_netmeter_m   81G   28G   53G  35% /nfs/iind/disks/iind_gen_adm_netmeter
            tmpfs                                    38G     0   38G   0% /run/user/37124
            incfs07n05b-1:/common                   201G  158G   43G  79% /nfs/site/disks/iind_gen_adm_common
            tmpfs                                    38G     0   38G   0% /run/user/12142325
          stdout_lines: "{{ df_stdout_lines }}"
    
      tasks:
    
        - debug:
            var: df_output.stdout_lines
        - debug:
            var: df_output.stdout
        - set_fact:
            df: "{{ df_output.stdout|community.general.jc('df') }}"
        - debug:
            var: df
    
        - copy:
            dest: "/tmp/ansible_df_{{ item }}.csv"
            content: |
              {{ df_output.stdout_lines.0.split()[:-1]|join(',') }}
              {% for m in hostvars[item]['df'] %}
              {{ m.filesystem }},{{ m.size }},{{ m.used }},{{m.available }},{{ m.use_percent }},{{ m.mounted_on }}
              {% endfor %}
          loop: "{{ ansible_play_hosts }}"
          run_once: true
          delegate_to: localhost