diff --git a/cloud/rax b/cloud/rax index 5596a49bb16..f7ea8e9c276 100644 --- a/cloud/rax +++ b/cloud/rax @@ -31,7 +31,18 @@ options: created servers. Only applicable when used with the I(group) attribute or meta key. default: yes + choices: + - "yes" + - "no" version_added: 1.5 + config_drive: + description: + - Attach read-only configuration drive to server as label config-2 + default: no + choices: + - "yes" + - "no" + version_added: 1.7 count: description: - number of instances to launch @@ -55,6 +66,9 @@ options: - Explicitly ensure an exact count of instances, used with state=active/present default: no + choices: + - "yes" + - "no" version_added: 1.4 extra_client_args: description: @@ -119,6 +133,11 @@ options: - present - absent default: present + user_data: + description: + - Data to be uploaded to the servers config drive. This option implies + I(config_drive). Can be a file path or a string + version_added: 1.7 wait: description: - wait for the instance to be in state 'running' before returning @@ -214,19 +233,31 @@ def server_to_dict(obj): return instance -def create(module, names, flavor, image, meta, key_name, files, - wait, wait_timeout, disk_config, group, nics, - extra_create_args, existing=[]): - +def create(module, names=[], flavor=None, image=None, meta={}, key_name=None, + files={}, wait=True, wait_timeout=300, disk_config=None, + group=None, nics=[], extra_create_args={}, user_data=None, + config_drive=False, existing=[]): cs = pyrax.cloudservers changed = False - # Handle the file contents + if user_data: + config_drive = True + + if user_data and os.path.isfile(user_data): + try: + f = open(user_data) + user_data = f.read() + f.close() + except Exception, e: + module.fail_json(msg='Failed to load %s' % user_data) + + # Handle the file contents for rpath in files.keys(): lpath = os.path.expanduser(files[rpath]) try: fileobj = open(lpath, 'r') files[rpath] = fileobj.read() + fileobj.close() except Exception, e: module.fail_json(msg='Failed to load %s' % lpath) try: @@ -237,6 +268,8 @@ def create(module, names, flavor, image, meta, key_name, files, key_name=key_name, files=files, nics=nics, disk_config=disk_config, + config_drive=config_drive, + userdata=user_data, **extra_create_args)) except Exception, e: module.fail_json(msg='%s' % e.message) @@ -303,7 +336,7 @@ def create(module, names, flavor, image, meta, key_name, files, module.exit_json(**results) -def delete(module, instance_ids, wait, wait_timeout, kept=[]): +def delete(module, instance_ids=[], wait=True, wait_timeout=300, kept=[]): cs = pyrax.cloudservers changed = False @@ -379,10 +412,12 @@ def delete(module, instance_ids, wait, wait_timeout, kept=[]): module.exit_json(**results) -def cloudservers(module, state, name, flavor, image, meta, key_name, files, - wait, wait_timeout, disk_config, count, group, - instance_ids, exact_count, networks, count_offset, - auto_increment, extra_create_args): +def cloudservers(module, state=None, name=None, flavor=None, image=None, + meta={}, key_name=None, files={}, wait=True, wait_timeout=300, + disk_config=None, count=1, group=None, instance_ids=[], + exact_count=False, networks=[], count_offset=0, + auto_increment=False, extra_create_args={}, user_data=None, + config_drive=False): cs = pyrax.cloudservers cnw = pyrax.cloud_networks if not cnw: @@ -518,8 +553,8 @@ def cloudservers(module, state, name, flavor, image, meta, key_name, files, instance_ids = [] for server in servers: instance_ids.append(server.id) - delete(module, instance_ids, wait, wait_timeout, - kept=kept) + delete(module, instance_ids=instance_ids, wait=wait, + wait_timeout=wait_timeout, kept=kept) elif len(servers) < count: if auto_increment: names = [] @@ -600,8 +635,11 @@ def cloudservers(module, state, name, flavor, image, meta, key_name, files, names = [name] * (count - len(servers)) - create(module, names, flavor, image, meta, key_name, files, - wait, wait_timeout, disk_config, group, nics, extra_create_args, + create(module, names=names, flavor=flavor, image=image, + meta=meta, key_name=key_name, files=files, wait=wait, + wait_timeout=wait_timeout, disk_config=disk_config, group=group, + nics=nics, extra_create_args=extra_create_args, + user_data=user_data, config_drive=config_drive, existing=servers) elif state == 'absent': @@ -635,7 +673,8 @@ def cloudservers(module, state, name, flavor, image, meta, key_name, files, 'success': [], 'error': [], 'timeout': []}) - delete(module, instance_ids, wait, wait_timeout) + delete(module, instance_ids=instance_ids, wait=wait, + wait_timeout=wait_timeout) def main(): @@ -643,6 +682,7 @@ def main(): argument_spec.update( dict( auto_increment=dict(default=True, type='bool'), + config_drive=dict(default=False, type='bool'), count=dict(default=1, type='int'), count_offset=dict(default=1, type='int'), disk_config=dict(choices=['auto', 'manual']), @@ -660,6 +700,7 @@ def main(): networks=dict(type='list', default=['public', 'private']), service=dict(), state=dict(default='present', choices=['present', 'absent']), + user_data=dict(no_log=True), wait=dict(default=False, type='bool'), wait_timeout=dict(default=300), ) @@ -681,6 +722,7 @@ def main(): 'playbook pertaining to the "rax" module') auto_increment = module.params.get('auto_increment') + config_drive = module.params.get('config_drive') count = module.params.get('count') count_offset = module.params.get('count_offset') disk_config = module.params.get('disk_config') @@ -699,6 +741,7 @@ def main(): name = module.params.get('name') networks = module.params.get('networks') state = module.params.get('state') + user_data = module.params.get('user_data') wait = module.params.get('wait') wait_timeout = int(module.params.get('wait_timeout')) @@ -717,10 +760,14 @@ def main(): 'typically indicates an invalid region or an ' 'incorrectly capitalized region name.') - cloudservers(module, state, name, flavor, image, meta, key_name, files, - wait, wait_timeout, disk_config, count, group, - instance_ids, exact_count, networks, count_offset, - auto_increment, extra_create_args) + cloudservers(module, state=state, name=name, flavor=flavor, + image=image, meta=meta, key_name=key_name, files=files, + wait=wait, wait_timeout=wait_timeout, disk_config=disk_config, + count=count, group=group, instance_ids=instance_ids, + exact_count=exact_count, networks=networks, + count_offset=count_offset, auto_increment=auto_increment, + extra_create_args=extra_create_args, user_data=user_data, + config_drive=config_drive) # import module snippets