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:
parent
2361fddcff
commit
428b484397
@ -20,16 +20,24 @@
|
||||
DOCUMENTATION = '''
|
||||
---
|
||||
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:
|
||||
- This will return a list of all devices with a GPT partition label with
|
||||
the name specified.
|
||||
- This will return a list of all devices with either GPT partition name
|
||||
or filesystem label of the name specified.
|
||||
options:
|
||||
partition_name:
|
||||
match_mode:
|
||||
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
|
||||
type: bool
|
||||
type: str
|
||||
aliases: [ 'partition_name' ]
|
||||
author: Sam Yaple
|
||||
'''
|
||||
|
||||
@ -37,9 +45,23 @@ EXAMPLES = '''
|
||||
- hosts: ceph-osd
|
||||
tasks:
|
||||
- name: Return all valid formated devices with the name KOLLA_CEPH_OSD
|
||||
ceph_osd_list:
|
||||
partition_name: 'KOLLA_CEPH_OSD'
|
||||
find_disks:
|
||||
name: 'KOLLA_CEPH_OSD'
|
||||
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
|
||||
@ -48,21 +70,41 @@ import pyudev
|
||||
|
||||
def main():
|
||||
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)
|
||||
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:
|
||||
ret = list()
|
||||
ct = pyudev.Context()
|
||||
for dev in ct.list_devices(subsystem='block', DEVTYPE='partition'):
|
||||
if dev.get('ID_PART_ENTRY_NAME') == partition_name:
|
||||
fs_uuid = dev.get('ID_FS_UUID')
|
||||
if not fs_uuid:
|
||||
fs_uuid = ''
|
||||
dev_parent = dev.find_parent('block').device_node
|
||||
ret.append({'device': dev_parent, 'fs_uuid': fs_uuid})
|
||||
for dev in ct.list_devices(subsystem='block'):
|
||||
if is_dev_matched_by_name(dev, name):
|
||||
fs_uuid = dev.get('ID_FS_UUID', '')
|
||||
fs_label = dev.get('ID_FS_LABEL', '')
|
||||
if dev.get('DEVTYPE', '') == 'partition':
|
||||
device_node = dev.find_parent('block').device_node
|
||||
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))
|
||||
except Exception as e:
|
||||
module.exit_json(failed=True, msg=repr(e))
|
||||
|
Loading…
Reference in New Issue
Block a user