Enable find_disks module to match by filesystem label

Currently the only consumer of ansible find_disks module is Ceph. And
Ceph OSD deployment in kolla uses GPT partition label to detect and
identify disks for Ceph OSD use. This is not always true for all the
deployment.

The change here extended the find_disks module by:
- adding `name` argument to find disk by either partition name or
  filesystem label matching
- `partition_name` argument now becomes an alias to `name`
- adding `match_mode` argument to allow prefix matching. It is used for
  swift disk detection.
- return `fs_label` key / value in result for disk mounting purpose

Change-Id: I9c93400c1826f5148acf09e9fbe555e358dfdfcc
Partially-Implements: blueprint swift-physical-disk
This commit is contained in:
Qiu Yu 2016-01-25 17:09:55 -07:00 committed by Sam Yaple
parent 2361fddcff
commit 428b484397

View File

@ -20,16 +20,24 @@
DOCUMENTATION = ''' DOCUMENTATION = '''
--- ---
module: find_disks module: find_disks
short_description: Return list of devices containing a specfied label short_description: Return list of devices containing a specfied name or label
description: description:
- This will return a list of all devices with a GPT partition label with - This will return a list of all devices with either GPT partition name
the name specified. or filesystem label of the name specified.
options: options:
partition_name: match_mode:
description: description:
- Partition name - Label match mode, either strict or prefix
default: 'strict'
required: False
choices: [ "strict", "prefix" ]
type: str
name:
description:
- Partition name or filesystem label
required: True required: True
type: bool type: str
aliases: [ 'partition_name' ]
author: Sam Yaple author: Sam Yaple
''' '''
@ -37,9 +45,23 @@ EXAMPLES = '''
- hosts: ceph-osd - hosts: ceph-osd
tasks: tasks:
- name: Return all valid formated devices with the name KOLLA_CEPH_OSD - name: Return all valid formated devices with the name KOLLA_CEPH_OSD
ceph_osd_list: find_disks:
partition_name: 'KOLLA_CEPH_OSD' name: 'KOLLA_CEPH_OSD'
register: osds register: osds
- hosts: swift-object-server
tasks:
- name: Return all valid devices with the name KOLLA_SWIFT
find_disks:
name: 'KOLLA_SWIFT'
register: swift_disks
- hosts: swift-object-server
tasks:
- name: Return all valid devices with wildcard name 'swift_d*'
find_disks:
name: 'swift_d' match_mode: 'prefix'
register: swift_disks
''' '''
import json import json
@ -48,21 +70,41 @@ import pyudev
def main(): def main():
argument_spec = dict( argument_spec = dict(
partition_name=dict(required=True, type='str') match_mode=dict(required=False, choices=['strict', 'prefix'],
default='strict'),
name=dict(aliases=['partition_name'], required=True, type='str')
) )
module = AnsibleModule(argument_spec) module = AnsibleModule(argument_spec)
partition_name = module.params.get('partition_name') match_mode = module.params.get('match_mode')
name = module.params.get('name')
def is_dev_matched_by_name(dev, name):
if dev.get('DEVTYPE', '') == 'partition':
dev_name = dev.get('ID_PART_ENTRY_NAME', '')
else:
dev_name = dev.get('ID_FS_LABEL', '')
if match_mode == 'strict':
return dev_name == name
elif match_mode == 'prefix':
return dev_name.startswith(name)
else:
return False
try: try:
ret = list() ret = list()
ct = pyudev.Context() ct = pyudev.Context()
for dev in ct.list_devices(subsystem='block', DEVTYPE='partition'): for dev in ct.list_devices(subsystem='block'):
if dev.get('ID_PART_ENTRY_NAME') == partition_name: if is_dev_matched_by_name(dev, name):
fs_uuid = dev.get('ID_FS_UUID') fs_uuid = dev.get('ID_FS_UUID', '')
if not fs_uuid: fs_label = dev.get('ID_FS_LABEL', '')
fs_uuid = '' if dev.get('DEVTYPE', '') == 'partition':
dev_parent = dev.find_parent('block').device_node device_node = dev.find_parent('block').device_node
ret.append({'device': dev_parent, 'fs_uuid': fs_uuid}) else:
device_node = dev.device_node
ret.append({'device': device_node,
'fs_uuid': fs_uuid,
'fs_label': fs_label})
module.exit_json(disks=json.dumps(ret)) module.exit_json(disks=json.dumps(ret))
except Exception as e: except Exception as e:
module.exit_json(failed=True, msg=repr(e)) module.exit_json(failed=True, msg=repr(e))