def main(): module = AnsibleModule( argument_spec=dict( name=dict(type='str', required=True, choices=[ 'noup', 'nodown', 'noout', 'nobackfill', 'norebalance', 'norecover', 'noscrub', 'nodeep-scrub' ]), cluster=dict(type='str', required=False, default='ceph'), state=dict(type='str', required=False, default='present', choices=['present', 'absent']), ), supports_check_mode=True, ) name = module.params.get('name') cluster = module.params.get('cluster') state = module.params.get('state') startd = datetime.datetime.now() container_image = is_containerized() if state == 'present': cmd = generate_ceph_cmd(['osd', 'set'], [name], cluster=cluster, container_image=container_image) else: cmd = generate_ceph_cmd(['osd', 'unset'], [name], cluster=cluster, container_image=container_image) if module.check_mode: exit_module(module=module, out='', rc=0, cmd=cmd, err='', startd=startd, changed=False) else: rc, out, err = module.run_command(cmd) exit_module(module=module, out=out, rc=rc, cmd=cmd, err=err, startd=startd, changed=True)
def update_pool(module, cluster, name, user, user_key, delta, container_image=None): ''' Update an existing pool ''' report = "" for key in delta.keys(): if key != 'application': args = [ 'set', name, delta[key]['cli_set_opt'], delta[key]['value'] ] cmd = generate_ceph_cmd(sub_cmd=['osd', 'pool'], args=args, cluster=cluster, user=user, user_key=user_key, container_image=container_image) rc, cmd, out, err = exec_command(module, cmd) if rc != 0: return rc, cmd, out, err else: rc, cmd, out, err = exec_command( module, disable_application_pool( cluster, name, delta['application']['old_application'], user, user_key, container_image=container_image)) # noqa: E501 if rc != 0: return rc, cmd, out, err rc, cmd, out, err = exec_command( module, enable_application_pool( cluster, name, delta['application']['new_application'], user, user_key, container_image=container_image)) # noqa: E501 if rc != 0: return rc, cmd, out, err report = report + "\n" + "{} has been updated: {} is now {}".format( name, key, delta[key]['value']) # noqa: E501 out = report return rc, cmd, out, err
def create_profile(module, name, k, m, stripe_unit, crush_device_class, cluster='ceph', force=False, container_image=None): # noqa: E501 ''' Create a profile ''' args = ['set', name, 'k={}'.format(k), 'm={}'.format(m)] if stripe_unit: args.append('stripe_unit={}'.format(stripe_unit)) if crush_device_class: args.append('crush-device-class={}'.format(crush_device_class)) if force: args.append('--force') cmd = generate_ceph_cmd(sub_cmd=['osd', 'erasure-code-profile'], args=args, cluster=cluster, container_image=container_image) return cmd
def create_rule(module, container_image=None): ''' Create a new crush replicated/erasure rule ''' cluster = module.params.get('cluster') name = module.params.get('name') rule_type = module.params.get('rule_type') bucket_root = module.params.get('bucket_root') bucket_type = module.params.get('bucket_type') device_class = module.params.get('device_class') profile = module.params.get('profile') if rule_type == 'replicated': args = ['create-replicated', name, bucket_root, bucket_type] if device_class: args.append(device_class) else: args = ['create-erasure', name] if profile: args.append(profile) cmd = generate_ceph_cmd(['osd', 'crush', 'rule'], args, cluster=cluster, container_image=container_image) return cmd
def list_pools(cluster, user, user_key, details, output_format='json', container_image=None): ''' List existing pools ''' args = ['ls'] if details: args.append('detail') args.extend(['-f', output_format]) cmd = generate_ceph_cmd(sub_cmd=['osd', 'pool'], args=args, cluster=cluster, user=user, user_key=user_key, container_image=container_image) return cmd
def get_pool_details(module, cluster, name, user, user_key, output_format='json', container_image=None): ''' Get details about a given pool ''' args = ['ls', 'detail', '-f', output_format] cmd = generate_ceph_cmd(sub_cmd=['osd', 'pool'], args=args, cluster=cluster, user=user, user_key=user_key, container_image=container_image) rc, cmd, out, err = exec_command(module, cmd) if rc == 0: out = [p for p in json.loads(out.strip()) if p['pool_name'] == name][0] _rc, _cmd, application_pool, _err = exec_command( module, get_application_pool( cluster, # noqa: E501 name, # noqa: E501 user, # noqa: E501 user_key, # noqa: E501 container_image=container_image)) # noqa: E501 # This is a trick because "target_size_ratio" isn't present at the same # level in the dict # ie: # { # 'pg_num': 8, # 'pgp_num': 8, # 'pg_autoscale_mode': 'on', # 'options': { # 'target_size_ratio': 0.1 # } # } # If 'target_size_ratio' is present in 'options', we set it, this way we # end up with a dict containing all needed keys at the same level. if 'target_size_ratio' in out['options'].keys(): out['target_size_ratio'] = out['options']['target_size_ratio'] else: out['target_size_ratio'] = None application = list(json.loads(application_pool.strip()).keys()) if len(application) == 0: out['application'] = '' else: out['application'] = application[0] return rc, cmd, out, err
def create_key(module, result, cluster, user, user_key, name, secret, caps, import_key, dest, container_image=None): # noqa: E501 ''' Create a CephX key ''' cmd_list = [] if not secret: secret = generate_secret() if user == 'client.admin': args = ['import', '-i', dest] else: args = ['get-or-create', name] args.extend(generate_caps(None, caps)) args.extend(['-o', dest]) cmd_list.append(generate_ceph_authtool_cmd( cluster, name, secret, caps, dest, container_image)) if import_key or user != 'client.admin': cmd_list.append(generate_ceph_cmd(sub_cmd=['auth'], args=args, cluster=cluster, user=user, user_key=user_key, container_image=container_image)) return cmd_list
def generate_orch_cli(cluster, spec_path, container_image): args = ['apply', '--in-file', spec_path] cmd = generate_ceph_cmd(sub_cmd=['orch'], args=args, spec_path=spec_path, cluster=cluster, container_image=container_image) return cmd
def create_pool(cluster, name, user, user_key, user_pool_config, container_image=None): ''' Create a new pool ''' args = [ 'create', user_pool_config['pool_name']['value'], user_pool_config['type']['value'] ] if user_pool_config['pg_autoscale_mode']['value'] == 'off': args.extend([ '--pg_num', user_pool_config['pg_num']['value'], '--pgp_num', user_pool_config['pgp_num']['value'] or user_pool_config['pg_num']['value'] ]) elif user_pool_config['target_size_ratio']['value']: args.extend([ '--target_size_ratio', user_pool_config['target_size_ratio']['value'] ]) if user_pool_config['type']['value'] == 'replicated': args.extend([ user_pool_config['crush_rule']['value'], '--expected_num_objects', user_pool_config['expected_num_objects']['value'], '--autoscale-mode', user_pool_config['pg_autoscale_mode']['value'] ]) if (user_pool_config['size']['value'] and user_pool_config['type']['value'] == "replicated"): args.extend(['--size', user_pool_config['size']['value']]) elif user_pool_config['type']['value'] == 'erasure': args.extend([user_pool_config['erasure_profile']['value']]) if user_pool_config['crush_rule']['value']: args.extend([user_pool_config['crush_rule']['value']]) args.extend([ '--expected_num_objects', user_pool_config['expected_num_objects']['value'], '--autoscale-mode', user_pool_config['pg_autoscale_mode']['value'] ]) cmd = generate_ceph_cmd(sub_cmd=['osd', 'pool'], args=args, cluster=cluster, user=user, user_key=user_key, container_image=container_image) return cmd
def main(): module = AnsibleModule( argument_spec=dict( ids=dict(type='list', required=True), cluster=dict(type='str', required=False, default='ceph'), state=dict(type='str', required=True, choices=['destroy', 'down', 'in', 'out', 'purge', 'rm']), # noqa: E501 ), supports_check_mode=True, ) ids = module.params.get('ids') cluster = module.params.get('cluster') state = module.params.get('state') if state in ['destroy', 'purge'] and len(ids) > 1: module.fail_json( msg='destroy and purge only support one OSD at at time', rc=1) # noqa: E501 startd = datetime.datetime.now() container_image = is_containerized() cmd = generate_ceph_cmd(['osd', state], ids, cluster=cluster, container_image=container_image) # noqa: E501 if state in ['destroy', 'purge']: cmd.append('--yes-i-really-mean-it') if module.check_mode: exit_module(module=module, out='', rc=0, cmd=cmd, err='', startd=startd, changed=False) else: rc, out, err = module.run_command(cmd) changed = True if state in ['down', 'in', 'out'] and 'marked' not in err: changed = False exit_module(module=module, out=out, rc=rc, cmd=cmd, err=err, startd=startd, changed=changed)
def remove_user(module, container_image=None): ''' Remove a user ''' cluster = module.params.get('cluster') name = module.params.get('name') args = ['ac-user-delete', name] cmd = generate_ceph_cmd(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image) return cmd
def get_profile(module, name, cluster='ceph', container_image=None): ''' Get existing profile ''' args = ['get', name, '--format=json'] cmd = generate_ceph_cmd(sub_cmd=['osd', 'erasure-code-profile'], args=args, cluster=cluster, container_image=container_image) return cmd
def set_password(module, container_image=None): ''' Set user password ''' cluster = module.params.get('cluster') name = module.params.get('name') args = ['ac-user-set-password', '-i', '-', name] cmd = generate_ceph_cmd(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image, interactive=True) return cmd
def get_user(module, container_image=None): ''' Get existing user ''' cluster = module.params.get('cluster') name = module.params.get('name') args = ['ac-user-show', name, '--format=json'] cmd = generate_ceph_cmd(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image) return cmd
def create_user(module, container_image=None): ''' Create a new user ''' cluster = module.params.get('cluster') name = module.params.get('name') args = ['ac-user-create', '-i', '-', name] cmd = generate_ceph_cmd(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image, interactive=True) return cmd
def get_fs(module, container_image=None): ''' Get existing fs ''' cluster = module.params.get('cluster') name = module.params.get('name') args = ['get', name, '--format=json'] cmd = generate_ceph_cmd(cluster=cluster, sub_cmd=['fs'], args=args, container_image=container_image) return cmd
def remove_fs(module, container_image=None): ''' Remove a fs ''' cluster = module.params.get('cluster') name = module.params.get('name') args = ['rm', name, '--yes-i-really-mean-it'] cmd = generate_ceph_cmd(cluster=cluster, sub_cmd=['fs'], args=args, container_image=container_image) return cmd
def delete_profile(module, name, cluster='ceph', container_image=None): ''' Delete a profile ''' args = ['rm', name] cmd = generate_ceph_cmd(sub_cmd=['osd', 'erasure-code-profile'], args=args, cluster=cluster, container_image=container_image) return cmd
def fail_fs(module, container_image=None): ''' Fail a fs ''' cluster = module.params.get('cluster') name = module.params.get('name') args = ['fail', name] cmd = generate_ceph_cmd(cluster=cluster, sub_cmd=['fs'], args=args, container_image=container_image) return cmd
def set_fs(module, container_image=None): ''' Set parameter to a fs ''' cluster = module.params.get('cluster') name = module.params.get('name') max_mds = module.params.get('max_mds') args = ['set', name, 'max_mds', str(max_mds)] cmd = generate_ceph_cmd(cluster=cluster, sub_cmd=['fs'], args=args, container_image=container_image) return cmd
def create_fs(module, container_image=None): ''' Create a new fs ''' cluster = module.params.get('cluster') name = module.params.get('name') data = module.params.get('data') metadata = module.params.get('metadata') args = ['new', name, metadata, data] cmd = generate_ceph_cmd(cluster=cluster, sub_cmd=['fs'], args=args, container_image=container_image) return cmd
def remove_pool(cluster, name, user, user_key, container_image=None): ''' Remove a pool ''' args = ['rm', name, name, '--yes-i-really-really-mean-it'] cmd = generate_ceph_cmd(sub_cmd=['osd', 'pool'], args=args, cluster=cluster, user=user, user_key=user_key, container_image=container_image) return cmd
def set_roles(module, container_image=None): ''' Set user roles ''' cluster = module.params.get('cluster') name = module.params.get('name') roles = module.params.get('roles') args = ['ac-user-set-roles', name] args.extend(roles) cmd = generate_ceph_cmd(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image) return cmd
def get_rule(module, container_image=None): ''' Get existing crush rule ''' cluster = module.params.get('cluster') name = module.params.get('name') args = ['dump', name, '--format=json'] cmd = generate_ceph_cmd(['osd', 'crush', 'rule'], args, cluster=cluster, container_image=container_image) return cmd
def remove_rule(module, container_image=None): ''' Remove a crush rule ''' cluster = module.params.get('cluster') name = module.params.get('name') args = ['rm', name] cmd = generate_ceph_cmd(['osd', 'crush', 'rule'], args, cluster=cluster, container_image=container_image) return cmd
def create_user(module, container_image=None): ''' Create a new user ''' cluster = module.params.get('cluster') name = module.params.get('name') password = module.params.get('password') args = ['ac-user-create', name, password] cmd = generate_ceph_cmd(sub_cmd=['dashboard'], args=args, cluster=cluster, container_image=container_image) return cmd
def set_password(module, container_image=None): ''' Set user password ''' cluster = module.params.get('cluster') name = module.params.get('name') password = module.params.get('password') args = ['ac-user-set-password', name, password] cmd = generate_ceph_cmd(cluster=cluster, sub_cmd=['dashboard'], args=args, container_image=container_image) return cmd
def main(): module = AnsibleModule( argument_spec=dict( name=dict(type='str', required=True), cluster=dict(type='str', required=False, default='ceph'), state=dict(type='str', required=False, default='enable', choices=['enable', 'disable']), # noqa: E501 ), supports_check_mode=True, ) name = module.params.get('name') cluster = module.params.get('cluster') state = module.params.get('state') startd = datetime.datetime.now() container_image = is_containerized() cmd = generate_ceph_cmd(['mgr', 'module'], [state, name], cluster=cluster, container_image=container_image) if module.check_mode: exit_module(module=module, out='', rc=0, cmd=cmd, err='', startd=startd, changed=False) else: rc, out, err = module.run_command(cmd) if 'is already enabled' in err: changed = False else: changed = True exit_module(module=module, out=out, rc=rc, cmd=cmd, err=err, startd=startd, changed=changed)
def enable_application_pool(cluster, name, application, user, user_key, container_image=None): ''' Enable application on a given pool ''' args = ['application', 'enable', name, application] cmd = generate_ceph_cmd(sub_cmd=['osd', 'pool'], args=args, cluster=cluster, user=user, user_key=user_key, container_image=container_image) return cmd
def get_application_pool(cluster, name, user, user_key, output_format='json', container_image=None): ''' Get application type enabled on a given pool ''' args = ['application', 'get', name, '-f', output_format] cmd = generate_ceph_cmd(sub_cmd=['osd', 'pool'], args=args, cluster=cluster, user=user, user_key=user_key, container_image=container_image) return cmd