It feels like there should be a cleaner way to get the non-empty |Partitions|, but I’m no |jq| guru. This was a fun one.

I put this into a shell script just because it’s easier to make tweaks while testing. It should work as a one-liner if that suites you better.

|#!/bin/bash ansible localhost -m setup | \ sed '1 s/^.*$/{/' | \ jq '.ansible_facts | {hostname: .ansible_hostname, Disks: .ansible_devices | with_entries(.value |= .size), Partitions: [.ansible_devices[].partitions | with_entries(.value |= .size)] | .[] | select(length>0), Mounts: [.ansible_mounts[].mount] }' |

On my system, this produces the following output:

|{ "hostname": "tango", "Disks": { "dm-0": "475.34 GB", "nvme0n1": "476.94 GB", "zram0": "8.00 GB" }, "Partitions": { "nvme0n1p1": "600.00 MB", "nvme0n1p2": "1.00 GB", "nvme0n1p3": "475.35 GB" }, "Mounts": [ "/", "/home", "/boot", "/boot/efi" ] } |

On 12/31/21 8:24 AM, [email protected] wrote:

Is anyone good with ./JQ?

I'm trying to pull out data from the setup output from Ansible. I can do most of what I need to but I'm stuck on something that is probably quite simple.

I'm trying to generate a list of hosts including disks + sizes and partitions + sizes AND mount points.

I can get the first two quite easily like this (this should work on any server running on localhost) - I need the sed to format the json correctly:

$ ansible localhost -m setup | sed '1 s/^.*$/{/' | jq '.ansible_facts | {hostname: .ansible_hostname, Disks: .ansible_devices| with_entries(.value |= .size), Partitions: .ansible_devices[].partitions | with_entries(.value |= .size) }'

{
"hostname": "ip-172-31-16-55",
"Disks": {
  "xvda": "10.00 GB"
  },
"Partitions": {
  "xvda1": "1.00 GB",
  "xvda2": "9.00 GB"
  }
}

(formatting is a little off with copy and paste)

Now if I want to collect mount points I can do it like this:

$ ansible localhost -m setup | sed '1 s/^.*$/{/' | jq -r '.ansible_facts.ansible_mounts[].mount'
/
/boot

But because the mount information is an array (I think?) i need to map it to get it to work? I'd like to get the results in the same list as the one above but when i add it in it works, but it gives me a new list for every mount point instead of just one list!

This is what I get:

$ ansible localhost -m setup | sed '1 s/^.*$/{/' | jq '.ansible_facts | {hostname: .ansible_hostname, Disks: .ansible_devices|  with_entries(.value |= .size), Partitions: .ansible_devices[].partitions |  with_entries(.value |= .size), Mounts: .ansible_mounts[].mount }'
{
  "hostname": "ip-172-31-16-55",
  "Disks": {
    "xvda": "10.00 GB"
  },
  "Partitions": {
    "xvda1": "1.00 GB",
    "xvda2": "9.00 GB"
  },
  "Mounts": "/"
}
{
  "hostname": "ip-172-31-16-55",
  "Disks": {
    "xvda": "10.00 GB"
  },
  "Partitions": {
    "xvda1": "1.00 GB",
    "xvda2": "9.00 GB"
  },
  "Mounts": "/boot"
}

BUT, this is what I'm trying to get:

{
  "hostname": "ip-172-31-16-55",
  "Disks": {
    "xvda": "10.00 GB"
  },
  "Partitions": {
    "xvda1": "1.00 GB",
    "xvda2": "9.00 GB"
  },
  "Mounts": "/"
  "Mounts": "/boot"
  }
}

or even a "," separated list on one line?

  },
  "Mounts": "/", "/boot"
  }

I think I can't see the wood for the trees now and a little nudge would be greatly appreciated.

Thanks

​

--
You received this message because you are subscribed to the Google Groups "Ansible 
Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/5ba33f00-88ee-4d83-27d9-a7e878ed2f04%40gmail.com.

Reply via email to