From f344ec463f60ebf5100ef7066132efd60c2d8fb4 Mon Sep 17 00:00:00 2001 From: Hugh Saunders Date: Fri, 12 Dec 2014 12:47:43 +0000 Subject: [PATCH] Add LVM facts to setup module This commit adds LinuxHardware.get_device_facts() and calls that from .populate(). LVM facts are only gathered if the setup module is running as root and the lvm utilities are available (tested by searching for 'vgs'). If the conditions are met, facts are set for each volume group and logical volume. Example: Test LVM Data: $ sudo vgs VG #PV #LV #SN Attr VSize VFree test 1 2 0 wz--n- 5.00g 2.00g $ sudo lvs LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert testlv test -wi-a---- 1.00g testlv2 test -wi-a---- 2.00g Facts Returned: $ ansible localhost -i /tmp/inv -m setup -a 'filter=ansible_lvm' localhost | success >> { "ansible_facts": { "ansible_lvm": { "lvs": { "testlv": { "size_g": "1.00", "vg": "test" }, "testlv2": { "size_g": "2.00", "vg": "test" } }, "vgs": { "test": { "free_g": "2.00", "num_lvs": "2", "num_pvs": "1", "size_g": "5.00" } } } }, "changed": false } Test as non-root: $ ansible localhost -i /tmp/inv-user -m setup -a 'filter=ansible_lvm' localhost | success >> { "ansible_facts": {}, "changed": false } Test without lvm utilities available $ sudo mv /sbin/vgs{,.bk} $ ansible localhost -i /tmp/inv -m setup -a 'filter=ansible_lvm' localhost | success >> { "ansible_facts": {}, "changed": false } --- lib/ansible/module_utils/facts.py | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lib/ansible/module_utils/facts.py b/lib/ansible/module_utils/facts.py index 855a470a083..5eadda153d4 100644 --- a/lib/ansible/module_utils/facts.py +++ b/lib/ansible/module_utils/facts.py @@ -724,6 +724,7 @@ class LinuxHardware(Hardware): self.get_dmi_facts() self.get_device_facts() self.get_uptime_facts() + self.get_lvm_facts() try: self.get_mount_facts() except TimeoutError: @@ -1067,6 +1068,37 @@ class LinuxHardware(Hardware): uptime_seconds_string = get_file_content('/proc/uptime').split(' ')[0] self.facts['uptime_seconds'] = int(float(uptime_seconds_string)) + def get_lvm_facts(self): + """ Get LVM Facts if running as root and lvm utils are available """ + + if os.getuid() == 0 and module.get_bin_path('vgs'): + lvm_util_options = '--noheadings --nosuffix --units g' + + #vgs fields: VG #PV #LV #SN Attr VSize VFree + vgs={} + rc, vg_lines, err = module.run_command( + 'vgs %s' % lvm_util_options) + for vg_line in vg_lines.splitlines(): + items = vg_line.split() + vgs[items[0]] = {'size_g':items[-2], + 'free_g':items[-1], + 'num_lvs': items[2], + 'num_pvs': items[1]} + + #lvs fields: + #LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert + lvs = {} + rc, lv_lines, err = module.run_command( + 'lvs %s' % lvm_util_options) + for lv_line in lv_lines.splitlines(): + items = lv_line.split() + lvs[items[0]] = {'size_g': items[3], + 'vg': items[1]} + + self.facts['lvm'] = {'lvs': lvs, + 'vgs': vgs} + + class SunOSHardware(Hardware): """ In addition to the generic memory and cpu facts, this also sets