randomx
randomx

Reputation: 15

ansible stdout_lines formatting output

the desired output is to show the name of the target directory and its contents. please see below. any sample code ideas on how to accomplish this? is it doable? thank you

role code: listing contents of directories

   vars_files:
     - /home/admin/.ansible/vault/vault.yml
   
      vars:
        - target_dirs:
            - '/home/admin'
            - '/root'
  
      tasks:
        - name: disk_usage
          shell: ls -l {{ item }}
          with_items: "{{ target_dirs }}"
          register: disk_usage
          ignore_errors: true
   
        - debug:
            msg:
              - "disk usage"
              - "=========="
              - "{{ item }}"
          loop: "{{ disk_usage | json_query('results[].stdout_lines') }}"

current output

TASK [debug] ***************************************************************************************************
ok: [server1] => (item=['total 0']) => {
    "msg": [
        "disk usage",
        "############",
        [
            "total 0"
        ]
    ]
}
ok: [server1] => (item=['total 8', 'drwx------. 2 root root 4096 May 15  2020 bin', '-rwx------. 1 root root  519 May 15  2020 clean.sh']) => {
    "msg": [
        "disk usage",
        "==========",
        [
            "total 8",
            "drwx------. 2 root root 4096 May 15  2020 bin",
            "-rwx------. 1 root root  519 May 15  2020 clean.sh"
        ]
    ]
}

desired output: state the name of the target directory and its contents

ok: [server1] => {
    "msg": [
        "disk usage /home/admin",
        "==========",
        [
            "total 0"
        ]
    ]
}
ok: [server1] => {
    "msg": [
        "disk usage /root",
        "==========",
        [
            "total 8",
            "drwx------. 2 root root 4096 May 15  2020 bin",
            "-rwx------. 1 root root  519 May 15  2020 clean.sh"
        ]
    ]
}

Upvotes: 1

Views: 276

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 68294

Given the tree for testing

shell> tree /tmp/test
/tmp/test
├── test1
│   ├── file1
│   ├── file2
│   └── file3
└── test2
    ├── file4
    ├── file5
    └── file6

2 directories, 6 files

and the variable

    target_dirs:
      - /tmp/test/test1
      - /tmp/test/test2

the debug below writes the expected JSON

    - debug:
        msg: |
          disk usage {{ item.item }}
          {{ '=' * under_line_length|int }}
          {{ item.stdout_lines|to_nice_json }}
      loop: "{{ disk_usage.results }}"
      loop_control:
        label: "{{ item.item }}"
      vars:
        under_line_length: "{{ item.item|length + 11 }}"

gives

ok: [localhost] => (item=/tmp/test/test1) => 
  msg: |-
    disk usage /tmp/test/test1
    ==========================
    [
        "total 0",
        "-rw-rw-r-- 1 admin admin 0 Jan 25 04:09 file1",
        "-rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file2",
        "-rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file3"
    ]
ok: [localhost] => (item=/tmp/test/test2) => 
  msg: |-
    disk usage /tmp/test/test2
    ==========================
    [
        "total 0",
        "-rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file4",
        "-rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file5",
        "-rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file6"
    ]

  • You can write YAML if you want to
    - debug:
        msg: |
          disk usage {{ item.item }}
          {{ '=' * under_line_length|int }}
          {{ item.stdout_lines|to_nice_yaml }}
      loop: "{{ disk_usage.results }}"
      loop_control:
        label: "{{ item.item }}"
      vars:
        under_line_length: "{{ item.item|length + 11 }}"

gives

ok: [localhost] => (item=/tmp/test/test1) => 
  msg: |-
    disk usage /tmp/test/test1
    ==========================
    - total 0
    - -rw-rw-r-- 1 admin admin 0 Jan 25 04:09 file1
    - -rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file2
    - -rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file3
ok: [localhost] => (item=/tmp/test/test2) => 
  msg: |-
    disk usage /tmp/test/test2
    ==========================
    - total 0
    - -rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file4
    - -rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file5
    - -rw-rw-r-- 1 admin admin 0 Jan 25 04:10 file6

  • Example of a complete playbook for testing
- hosts: localhost

  vars:

    target_dirs:
      - /tmp/test/test1
      - /tmp/test/test2

  tasks:

    - command: "ls -l {{ item }}"
      loop: "{{ target_dirs }}"
      register: disk_usage
      ignore_errors: true

    - debug:
        msg: |
          disk usage {{ item.item }}
          {{ '=' * under_line_length|int }}
          {{ item.stdout_lines|to_nice_yaml }}
      loop: "{{ disk_usage.results }}"
      loop_control:
        label: "{{ item.item }}"
      vars:
        under_line_length: "{{ item.item|length + 11 }}"

    - debug:
        msg: |
          disk usage {{ item.item }}
          {{ '=' * under_line_length|int }}
          {{ item.stdout_lines|to_nice_json }}
      loop: "{{ disk_usage.results }}"
      loop_control:
        label: "{{ item.item }}"
      vars:
        under_line_length: "{{ item.item|length + 11 }}"

Upvotes: 1

Related Questions