def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), description=dict(default=None), enabled=dict(default=True, type='bool'), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) name = module.params['name'] description = module.params['description'] enabled = module.params['enabled'] state = module.params['state'] sdk, cloud = openstack_cloud_from_module(module) try: domains = cloud.search_domains(filters=dict(name=name)) if len(domains) > 1: module.fail_json(msg='Domain name %s is not unique' % name) elif len(domains) == 1: domain = domains[0] else: domain = None if module.check_mode: module.exit_json(changed=_system_state_change(module, domain)) if state == 'present': if domain is None: domain = cloud.create_domain(name=name, description=description, enabled=enabled) changed = True else: if _needs_update(module, domain): domain = cloud.update_domain(domain.id, name=name, description=description, enabled=enabled) changed = True else: changed = False module.exit_json(changed=changed, domain=domain, id=domain.id) elif state == 'absent': if domain is None: changed = False else: cloud.delete_domain(domain.id) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( display_name=dict(required=True, aliases=['name']), display_description=dict(default=None, aliases=['description']), volume=dict(required=True), force=dict(required=False, default=False, type='bool'), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) sdk, cloud = openstack_cloud_from_module(module) state = module.params['state'] try: if cloud.volume_exists(module.params['volume']): if module.check_mode: module.exit_json(changed=_system_state_change(module, cloud)) if state == 'present': _present_volume_snapshot(module, cloud) if state == 'absent': _absent_volume_snapshot(module, cloud) else: module.fail_json(msg="No volume with name or id '{0}' was found.". format(module.params['volume'])) except (sdk.exceptions.OpenStackCloudException, sdk.exceptions.ResourceTimeout) as e: module.fail_json(msg=e.message)
def main(): argument_spec = openstack_full_argument_spec( image=dict(required=False), properties=dict(default=None, type='dict'), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, **module_kwargs) is_old_facts = module._name == 'os_image_facts' if is_old_facts: module.deprecate("The 'os_image_facts' module has been renamed to 'os_image_info', " "and the renamed one no longer returns ansible_facts", version='2.13') sdk, cloud = openstack_cloud_from_module(module) try: if module.params['image']: image = cloud.get_image(module.params['image']) if is_old_facts: module.exit_json(changed=False, ansible_facts=dict( openstack_image=image)) else: module.exit_json(changed=False, openstack_image=image) else: images = cloud.search_images(filters=module.params['properties']) if is_old_facts: module.exit_json(changed=False, ansible_facts=dict( openstack_image=images)) else: module.exit_json(changed=False, openstack_image=images) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( port=dict(required=False), filters=dict(type='dict', required=False), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, **module_kwargs) is_old_facts = module._name == 'os_port_facts' if is_old_facts: module.deprecate( "The 'os_port_facts' module has been renamed to 'os_port_info', " "and the renamed one no longer returns ansible_facts", version='2.13') port = module.params.get('port') filters = module.params.get('filters') sdk, cloud = openstack_cloud_from_module(module) try: ports = cloud.search_ports(port, filters) if is_old_facts: module.exit_json(changed=False, ansible_facts=dict(openstack_ports=ports)) else: module.exit_json(changed=False, openstack_ports=ports) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec(name=dict(required=False, default=None, aliases=['subnet']), filters=dict(required=False, type='dict', default=None)) module = AnsibleModule(argument_spec) is_old_facts = module._name == 'os_subnets_facts' if is_old_facts: module.deprecate( "The 'os_subnets_facts' module has been renamed to 'os_subnets_info', " "and the renamed one no longer returns ansible_facts", version='2.13') sdk, cloud = openstack_cloud_from_module(module) try: subnets = cloud.search_subnets(module.params['name'], module.params['filters']) if is_old_facts: module.exit_json(changed=False, ansible_facts=dict(openstack_subnets=subnets)) else: module.exit_json(changed=False, openstack_subnets=subnets) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( size=dict(default=None, type='int'), volume_type=dict(default=None), display_name=dict(required=True, aliases=['name']), display_description=dict(default=None, aliases=['description']), image=dict(default=None), snapshot_id=dict(default=None), volume=dict(default=None), state=dict(default='present', choices=['absent', 'present']), scheduler_hints=dict(default=None, type='dict'), metadata=dict(default=None, type='dict'), bootable=dict(type='bool', default=False)) module_kwargs = openstack_module_kwargs(mutually_exclusive=[ ['image', 'snapshot_id', 'volume'], ], ) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, **module_kwargs) state = module.params['state'] if state == 'present' and not module.params['size']: module.fail_json(msg="Size is required when state is 'present'") sdk, cloud = openstack_cloud_from_module(module) try: if state == 'present': _present_volume(module, cloud) if state == 'absent': _absent_volume(module, cloud, sdk) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), public_key=dict(default=None), public_key_file=dict(default=None), state=dict(default='present', choices=['absent', 'present', 'replace']), ) module_kwargs = openstack_module_kwargs( mutually_exclusive=[['public_key', 'public_key_file']]) module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) state = module.params['state'] name = module.params['name'] public_key = module.params['public_key'] if module.params['public_key_file']: with open(module.params['public_key_file']) as public_key_fh: public_key = public_key_fh.read().rstrip() sdk, cloud = openstack_cloud_from_module(module) try: keypair = cloud.get_keypair(name) if module.check_mode: module.exit_json(changed=_system_state_change(module, keypair)) if state in ('present', 'replace'): if keypair and keypair['name'] == name: if public_key and (public_key != keypair['public_key']): if state == 'present': module.fail_json( msg="Key name %s present but key hash not the same" " as offered. Delete key first." % name) else: cloud.delete_keypair(name) keypair = cloud.create_keypair(name, public_key) changed = True else: changed = False else: keypair = cloud.create_keypair(name, public_key) changed = True module.exit_json(changed=changed, key=keypair, id=keypair['id']) elif state == 'absent': if keypair: cloud.delete_keypair(name) module.exit_json(changed=True) module.exit_json(changed=False) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), state=dict(default='present', choices=['absent', 'present']), pool=dict(required=True), address=dict(default=None), protocol_port=dict(default=80, type='int'), subnet_id=dict(default=None), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, **module_kwargs) sdk, cloud = openstack_cloud_from_module(module) name = module.params['name'] pool = module.params['pool'] try: changed = False pool_ret = cloud.load_balancer.find_pool(name_or_id=pool) if not pool_ret: module.fail_json(msg='pool %s is not found' % pool) pool_id = pool_ret.id member = cloud.load_balancer.find_member(name, pool_id) if module.params['state'] == 'present': if not member: member = cloud.load_balancer.create_member( pool_ret, address=module.params['address'], name=name, protocol_port=module.params['protocol_port'], subnet_id=module.params['subnet_id']) changed = True if not module.params['wait']: module.exit_json(changed=changed, member=member.to_dict(), id=member.id) if module.params['wait']: member = _wait_for_member_status(module, cloud, pool_id, member.id, "ACTIVE", ["ERROR"]) module.exit_json(changed=changed, member=member.to_dict(), id=member.id) elif module.params['state'] == 'absent': if member: cloud.load_balancer.delete_member(member, pool_ret) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e), extra_data=e.extra_data)
def main(): argument_spec = openstack_full_argument_spec( cluster_template_id=dict(required=True), discovery_url=dict(default=None), docker_volume_size=dict(type='int'), flavor_id=dict(default=None), keypair=dict(default=None), labels=dict(default=None, type='raw'), master_count=dict(type='int', default=1), master_flavor_id=dict(default=None), name=dict(required=True), node_count=dict(type='int', default=1), state=dict(default='present', choices=['absent', 'present']), timeout=dict(type='int', default=60), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, **module_kwargs) params = module.params.copy() state = module.params['state'] name = module.params['name'] cluster_template_id = module.params['cluster_template_id'] kwargs = dict( discovery_url=module.params['discovery_url'], docker_volume_size=module.params['docker_volume_size'], flavor_id=module.params['flavor_id'], keypair=module.params['keypair'], labels=_parse_labels(params['labels']), master_count=module.params['master_count'], master_flavor_id=module.params['master_flavor_id'], node_count=module.params['node_count'], create_timeout=module.params['timeout'], ) sdk, cloud = openstack_cloud_from_module(module) try: changed = False cluster = cloud.get_coe_cluster(name_or_id=name, filters={'cluster_template_id': cluster_template_id}) if state == 'present': if not cluster: cluster = cloud.create_coe_cluster(name, cluster_template_id=cluster_template_id, **kwargs) changed = True else: changed = False module.exit_json(changed=changed, cluster=cluster, id=cluster['uuid']) elif state == 'absent': if not cluster: module.exit_json(changed=False) else: cloud.delete_coe_cluster(name) module.exit_json(changed=True) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e), extra_data=e.extra_data)
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=False, default=None), ram=dict(required=False, default=None), vcpus=dict(required=False, default=None), limit=dict(required=False, default=None, type='int'), ephemeral=dict(required=False, default=None), ) module_kwargs = openstack_module_kwargs( mutually_exclusive=[ ['name', 'ram'], ['name', 'vcpus'], ['name', 'ephemeral'] ] ) module = AnsibleModule(argument_spec, **module_kwargs) is_old_facts = module._name == 'os_flavor_facts' if is_old_facts: module.deprecate("The 'os_flavor_facts' module has been renamed to 'os_flavor_info', " "and the renamed one no longer returns ansible_facts", version='2.13') name = module.params['name'] vcpus = module.params['vcpus'] ram = module.params['ram'] ephemeral = module.params['ephemeral'] limit = module.params['limit'] filters = {} if vcpus: filters['vcpus'] = vcpus if ram: filters['ram'] = ram if ephemeral: filters['ephemeral'] = ephemeral sdk, cloud = openstack_cloud_from_module(module) try: if name: flavors = cloud.search_flavors(filters={'name': name}) else: flavors = cloud.list_flavors() if filters: flavors = cloud.range_search(flavors, filters) if limit is not None: flavors = flavors[:limit] if is_old_facts: module.exit_json(changed=False, ansible_facts=dict(openstack_flavors=flavors)) else: module.exit_json(changed=False, openstack_flavors=flavors) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), description=dict(required=False, default=None), domain_id=dict(required=False, default=None), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) name = module.params.get('name') description = module.params.get('description') state = module.params.get('state') domain_id = module.params.pop('domain_id') sdk, cloud = openstack_cloud_from_module(module) try: if domain_id: group = cloud.get_group(name, filters={'domain_id': domain_id}) else: group = cloud.get_group(name) if module.check_mode: module.exit_json( changed=_system_state_change(state, description, group)) if state == 'present': if group is None: group = cloud.create_group(name=name, description=description, domain=domain_id) changed = True else: if description is not None and group.description != description: group = cloud.update_group(group.id, description=description) changed = True else: changed = False module.exit_json(changed=changed, group=group) elif state == 'absent': if group is None: changed = False else: cloud.delete_group(group.id) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=False, default=None), domain=dict(required=False, default=None), filters=dict(required=False, type='dict', default=None), ) module = AnsibleModule(argument_spec) is_old_facts = module._name == 'os_project_facts' if is_old_facts: module.deprecate( "The 'os_project_facts' module has been renamed to 'os_project_info', " "and the renamed one no longer returns ansible_facts", version='2.13') sdk, opcloud = openstack_cloud_from_module(module) try: name = module.params['name'] domain = module.params['domain'] filters = module.params['filters'] if domain: try: # We assume admin is passing domain id dom = opcloud.get_domain(domain)['id'] domain = dom except Exception: # If we fail, maybe admin is passing a domain name. # Note that domains have unique names, just like id. dom = opcloud.search_domains(filters={'name': domain}) if dom: domain = dom[0]['id'] else: module.fail_json(msg='Domain name or ID does not exist') if not filters: filters = {} filters['domain_id'] = domain projects = opcloud.search_projects(name, filters) if is_old_facts: module.exit_json(changed=False, ansible_facts=dict(openstack_projects=projects)) else: module.exit_json(changed=False, openstack_projects=projects) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec() module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, **module_kwargs) sdk, cloud = openstack_cloud_from_module(module) try: module.exit_json(changed=False, ansible_facts=dict( auth_token=cloud.auth_token, service_catalog=cloud.service_catalog)) except Exception as e: module.fail_json(msg=str(e), exception=traceback.format_exc())
def main(): argument_spec = openstack_full_argument_spec( server=dict(required=True, aliases=['name']), meta=dict(required=True, type='dict'), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) state = module.params['state'] server_param = module.params['server'] meta_param = module.params['meta'] changed = False sdk, cloud = openstack_cloud_from_module(module) try: server = cloud.get_server(server_param) if not server: module.fail_json( msg='Could not find server {0}'.format(server_param)) if state == 'present': # check if it needs update if _needs_update(server_metadata=server.metadata, metadata=meta_param): if not module.check_mode: cloud.set_server_metadata(server_param, meta_param) changed = True elif state == 'absent': # remove from params the keys that do not exist in the server keys_to_delete = _get_keys_to_delete(server.metadata.keys(), meta_param.keys()) if len(keys_to_delete) > 0: if not module.check_mode: cloud.delete_server_metadata(server_param, keys_to_delete) changed = True if changed: server = cloud.get_server(server_param) module.exit_json( changed=changed, server_id=server.id, metadata=server.metadata) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=e.message, extra_data=e.extra_data)
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=False, default=None), container=dict(required=True), filename=dict(required=False, default=None), container_access=dict(default='private', choices=['private', 'public']), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, **module_kwargs) sdk, cloud = openstack_cloud_from_module(module) try: changed = process_object(cloud, **module.params) module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( auth_type=dict(required=False), uuid=dict(required=False), name=dict(required=False), mac=dict(required=False), ironic_url=dict(required=False), timeout=dict(default=1200, type='int', required=False), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, **module_kwargs) if (module.params['auth_type'] in [None, 'None'] and module.params['ironic_url'] is None): module.fail_json(msg="Authentication appears to be disabled, " "Please define an ironic_url parameter") if (module.params['ironic_url'] and module.params['auth_type'] in [None, 'None']): module.params['auth'] = dict(endpoint=module.params['ironic_url']) sdk, cloud = openstack_cloud_from_module(module) try: if module.params['name'] or module.params['uuid']: server = cloud.get_machine(_choose_id_value(module)) elif module.params['mac']: server = cloud.get_machine_by_mac(module.params['mac']) else: module.fail_json(msg="The worlds did not align, " "the host was not found as " "no name, uuid, or mac was " "defined.") if server: cloud.inspect_machine(server['uuid'], module.params['wait']) # TODO(TheJulia): diff properties, ?and ports? and determine # if a change occurred. In theory, the node is always changed # if introspection is able to update the record. module.exit_json(changed=True, ansible_facts=server['properties']) else: module.fail_json(msg="node not found.") except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( server=dict(required=False), detailed=dict(required=False, type='bool', default=False), filters=dict(required=False, type='dict', default=None), all_projects=dict(required=False, type='bool', default=False), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, **module_kwargs) is_old_facts = module._name == 'os_server_facts' if is_old_facts: module.deprecate( "The 'os_server_facts' module has been renamed to 'os_server_info', " "and the renamed one no longer returns ansible_facts", version='2.13') sdk, cloud = openstack_cloud_from_module(module) try: openstack_servers = cloud.search_servers( detailed=module.params['detailed'], filters=module.params['filters'], all_projects=module.params['all_projects']) if module.params['server']: # filter servers by name pattern = module.params['server'] # TODO(mordred) This is handled by sdk now openstack_servers = [ server for server in openstack_servers if fnmatch.fnmatch(server['name'], pattern) or fnmatch.fnmatch(server['id'], pattern) ] if is_old_facts: module.exit_json( changed=False, ansible_facts=dict(openstack_servers=openstack_servers)) else: module.exit_json(changed=False, openstack_servers=openstack_servers) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), policies=dict(required=False, type='list'), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) name = module.params['name'] policies = module.params['policies'] state = module.params['state'] sdk, cloud = openstack_cloud_from_module(module) try: server_group = cloud.get_server_group(name) if module.check_mode: module.exit_json(changed=_system_state_change(state, server_group)) changed = False if state == 'present': if not server_group: if not policies: module.fail_json( msg="Parameter 'policies' is required in Server Group " "Create") server_group = cloud.create_server_group(name, policies) changed = True module.exit_json(changed=changed, id=server_group['id'], server_group=server_group) if state == 'absent': if server_group: cloud.delete_server_group(server_group['id']) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e), extra_data=e.extra_data)
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=False, default=None), filters=dict(required=False, type='dict', default=None), ) module_kwargs = openstack_module_kwargs(mutually_exclusive=[ ['name', 'filters'], ]) module = AnsibleModule(argument_spec, **module_kwargs) is_old_facts = module._name == 'os_keystone_domain_facts' if is_old_facts: module.deprecate( "The 'os_keystone_domain_facts' module has been renamed to 'os_keystone_domain_info', " "and the renamed one no longer returns ansible_facts", version='2.13') sdk, opcloud = openstack_cloud_from_module(module) try: name = module.params['name'] filters = module.params['filters'] if name: # Let's suppose user is passing domain ID try: domains = opcloud.get_domain(name) except Exception: domains = opcloud.search_domains(filters={'name': name}) else: domains = opcloud.search_domains(filters) if is_old_facts: module.exit_json(changed=False, ansible_facts=dict(openstack_domains=domains)) else: module.exit_json(changed=False, openstack_domains=domains) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) name = module.params.get('name') state = module.params.get('state') sdk, cloud = openstack_cloud_from_module(module) try: role = cloud.get_role(name) if module.check_mode: module.exit_json(changed=_system_state_change(state, role)) if state == 'present': if role is None: role = cloud.create_role(name) changed = True else: changed = False module.exit_json(changed=changed, role=role) elif state == 'absent': if role is None: changed = False else: cloud.delete_role(name) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=False, default=None), domain=dict(required=False, default=None), filters=dict(required=False, type='dict', default=None), ) module = AnsibleModule(argument_spec) sdk, opcloud = openstack_cloud_from_module(module) try: name = module.params['name'] domain = module.params['domain'] filters = module.params['filters'] if domain: try: # We assume admin is passing domain id dom = opcloud.get_domain(domain)['id'] domain = dom except Exception: # If we fail, maybe admin is passing a domain name. # Note that domains have unique names, just like id. dom = opcloud.search_domains(filters={'name': domain}) if dom: domain = dom[0]['id'] else: module.fail_json(msg='Domain name or ID does not exist') if not filters: filters = {} groups = opcloud.search_groups(name, filters, domain_id=domain) module.exit_json(changed=False, groups=groups) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( user=dict(required=True), group=dict(required=True), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) user = module.params['user'] group = module.params['group'] state = module.params['state'] sdk, cloud = openstack_cloud_from_module(module) try: in_group = cloud.is_user_in_group(user, group) if module.check_mode: module.exit_json(changed=_system_state_change(state, in_group)) changed = False if state == 'present': if not in_group: cloud.add_user_to_group(user, group) changed = True elif state == 'absent': if in_group: cloud.remove_user_from_group(user, group) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e), extra_data=e.extra_data)
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), zone_type=dict(required=False, choices=['primary', 'secondary']), email=dict(required=False, default=None), description=dict(required=False, default=None), ttl=dict(required=False, default=None, type='int'), masters=dict(required=False, default=None, type='list'), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) name = module.params.get('name') state = module.params.get('state') wait = module.params.get('wait') timeout = module.params.get('timeout') sdk, cloud = openstack_cloud_from_module(module) try: zone = cloud.get_zone(name) if state == 'present': zone_type = module.params.get('zone_type') email = module.params.get('email') description = module.params.get('description') ttl = module.params.get('ttl') masters = module.params.get('masters') if module.check_mode: module.exit_json(changed=_system_state_change(state, email, description, ttl, masters, zone)) if zone is None: zone = cloud.create_zone( name=name, zone_type=zone_type, email=email, description=description, ttl=ttl, masters=masters) changed = True else: if masters is None: masters = [] pre_update_zone = zone changed = _system_state_change(state, email, description, ttl, masters, pre_update_zone) if changed: zone = cloud.update_zone( name, email=email, description=description, ttl=ttl, masters=masters) if wait: _wait(timeout, cloud, zone, state, module, sdk) module.exit_json(changed=changed, zone=zone) elif state == 'absent': if module.check_mode: module.exit_json(changed=_system_state_change(state, None, None, None, None, zone)) if zone is None: changed = False else: cloud.delete_zone(name) changed = True if wait: _wait(timeout, cloud, zone, state, module, sdk) module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( state=dict(required=False, default='present', choices=['absent', 'present']), name=dict(required=False), # required when state is 'present' ram=dict(required=False, type='int'), vcpus=dict(required=False, type='int'), disk=dict(required=False, default=0, type='int'), ephemeral=dict(required=False, default=0, type='int'), swap=dict(required=False, default=0, type='int'), rxtx_factor=dict(required=False, default=1.0, type='float'), is_public=dict(required=False, default=True, type='bool'), flavorid=dict(required=False, default="auto"), extra_specs=dict(required=False, default=None, type='dict'), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, required_if=[('state', 'present', ['ram', 'vcpus', 'disk'])], **module_kwargs) state = module.params['state'] name = module.params['name'] extra_specs = module.params['extra_specs'] or {} sdk, cloud = openstack_cloud_from_module(module) try: flavor = cloud.get_flavor(name) if module.check_mode: module.exit_json(changed=_system_state_change(module, flavor)) if state == 'present': old_extra_specs = {} require_update = False if flavor: old_extra_specs = flavor['extra_specs'] for param_key in [ 'ram', 'vcpus', 'disk', 'ephemeral', 'swap', 'rxtx_factor', 'is_public' ]: if module.params[param_key] != flavor[param_key]: require_update = True break if flavor and require_update: cloud.delete_flavor(name) flavor = None if not flavor: flavor = cloud.create_flavor( name=name, ram=module.params['ram'], vcpus=module.params['vcpus'], disk=module.params['disk'], flavorid=module.params['flavorid'], ephemeral=module.params['ephemeral'], swap=module.params['swap'], rxtx_factor=module.params['rxtx_factor'], is_public=module.params['is_public']) changed = True else: changed = False new_extra_specs = dict([(k, str(v)) for k, v in extra_specs.items()]) unset_keys = set(old_extra_specs.keys()) - set(extra_specs.keys()) if unset_keys and not require_update: cloud.unset_flavor_specs(flavor['id'], unset_keys) if old_extra_specs != new_extra_specs: cloud.set_flavor_specs(flavor['id'], extra_specs) changed = (changed or old_extra_specs != new_extra_specs) module.exit_json(changed=changed, flavor=flavor, id=flavor['id']) elif state == 'absent': if flavor: cloud.delete_flavor(name) module.exit_json(changed=True) module.exit_json(changed=False) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), state=dict(default='present', choices=['absent', 'present']), vip_network=dict(required=False), vip_subnet=dict(required=False), vip_port=dict(required=False), vip_address=dict(required=False), listeners=dict(type='list', default=[]), public_ip_address=dict(required=False, default=None), auto_public_ip=dict(required=False, default=False, type='bool'), public_network=dict(required=False), delete_public_ip=dict(required=False, default=False, type='bool'), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, **module_kwargs) sdk, cloud = openstack_cloud_from_module(module) vip_network = module.params['vip_network'] vip_subnet = module.params['vip_subnet'] vip_port = module.params['vip_port'] listeners = module.params['listeners'] public_vip_address = module.params['public_ip_address'] allocate_fip = module.params['auto_public_ip'] delete_fip = module.params['delete_public_ip'] public_network = module.params['public_network'] vip_network_id = None vip_subnet_id = None vip_port_id = None try: changed = False lb = cloud.load_balancer.find_load_balancer( name_or_id=module.params['name']) if module.params['state'] == 'present': if not lb: if not (vip_network or vip_subnet or vip_port): module.fail_json( msg="One of vip_network, vip_subnet, or vip_port must " "be specified for load balancer creation") if vip_network: network = cloud.get_network(vip_network) if not network: module.fail_json(msg='network %s is not found' % vip_network) vip_network_id = network.id if vip_subnet: subnet = cloud.get_subnet(vip_subnet) if not subnet: module.fail_json(msg='subnet %s is not found' % vip_subnet) vip_subnet_id = subnet.id if vip_port: port = cloud.get_port(vip_port) if not port: module.fail_json(msg='port %s is not found' % vip_port) vip_port_id = port.id lb = cloud.load_balancer.create_load_balancer( name=module.params['name'], vip_network_id=vip_network_id, vip_subnet_id=vip_subnet_id, vip_port_id=vip_port_id, vip_address=module.params['vip_address'], ) changed = True if not listeners and not module.params['wait']: module.exit_json(changed=changed, loadbalancer=lb.to_dict(), id=lb.id) _wait_for_lb(module, cloud, lb, "ACTIVE", ["ERROR"]) for listener_def in listeners: listener_name = listener_def.get("name") pool_def = listener_def.get("pool") if not listener_name: module.fail_json(msg='listener name is required') listener = cloud.load_balancer.find_listener( name_or_id=listener_name) if not listener: _wait_for_lb(module, cloud, lb, "ACTIVE", ["ERROR"]) protocol = listener_def.get("protocol", "HTTP") protocol_port = listener_def.get("protocol_port", 80) listener = cloud.load_balancer.create_listener( name=listener_name, loadbalancer_id=lb.id, protocol=protocol, protocol_port=protocol_port, ) changed = True # Ensure pool in the listener. if pool_def: pool_name = pool_def.get("name") members = pool_def.get('members', []) if not pool_name: module.fail_json(msg='pool name is required') pool = cloud.load_balancer.find_pool(name_or_id=pool_name) if not pool: _wait_for_lb(module, cloud, lb, "ACTIVE", ["ERROR"]) protocol = pool_def.get("protocol", "HTTP") lb_algorithm = pool_def.get("lb_algorithm", "ROUND_ROBIN") pool = cloud.load_balancer.create_pool( name=pool_name, listener_id=listener.id, protocol=protocol, lb_algorithm=lb_algorithm) changed = True # Ensure members in the pool for member_def in members: member_name = member_def.get("name") if not member_name: module.fail_json(msg='member name is required') member = cloud.load_balancer.find_member( member_name, pool.id) if not member: _wait_for_lb(module, cloud, lb, "ACTIVE", ["ERROR"]) address = member_def.get("address") if not address: module.fail_json( msg='member address for member %s is ' 'required' % member_name) subnet_id = member_def.get("subnet") if subnet_id: subnet = cloud.get_subnet(subnet_id) if not subnet: module.fail_json( msg='subnet %s for member %s is not ' 'found' % (subnet_id, member_name)) subnet_id = subnet.id protocol_port = member_def.get("protocol_port", 80) member = cloud.load_balancer.create_member( pool, name=member_name, address=address, protocol_port=protocol_port, subnet_id=subnet_id) changed = True # Associate public ip to the load balancer VIP. If # public_vip_address is provided, use that IP, otherwise, either # find an available public ip or create a new one. fip = None orig_public_ip = None new_public_ip = None if public_vip_address or allocate_fip: ips = cloud.network.ips(port_id=lb.vip_port_id, fixed_ip_address=lb.vip_address) ips = list(ips) if ips: orig_public_ip = ips[0] new_public_ip = orig_public_ip.floating_ip_address if public_vip_address and public_vip_address != orig_public_ip: fip = cloud.network.find_ip(public_vip_address) if not fip: module.fail_json(msg='Public IP %s is unavailable' % public_vip_address) # Release origin public ip first cloud.network.update_ip(orig_public_ip, fixed_ip_address=None, port_id=None) # Associate new public ip cloud.network.update_ip(fip, fixed_ip_address=lb.vip_address, port_id=lb.vip_port_id) new_public_ip = public_vip_address changed = True elif allocate_fip and not orig_public_ip: fip = cloud.network.find_available_ip() if not fip: if not public_network: module.fail_json(msg="Public network is not provided") pub_net = cloud.network.find_network(public_network) if not pub_net: module.fail_json(msg='Public network %s not found' % public_network) fip = cloud.network.create_ip( floating_network_id=pub_net.id) cloud.network.update_ip(fip, fixed_ip_address=lb.vip_address, port_id=lb.vip_port_id) new_public_ip = fip.floating_ip_address changed = True # Include public_vip_address in the result. lb = cloud.load_balancer.find_load_balancer(name_or_id=lb.id) lb_dict = lb.to_dict() lb_dict.update({"public_vip_address": new_public_ip}) module.exit_json(changed=changed, loadbalancer=lb_dict, id=lb.id) elif module.params['state'] == 'absent': changed = False public_vip_address = None if lb: if delete_fip: ips = cloud.network.ips(port_id=lb.vip_port_id, fixed_ip_address=lb.vip_address) ips = list(ips) if ips: public_vip_address = ips[0] # Deleting load balancer with `cascade=False` does not make # sense because the deletion will always fail if there are # sub-resources. cloud.load_balancer.delete_load_balancer(lb, cascade=True) changed = True if module.params['wait']: _wait_for_lb(module, cloud, lb, "DELETED", ["ERROR"]) if delete_fip and public_vip_address: cloud.network.delete_ip(public_vip_address) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e), extra_data=e.extra_data)
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), state=dict(default='present', choices=['absent', 'present']), loadbalancer=dict(default=None), listener=dict(default=None), protocol=dict(default='HTTP', choices=['HTTP', 'HTTPS', 'TCP', 'UDP', 'PROXY']), lb_algorithm=dict( default='ROUND_ROBIN', choices=['ROUND_ROBIN', 'LEAST_CONNECTIONS', 'SOURCE_IP'] ) ) module_kwargs = openstack_module_kwargs( mutually_exclusive=[['loadbalancer', 'listener']] ) module = AnsibleModule(argument_spec, **module_kwargs) sdk, cloud = openstack_cloud_from_module(module) loadbalancer = module.params['loadbalancer'] listener = module.params['listener'] try: changed = False pool = cloud.load_balancer.find_pool(name_or_id=module.params['name']) if module.params['state'] == 'present': if not pool: loadbalancer_id = None if not (loadbalancer or listener): module.fail_json( msg="either loadbalancer or listener must be provided" ) if loadbalancer: lb = cloud.load_balancer.find_load_balancer(loadbalancer) if not lb: module.fail_json(msg='load balancer %s is not ' 'found' % loadbalancer) loadbalancer_id = lb.id listener_id = None if listener: listener_ret = cloud.load_balancer.find_listener(listener) if not listener_ret: module.fail_json(msg='listener %s is not found' % listener) listener_id = listener_ret.id pool = cloud.load_balancer.create_pool( name=module.params['name'], loadbalancer_id=loadbalancer_id, listener_id=listener_id, protocol=module.params['protocol'], lb_algorithm=module.params['lb_algorithm'] ) changed = True if not module.params['wait']: module.exit_json(changed=changed, pool=pool.to_dict(), id=pool.id) if module.params['wait']: pool = _wait_for_pool_status(module, cloud, pool.id, "ACTIVE", ["ERROR"]) module.exit_json(changed=changed, pool=pool.to_dict(), id=pool.id) elif module.params['state'] == 'absent': if pool: cloud.load_balancer.delete_pool(pool) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e), extra_data=e.extra_data)
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), id=dict(default=None), checksum=dict(default=None), disk_format=dict(default='qcow2', choices=['ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw', 'qcow2', 'vdi', 'iso', 'vhdx', 'ploop']), container_format=dict(default='bare', choices=['ami', 'aki', 'ari', 'bare', 'ovf', 'ova', 'docker']), owner=dict(default=None), min_disk=dict(type='int', default=0), min_ram=dict(type='int', default=0), is_public=dict(type='bool', default=False), protected=dict(type='bool', default=False), filename=dict(default=None), ramdisk=dict(default=None), kernel=dict(default=None), properties=dict(type='dict', default={}), volume=dict(default=None), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs( mutually_exclusive=[['filename', 'volume']], ) module = AnsibleModule(argument_spec, **module_kwargs) sdk, cloud = openstack_cloud_from_module(module) try: changed = False if module.params['id']: image = cloud.get_image(name_or_id=module.params['id']) elif module.params['checksum']: image = cloud.get_image(name_or_id=module.params['name'], filters={'checksum': module.params['checksum']}) else: image = cloud.get_image(name_or_id=module.params['name']) if module.params['state'] == 'present': if not image: kwargs = {} if module.params['id'] is not None: kwargs['id'] = module.params['id'] image = cloud.create_image( name=module.params['name'], filename=module.params['filename'], disk_format=module.params['disk_format'], container_format=module.params['container_format'], wait=module.params['wait'], timeout=module.params['timeout'], is_public=module.params['is_public'], protected=module.params['protected'], min_disk=module.params['min_disk'], min_ram=module.params['min_ram'], volume=module.params['volume'], **kwargs ) changed = True if not module.params['wait']: module.exit_json(changed=changed, image=image, id=image.id) cloud.update_image_properties( image=image, kernel=module.params['kernel'], ramdisk=module.params['ramdisk'], protected=module.params['protected'], **module.params['properties']) image = cloud.get_image(name_or_id=image.id) module.exit_json(changed=changed, image=image, id=image.id) elif module.params['state'] == 'absent': if not image: changed = False else: cloud.delete_image( name_or_id=module.params['name'], wait=module.params['wait'], timeout=module.params['timeout']) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e), extra_data=e.extra_data)
def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), description=dict(default=''), state=dict(default='present', choices=['absent', 'present']), project=dict(default=None), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) name = module.params['name'] state = module.params['state'] description = module.params['description'] project = module.params['project'] sdk, cloud = openstack_cloud_from_module(module) try: if project is not None: proj = cloud.get_project(project) if proj is None: module.fail_json(msg='Project %s could not be found' % project) project_id = proj['id'] else: project_id = cloud.current_project_id if project_id: filters = {'tenant_id': project_id} else: filters = None secgroup = cloud.get_security_group(name, filters=filters) if module.check_mode: module.exit_json(changed=_system_state_change(module, secgroup)) changed = False if state == 'present': if not secgroup: kwargs = {} if project_id: kwargs['project_id'] = project_id secgroup = cloud.create_security_group(name, description, **kwargs) changed = True else: if _needs_update(module, secgroup): secgroup = cloud.update_security_group( secgroup['id'], description=description) changed = True module.exit_json( changed=changed, id=secgroup['id'], secgroup=secgroup) if state == 'absent': if secgroup: cloud.delete_security_group(secgroup['id']) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( role=dict(required=True), user=dict(required=False), group=dict(required=False), project=dict(required=False), domain=dict(required=False), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs( required_one_of=[ ['user', 'group'] ]) module = AnsibleModule(argument_spec, supports_check_mode=True, **module_kwargs) role = module.params.get('role') user = module.params.get('user') group = module.params.get('group') project = module.params.get('project') domain = module.params.get('domain') state = module.params.get('state') sdk, cloud = openstack_cloud_from_module(module) try: filters = {} r = cloud.get_role(role) if r is None: module.fail_json(msg="Role %s is not valid" % role) filters['role'] = r['id'] if domain: d = cloud.get_domain(name_or_id=domain) if d is None: module.fail_json(msg="Domain %s is not valid" % domain) filters['domain'] = d['id'] if user: if domain: u = cloud.get_user(user, domain_id=filters['domain']) else: u = cloud.get_user(user) if u is None: module.fail_json(msg="User %s is not valid" % user) filters['user'] = u['id'] if group: g = cloud.get_group(group) if g is None: module.fail_json(msg="Group %s is not valid" % group) filters['group'] = g['id'] domain_id = None if project: if domain: p = cloud.get_project(project, domain_id=filters['domain']) # OpenStack won't allow us to use both a domain and project as # filter. Once we identified the project (using the domain as # a filter criteria), we need to remove the domain itself from # the filters list. domain_id = filters.pop('domain') else: p = cloud.get_project(project) if p is None: module.fail_json(msg="Project %s is not valid" % project) filters['project'] = p['id'] assignment = cloud.list_role_assignments(filters=filters) if module.check_mode: module.exit_json(changed=_system_state_change(state, assignment)) changed = False if state == 'present': if not assignment: kwargs = _build_kwargs(user, group, project, domain_id) cloud.grant_role(role, **kwargs) changed = True elif state == 'absent': if assignment: kwargs = _build_kwargs(user, group, project, domain_id) cloud.revoke_role(role, **kwargs) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))
def main(): argument_spec = openstack_full_argument_spec( zone=dict(required=True), name=dict(required=True), recordset_type=dict(required=False), records=dict(required=False, type='list'), description=dict(required=False, default=None), ttl=dict(required=False, default=None, type='int'), state=dict(default='present', choices=['absent', 'present']), ) module_kwargs = openstack_module_kwargs() module = AnsibleModule(argument_spec, required_if=[('state', 'present', ['recordset_type', 'records'])], supports_check_mode=True, **module_kwargs) zone = module.params.get('zone') name = module.params.get('name') state = module.params.get('state') sdk, cloud = openstack_cloud_from_module(module) try: recordset_type = module.params.get('recordset_type') recordset_filter = {'type': recordset_type} recordsets = cloud.search_recordsets(zone, name_or_id=name, filters=recordset_filter) if len(recordsets) == 1: recordset = recordsets[0] try: recordset_id = recordset['id'] except KeyError as e: module.fail_json(msg=str(e)) else: # recordsets is filtered by type and should never be more than 1 return recordset = None if state == 'present': records = module.params.get('records') description = module.params.get('description') ttl = module.params.get('ttl') if module.check_mode: module.exit_json(changed=_system_state_change( state, records, description, ttl, zone, recordset)) if recordset is None: recordset = cloud.create_recordset( zone=zone, name=name, recordset_type=recordset_type, records=records, description=description, ttl=ttl) changed = True else: if records is None: records = [] pre_update_recordset = recordset changed = _system_state_change(state, records, description, ttl, zone, pre_update_recordset) if changed: zone = cloud.update_recordset(zone, recordset_id, records=records, description=description, ttl=ttl) module.exit_json(changed=changed, recordset=recordset) elif state == 'absent': if module.check_mode: module.exit_json(changed=_system_state_change( state, None, None, None, None, recordset)) if recordset is None: changed = False else: cloud.delete_recordset(zone, recordset_id) changed = True module.exit_json(changed=changed) except sdk.exceptions.OpenStackCloudException as e: module.fail_json(msg=str(e))