def servicegroup(self, action, name, svc_type): '''Function to add or remove a service group. @param action string: add or delete. @param name string: describing the service group. @param svc_type string: HTTP, FTP, TCP, UDP, SSL, SSL_BRIDGE, SSL_TCP, DTLS, NNTP, RPCSVR, DNS, ADNS, SNMP, RTSP, DHCPRA, ANY, SIP_UDP, SIP_TCP, SIP_SSL, DNS_TCP, ADNS_TCP, MYSQL, MSSQL, ORACLE, RADIUS, RADIUSListener, RDP, DIAMETER, SSL_DIAMETER, TFTP, SMPP, PPTP, GRE, SYSLOGTCP, SYSLOGUDP ''' if not self._sess and args != None: self.__init__(args.netscaler, args.username, args.password) obj = servicegroup() obj.servicegroupname = name obj.servicetype = svc_type try: if action == 'add': servicegroup.add(self._sess, obj) elif action == 'delete': servicegroup.delete(self._sess, obj) except nitro_exception as e: print('Exception::errorcode=' + str(e.errorcode) + ',message=' + e.message) except Exception as e: print('Exception::message=' + str(e.args)) else: return True return False
def _create_service_group(self, grpname, service_type="HTTP"): try: svc_grp = servicegroup.get(self.ns_session, grpname) if (svc_grp.servicegroupname == grpname): logger.info("Service group %s already configured " % grpname) return except nitro_exception: pass svc_grp = servicegroup() svc_grp.servicegroupname = grpname svc_grp.servicetype = service_type servicegroup.add(self.ns_session, svc_grp)
def unset_bulk_service(self, client): try: arr = ["cmp", "cacheable", "usip", "healthmonitor"] servicegroup1 = [servicegroup() for _ in range(0, 5)] for i in range(0, 5): servicegroup1[i].servicegroupname = "sg_" + str(i) servicegroup.unset(client, servicegroup1, arr) print("unset_bulk_service - DONE") except nitro_exception as e: print("Exception::unset_bulk_service::rc=" + str(e.errorcode) + " ,Message =" + e.message) except Exception as e: print("Exception::unset_bulk_service::message=" + str(e.args))
def _create_service_group(self, grpname): try: svc_grp = servicegroup.get(self.ns_session, grpname) if (svc_grp.servicegroupname == grpname): logger.info("Service group %s already configured " % grpname) return except nitro_exception as e: pass svc_grp = servicegroup() svc_grp.servicegroupname = grpname svc_grp.servicetype = "HTTP" servicegroup.add(self.ns_session, svc_grp)
def call_nitro_commands(ns_session): try: ns_session.clear_config(force=True, level='full') logging.debug('Clear config executed') needed_features = [ nsfeature.Feature.CS, nsfeature.Feature.LB, nsfeature.Feature.SSL, nsfeature.Feature.RESPONDER, nsfeature.Feature.REWRITE ] ns_session.enable_features(needed_features) logging.debug('Adding CS vserver') csvserver_instance = csvserver() csvserver_instance.name = 'drinks_sample' csvserver_instance.ipv46 = '127.0.0.1' csvserver_instance.servicetype = 'http' csvserver_instance.port = '443' csvserver_instance.add(ns_session, csvserver_instance) logging.debug('Adding LB vserver') lbvserver_instance = lbvserver() lbvserver_instance.name = 'lbvs_hotdrink_http_example' lbvserver_instance.ipv46 = '0.0.0.0' lbvserver_instance.port = 0 lbvserver_instance.servicetype = 'http' lbvserver_instance.add(ns_session, lbvserver_instance) logging.debug('Adding servicegroup') servicegroup_instance = servicegroup() servicegroup_instance.servicegroupname = 'sg_hotdrink_http_example' servicegroup_instance.servicetype = 'http' servicegroup_instance.add(ns_session, servicegroup_instance) logging.debug('Adding servieegroup binding') servicegroup_servicegroupmember_binding_instance = servicegroup_servicegroupmember_binding( ) servicegroup_servicegroupmember_binding_instance.servicegroupname = 'sg_hotdrink_http_example' servicegroup_servicegroupmember_binding_instance.ip = '172.100.100.3' servicegroup_servicegroupmember_binding_instance.port = 80 servicegroup_servicegroupmember_binding_instance.add( ns_session, servicegroup_servicegroupmember_binding_instance) logging.debug('Adding servicegroup lb vserver binding') lbvserver_servicegroup_binding_instance = lbvserver_servicegroup_binding( ) lbvserver_servicegroup_binding_instance.name = 'lbvs_hotdrink_http_example' lbvserver_servicegroup_binding_instance.servicegroupname = 'sg_hotdrink_http_example' lbvserver_servicegroup_binding_instance.add( ns_session, lbvserver_servicegroup_binding_instance) logging.debug('SUCCESS: Configuration completed') except Exception as e: logging.error('FAILURE: Error during configuration: {}'.format( e.message))
def bind_servicegroup_server (self, client) : try : grp = servicegroup() grp.servicegroupname = "svcgrp1" grp.servicetype = servicegroup.Servicetype.HTTP servicegroup.add(client, grp) obj = servicegroup_servicegroupmember_binding() obj.servicegroupname = "svcgrp1" obj.ip = "1.1.2.79" obj.port = 77 servicegroup_servicegroupmember_binding.add(client, obj) print("bind_servicegroup_server - Done") except nitro_exception as e : print("Exception::bind_servicegroup_server::errorcode="+str(e.errorcode)+",message="+ e.message) except Exception as e: print("Exception::bind_servicegroup_server::message="+str(e.args))
def main(): module_specific_arguments = dict( servicegroupname=dict(type='str'), servicetype=dict(type='str', choices=[ 'HTTP', 'FTP', 'TCP', 'UDP', 'SSL', 'SSL_BRIDGE', 'SSL_TCP', 'DTLS', 'NNTP', 'RPCSVR', 'DNS', 'ADNS', 'SNMP', 'RTSP', 'DHCPRA', 'ANY', 'SIP_UDP', 'SIP_TCP', 'SIP_SSL', 'DNS_TCP', 'ADNS_TCP', 'MYSQL', 'MSSQL', 'ORACLE', 'RADIUS', 'RADIUSListener', 'RDP', 'DIAMETER', 'SSL_DIAMETER', 'TFTP', 'SMPP', 'PPTP', 'GRE', 'SYSLOGTCP', 'SYSLOGUDP', 'FIX', 'SSL_FIX', ]), cachetype=dict(type='str', choices=[ 'TRANSPARENT', 'REVERSE', 'FORWARD', ]), maxclient=dict(type='float'), maxreq=dict(type='float'), cacheable=dict(type='bool'), cip=dict(type='str', choices=[ 'enabled', 'disabled', ]), cipheader=dict(type='str'), usip=dict(type='bool'), pathmonitor=dict(type='bool'), pathmonitorindv=dict(type='bool'), useproxyport=dict(type='bool'), healthmonitor=dict(type='bool'), sp=dict(type='bool'), rtspsessionidremap=dict(type='bool'), clttimeout=dict(type='float'), svrtimeout=dict(type='float'), cka=dict(type='bool'), tcpb=dict(type='bool'), cmp=dict(type='bool'), maxbandwidth=dict(type='float'), monthreshold=dict(type='float'), downstateflush=dict(type='str', choices=[ 'enabled', 'disabled', ]), tcpprofilename=dict(type='str'), httpprofilename=dict(type='str'), comment=dict(type='str'), appflowlog=dict(type='str', choices=[ 'enabled', 'disabled', ]), netprofile=dict(type='str'), autoscale=dict(type='str', choices=[ 'DISABLED', 'DNS', 'POLICY', ]), memberport=dict(type='int'), graceful=dict(type='bool'), ) hand_inserted_arguments = dict( servicemembers=dict(type='list'), monitorbindings=dict(type='list'), disabled=dict( type='bool', default=False, ), ) argument_spec = dict() argument_spec.update(netscaler_common_arguments) argument_spec.update(module_specific_arguments) argument_spec.update(hand_inserted_arguments) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, ) module_result = dict( changed=False, failed=False, loglines=loglines, ) # Fail the module if imports failed if not PYTHON_SDK_IMPORTED: module.fail_json(msg='Could not load nitro python sdk') # Fallthrough to rest of execution client = get_nitro_client(module) try: client.login() except nitro_exception as e: msg = "nitro exception during login. errorcode=%s, message=%s" % (str( e.errorcode), e.message) module.fail_json(msg=msg) except Exception as e: if str(type(e)) == "<class 'requests.exceptions.ConnectionError'>": module.fail_json(msg='Connection error %s' % str(e)) elif str(type(e)) == "<class 'requests.exceptions.SSLError'>": module.fail_json(msg='SSL Error %s' % str(e)) else: module.fail_json(msg='Unexpected error during login %s' % str(e)) # Instantiate service group configuration object readwrite_attrs = [ 'servicegroupname', 'servicetype', 'cachetype', 'maxclient', 'maxreq', 'cacheable', 'cip', 'cipheader', 'usip', 'pathmonitor', 'pathmonitorindv', 'useproxyport', 'healthmonitor', 'sp', 'rtspsessionidremap', 'clttimeout', 'svrtimeout', 'cka', 'tcpb', 'cmp', 'maxbandwidth', 'monthreshold', 'downstateflush', 'tcpprofilename', 'httpprofilename', 'comment', 'appflowlog', 'netprofile', 'autoscale', 'memberport', 'graceful', ] readonly_attrs = [ 'numofconnections', 'serviceconftype', 'value', 'svrstate', 'ip', 'monstatcode', 'monstatparam1', 'monstatparam2', 'monstatparam3', 'statechangetimemsec', 'stateupdatereason', 'clmonowner', 'clmonview', 'groupcount', 'riseapbrstatsmsgcode2', 'serviceipstr', 'servicegroupeffectivestate' ] immutable_attrs = [ 'servicegroupname', 'servicetype', 'cachetype', 'td', 'cipheader', 'state', 'autoscale', 'memberport', 'servername', 'port', 'serverid', 'monitor_name_svc', 'dup_weight', 'riseapbrstatsmsgcode', 'delay', 'graceful', 'includemembers', 'newname', ] transforms = { 'pathmonitorindv': ['bool_yes_no'], 'cacheable': ['bool_yes_no'], 'cka': ['bool_yes_no'], 'pathmonitor': ['bool_yes_no'], 'tcpb': ['bool_yes_no'], 'sp': ['bool_on_off'], 'usip': ['bool_yes_no'], 'healthmonitor': ['bool_yes_no'], 'useproxyport': ['bool_yes_no'], 'rtspsessionidremap': ['bool_on_off'], 'graceful': ['bool_yes_no'], 'cmp': ['bool_yes_no'], 'cip': [lambda v: v.upper()], 'downstateflush': [lambda v: v.upper()], 'appflowlog': [lambda v: v.upper()], } # Instantiate config proxy servicegroup_proxy = ConfigProxy( actual=servicegroup(), client=client, attribute_values_dict=module.params, readwrite_attrs=readwrite_attrs, readonly_attrs=readonly_attrs, immutable_attrs=immutable_attrs, transforms=transforms, ) try: if module.params['state'] == 'present': log('Applying actions for state present') if not servicegroup_exists(client, module): if not module.check_mode: log('Adding service group') servicegroup_proxy.add() if module.params['save_config']: client.save_config() module_result['changed'] = True elif not servicegroup_identical(client, module, servicegroup_proxy): # Check if we try to change value of immutable attributes diff_dict = diff(client, module, servicegroup_proxy) immutables_changed = get_immutables_intersection( servicegroup_proxy, diff_dict.keys()) if immutables_changed != []: msg = 'Cannot update immutable attributes %s. Must delete and recreate entity.' % ( immutables_changed, ) module.fail_json(msg=msg, diff=diff_dict, **module_result) if not module.check_mode: servicegroup_proxy.update() if module.params['save_config']: client.save_config() module_result['changed'] = True else: module_result['changed'] = False # Check bindings if not monitor_bindings_identical(client, module): if not module.check_mode: sync_monitor_bindings(client, module) if module.params['save_config']: client.save_config() module_result['changed'] = True if not servicemembers_identical(client, module): if not module.check_mode: sync_service_members(client, module) if module.params['save_config']: client.save_config() module_result['changed'] = True if not module.check_mode: res = do_state_change(client, module, servicegroup_proxy) if res.errorcode != 0: msg = 'Error when setting disabled state. errorcode: %s message: %s' % ( res.errorcode, res.message) module.fail_json(msg=msg, **module_result) # Sanity check for state if not module.check_mode: log('Sanity checks for state present') if not servicegroup_exists(client, module): module.fail_json(msg='Service group is not present', **module_result) if not servicegroup_identical(client, module, servicegroup_proxy): module.fail_json( msg='Service group is not identical to configuration', diff=diff(client, module, servicegroup_proxy), **module_result) if not servicemembers_identical(client, module): module.fail_json( msg='Service group members differ from configuration', **module_result) if not monitor_bindings_identical(client, module): module.fail_json(msg='Monitor bindings are not identical', **module_result) elif module.params['state'] == 'absent': log('Applying actions for state absent') if servicegroup_exists(client, module): if not module.check_mode: servicegroup_proxy.delete() if module.params['save_config']: client.save_config() module_result['changed'] = True else: module_result['changed'] = False # Sanity check for state if not module.check_mode: log('Sanity checks for state absent') if servicegroup_exists(client, module): module.fail_json(msg='Service group is present', **module_result) except nitro_exception as e: msg = "nitro exception errorcode=" + str( e.errorcode) + ",message=" + e.message module.fail_json(msg=msg, **module_result) client.logout() module.exit_json(**module_result)
def main(): from ansible.module_utils.netscaler import ConfigProxy, get_nitro_client, netscaler_common_arguments, log, loglines try: from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup import servicegroup from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup_servicegroupmember_binding import servicegroup_servicegroupmember_binding from nssrc.com.citrix.netscaler.nitro.exception.nitro_exception import nitro_exception from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup_lbmonitor_binding import servicegroup_lbmonitor_binding from nssrc.com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding import lbmonitor_servicegroup_binding python_sdk_imported = True except ImportError as e: python_sdk_imported = False module_specific_arguments = dict( servicegroupname=dict(type='str'), servicetype=dict( type='str', choices=[ u'HTTP', u'FTP', u'TCP', u'UDP', u'SSL', u'SSL_BRIDGE', u'SSL_TCP', u'DTLS', u'NNTP', u'RPCSVR', u'DNS', u'ADNS', u'SNMP', u'RTSP', u'DHCPRA', u'ANY', u'SIP_UDP', u'SIP_TCP', u'SIP_SSL', u'DNS_TCP', u'ADNS_TCP', u'MYSQL', u'MSSQL', u'ORACLE', u'RADIUS', u'RADIUSListener', u'RDP', u'DIAMETER', u'SSL_DIAMETER', u'TFTP', u'SMPP', u'PPTP', u'GRE', u'SYSLOGTCP', u'SYSLOGUDP', u'FIX', u'SSL_FIX' ]), cachetype=dict(type='str', choices=[u'TRANSPARENT', u'REVERSE', u'FORWARD']), maxclient=dict(type='float'), maxreq=dict(type='float'), cacheable=dict(type='str', choices=[u'YES', u'NO']), cip=dict(type='str', choices=[u'ENABLED', u'DISABLED']), cipheader=dict(type='str'), usip=dict(type='str', choices=[u'YES', u'NO']), pathmonitor=dict(type='str', choices=[u'YES', u'NO']), pathmonitorindv=dict(type='str', choices=[u'YES', u'NO']), useproxyport=dict(type='str', choices=[u'YES', u'NO']), healthmonitor=dict(type='str', choices=[u'YES', u'NO']), sc=dict(type='str', choices=[u'ON', u'OFF']), sp=dict(type='str', choices=[u'ON', u'OFF']), rtspsessionidremap=dict(type='str', choices=[u'ON', u'OFF']), clttimeout=dict(type='float'), svrtimeout=dict(type='float'), cka=dict(type='str', choices=[u'YES', u'NO']), tcpb=dict(type='str', choices=[u'YES', u'NO']), cmp=dict(type='str', choices=[u'YES', u'NO']), maxbandwidth=dict(type='float'), monthreshold=dict(type='float'), state=dict(type='str', choices=[u'ENABLED', u'DISABLED']), downstateflush=dict(type='str', choices=[u'ENABLED', u'DISABLED']), tcpprofilename=dict(type='str'), httpprofilename=dict(type='str'), comment=dict(type='str'), appflowlog=dict(type='str', choices=[u'ENABLED', u'DISABLED']), netprofile=dict(type='str'), autoscale=dict(type='str', choices=[u'DISABLED', u'DNS', u'POLICY']), memberport=dict(type='int'), graceful=dict(type='str', choices=[u'YES', u'NO']), ) hand_inserted_arguments = dict( servicemembers=dict(type='list'), monitorbindings=dict(type='list'), ) argument_spec = dict() argument_spec.update(netscaler_common_arguments) argument_spec.update(module_specific_arguments) argument_spec.update(hand_inserted_arguments) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, ) module_result = dict( changed=False, failed=False, loglines=loglines, ) # Fail the module if imports failed if not python_sdk_imported: module.fail_json(msg='Could not load nitro python sdk') # Fallthrough to rest of execution client = get_nitro_client(module) client.login() # Instantiate service group configuration object readwrite_attrs = [ 'servicegroupname', 'servicetype', 'cachetype', 'maxclient', 'maxreq', 'cacheable', 'cip', 'cipheader', 'usip', 'pathmonitor', 'pathmonitorindv', 'useproxyport', 'healthmonitor', 'sc', 'sp', 'rtspsessionidremap', 'clttimeout', 'svrtimeout', 'cka', 'tcpb', 'cmp', 'maxbandwidth', 'monthreshold', 'state', 'downstateflush', 'tcpprofilename', 'httpprofilename', 'comment', 'appflowlog', 'netprofile', 'autoscale', 'memberport', 'graceful', ] readonly_attrs = [ 'numofconnections', 'serviceconftype', 'value', 'svrstate', 'ip', 'monstatcode', 'monstatparam1', 'monstatparam2', 'monstatparam3', 'statechangetimemsec', 'stateupdatereason', 'clmonowner', 'clmonview', 'groupcount', 'riseapbrstatsmsgcode2', 'serviceipstr', 'servicegroupeffectivestate' ] servicegroup_proxy = ConfigProxy(actual=servicegroup(), client=client, attribute_values_dict=module.params, readwrite_attrs=readwrite_attrs, readonly_attrs=readonly_attrs) def service_group_exists(): log('service_group_exists') if servicegroup.count_filtered( client, 'servicegroupname:%s' % module.params['servicegroupname']) > 0: return True else: return False def service_group_identical(): log('service_group_identical') servicegroups = servicegroup.get_filtered( client, 'servicegroupname:%s' % module.params['servicegroupname']) if servicegroup_proxy.has_equal_attributes(servicegroups[0]): return True else: return False def get_servicegroups_from_module_params(): log('get_servicegroups_from_module_params') readwrite_attrs = [ u'servicegroupname', u'ip', u'port', u'state', u'hashid', u'serverid', u'servername', u'customserverid', u'weight' ] readonly_attrs = [ u'delay', u'statechangetimesec', u'svrstate', u'tickssincelaststatechange', u'graceful', u'__count' ] members = [] if module.params['servicemembers'] is None: return members for config in module.params['servicemembers']: # Make a copy to update config = copy.deepcopy(config) config['servicegroupname'] = module.params['servicegroupname'] member_proxy = ConfigProxy( actual=servicegroup_servicegroupmember_binding(), client=client, attribute_values_dict=config, readwrite_attrs=readwrite_attrs, readonly_attrs=readonly_attrs) members.append(member_proxy) return members def service_group_servicemembers_identical(): log('service_group_servicemembers_identical') service_group_members = servicegroup_servicegroupmember_binding.get( client, module.params['servicegroupname']) module_service_groups = get_servicegroups_from_module_params() log('Number of service group members %s' % len(service_group_members)) if len(service_group_members) != len(module_service_groups): return False # Fallthrough to member evaluation identical_count = 0 for actual_member in service_group_members: for member in module_service_groups: if member.has_equal_attributes(actual_member): identical_count += 1 break if identical_count != len(service_group_members): return False # Fallthrough to success return True def delete_all_servicegroup_members(): log('delete_all_servicegroup_members') if servicegroup_servicegroupmember_binding.count( client, module.params['servicegroupname']) == 0: return service_group_members = servicegroup_servicegroupmember_binding.get( client, module.params['servicegroupname']) log('len %s' % len(service_group_members)) log('count %s' % servicegroup_servicegroupmember_binding.count( client, module.params['servicegroupname'])) for member in service_group_members: log('%s' % dir(member)) log('ip %s' % member.ip) log('servername %s' % member.servername) if all([ hasattr(member, 'ip'), member.ip is not None, hasattr(member, 'servername'), member.servername is not None, ]): member.ip = None member.servicegroupname = module.params['servicegroupname'] servicegroup_servicegroupmember_binding.delete(client, member) def add_all_servicegroup_members(): log('add_all_servicegroup_members') for member in get_servicegroups_from_module_params(): member.add() def get_configured_monitor_bindings(): log('Entering get_configured_monitor_bindings') bindings = {} if 'monitorbindings' in module.params and module.params[ 'monitorbindings'] is not None: for binding in module.params['monitorbindings']: readwrite_attrs = [ 'monitorname', 'servicegroupname', ] readonly_attrs = [] if isinstance(binding, dict): attribute_values_dict = copy.deepcopy(binding) else: attribute_values_dict = {'monitorname': binding} attribute_values_dict['servicegroupname'] = module.params[ 'servicegroupname'] binding_proxy = ConfigProxy( actual=lbmonitor_servicegroup_binding(), client=client, attribute_values_dict=attribute_values_dict, readwrite_attrs=readwrite_attrs, readonly_attrs=readonly_attrs, ) key = attribute_values_dict['monitorname'] bindings[key] = binding_proxy return bindings def get_actual_monitor_bindings(): log('Entering get_actual_monitor_bindings') bindings = {} if servicegroup_lbmonitor_binding.count( client, module.params['servicegroupname']) == 0: return bindings # Fallthrough to rest of execution for binding in servicegroup_lbmonitor_binding.get( client, module.params['servicegroupname']): log('Gettign actual monitor with name %s' % binding.monitor_name) key = binding.monitor_name bindings[key] = binding return bindings def monitor_bindings_identical(): log('Entering monitor_bindings_identical') configured_bindings = get_configured_monitor_bindings() actual_bindings = get_actual_monitor_bindings() configured_key_set = set(configured_bindings.keys()) actual_key_set = set(actual_bindings.keys()) symmetrical_diff = configured_key_set ^ actual_key_set for default_monitor in ('tcp-default', 'ping-default'): if default_monitor in symmetrical_diff: log('Excluding %s monitor from key comparison' % default_monitor) symmetrical_diff.remove(default_monitor) if len(symmetrical_diff) > 0: return False # Compare key to key for key in configured_key_set: configured_proxy = configured_bindings[key] if any([ configured_proxy.monitorname != actual_bindings[key].monitor_name, configured_proxy.servicegroupname != actual_bindings[key].servicegroupname ]): return False # Fallthrought to success return True def sync_monitor_bindings(): log('Entering sync_monitor_bindings') # Delete existing bindings for binding in get_actual_monitor_bindings().values(): b = lbmonitor_servicegroup_binding() b.monitorname = binding.monitor_name b.servicegroupname = module.params['servicegroupname'] # Cannot remove default monitor bindings if b.monitorname in ('tcp-default', 'ping-default'): continue lbmonitor_servicegroup_binding.delete(client, b) continue binding.monitorname = binding.monitor_name log('Will delete %s' % dir(binding)) log('Name %s' % binding.name) log('monitor Name %s' % binding.monitor_name) binding.delete(client, binding) #service_lbmonitor_binding.delete(client, binding) # Apply configured bindings for binding in get_configured_monitor_bindings().values(): binding.add() try: if module.params['operation'] == 'present': log('Checking present') if not service_group_exists(): if not module.check_mode: log('Adding service group') servicegroup_proxy.add() servicegroup_proxy.update() client.save_config() #log('Updating service group') #servicegroup_proxy.update() #client.save_config() module_result['changed'] = True elif not service_group_identical(): if not module.check_mode: servicegroup_proxy.update() client.save_config() module_result['changed'] = True else: module_result['changed'] = False # Check bindings if not monitor_bindings_identical(): if not module.check_mode: sync_monitor_bindings() client.save_config() module_result['changed'] = True if not service_group_servicemembers_identical(): if not module.check_mode: delete_all_servicegroup_members() add_all_servicegroup_members() client.save_config() module_result['changed'] = True # Sanity check for operation log('sanity check') if not service_group_exists(): module.fail_json(msg='Service group is not present', **module_result) if not service_group_identical(): module.fail_json( msg='Service group is not identical to configuration', **module_result) if not service_group_servicemembers_identical(): module.fail_json( msg='Service group members differ from configuration', **module_result) if not monitor_bindings_identical(): module.fail_json(msg='Monitor bindings are not identical', **module_result) elif module.params['operation'] == 'absent': if service_group_exists(): if not module.check_mode: servicegroup_proxy.delete() client.save_config() module_result['changed'] = True else: module_result['changed'] = False # Sanity check for operation if service_group_exists(): module.fail_json(msg='Service group is present', **module_result) module_result['configured_servicegroup'] = {} module_result['configured_servicegroup'][ 'actual_rw_attributes'] = servicegroup_proxy.get_actual_rw_attributes( filter='servicegroupname') module_result['configured_servicegroup'][ 'actual_ro_attributes'] = servicegroup_proxy.get_actual_ro_attributes( filter='servicegroupname') module_result['configured_servicegroup'][ 'missing_rw_attributes'] = list( set(readwrite_attrs) - set(module_result['configured_servicegroup'] ['actual_rw_attributes'].keys())) module_result['configured_servicegroup'][ 'missing_ro_attributes'] = list( set(readonly_attrs) - set(module_result['configured_servicegroup'] ['actual_ro_attributes'].keys())) except nitro_exception as e: msg = "nitro exception errorcode=" + str( e.errorcode) + ",message=" + e.message module.fail_json(msg=msg, **module_result) client.logout() module.exit_json(**module_result)
def main(): from ansible.module_utils.netscaler import ConfigProxy, get_nitro_client, netscaler_common_arguments, log, loglines try: from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup import servicegroup from nssrc.com.citrix.netscaler.nitro.resource.config.basic.servicegroup_servicegroupmember_binding import servicegroup_servicegroupmember_binding from nssrc.com.citrix.netscaler.nitro.exception.nitro_exception import nitro_exception python_sdk_imported = True except ImportError as e: python_sdk_imported = False module_specific_arguments = dict( servicegroupname=dict(type='str', ), servicetype=dict( type='str', choices=[ u'HTTP', u'FTP', u'TCP', u'UDP', u'SSL', u'SSL_BRIDGE', u'SSL_TCP', u'DTLS', u'NNTP', u'RPCSVR', u'DNS', u'ADNS', u'SNMP', u'RTSP', u'DHCPRA', u'ANY', u'SIP_UDP', u'SIP_TCP', u'SIP_SSL', u'DNS_TCP', u'ADNS_TCP', u'MYSQL', u'MSSQL', u'ORACLE', u'RADIUS', u'RADIUSListener', u'RDP', u'DIAMETER', u'SSL_DIAMETER', u'TFTP', u'SMPP', u'PPTP', u'GRE', u'SYSLOGTCP', u'SYSLOGUDP', u'FIX', u'SSL_FIX' ]), cachetype=dict(type='str', choices=[u'TRANSPARENT', u'REVERSE', u'FORWARD']), td=dict(type='float', ), maxclient=dict(type='float', ), maxreq=dict(type='float', ), cacheable=dict(type='str', choices=[u'YES', u'NO']), cip=dict(type='str', choices=[u'ENABLED', u'DISABLED']), cipheader=dict(type='str', ), usip=dict(type='str', choices=[u'YES', u'NO']), pathmonitor=dict(type='str', choices=[u'YES', u'NO']), pathmonitorindv=dict(type='str', choices=[u'YES', u'NO']), useproxyport=dict(type='str', choices=[u'YES', u'NO']), healthmonitor=dict(type='str', choices=[u'YES', u'NO']), sc=dict(type='str', choices=[u'ON', u'OFF']), sp=dict(type='str', choices=[u'ON', u'OFF']), rtspsessionidremap=dict(type='str', choices=[u'ON', u'OFF']), clttimeout=dict(type='float', ), svrtimeout=dict(type='float', ), cka=dict(type='str', choices=[u'YES', u'NO']), tcpb=dict(type='str', choices=[u'YES', u'NO']), cmp=dict(type='str', choices=[u'YES', u'NO']), maxbandwidth=dict(type='float', ), monthreshold=dict(type='float', ), state=dict(type='str', choices=[u'ENABLED', u'DISABLED']), downstateflush=dict(type='str', choices=[u'ENABLED', u'DISABLED']), tcpprofilename=dict(type='str', ), httpprofilename=dict(type='str', ), comment=dict(type='str', ), appflowlog=dict(type='str', choices=[u'ENABLED', u'DISABLED']), netprofile=dict(type='str', ), autoscale=dict(type='str', choices=[u'DISABLED', u'DNS', u'POLICY']), memberport=dict(type='int', ), servername=dict(type='str', ), port=dict(type='int', ), weight=dict(type='float', ), customserverid=dict(type='str', ), serverid=dict(type='float', ), hashid=dict(type='float', ), monitor_name_svc=dict(type='str', ), dup_weight=dict(type='float', ), riseapbrstatsmsgcode=dict(type='int', ), delay=dict(type='float', ), graceful=dict(type='str', choices=[u'YES', u'NO']), includemembers=dict(type='bool', ), newname=dict(type='str', ), # These are hand inserted servicemembers=dict(type='list'), ) argument_spec = dict() argument_spec.update(netscaler_common_arguments) argument_spec.update(module_specific_arguments) module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, ) module_result = dict( changed=False, failed=False, ) # Fail the module if imports failed if not python_sdk_imported: module.fail_json(msg='Could not load nitro python sdk') # Fallthrough to rest of execution client = get_nitro_client(module) client.login() # Instantiate service group configuration object readwrite_attrs = [ u'servicegroupname', u'servicetype', u'cachetype', u'td', u'maxclient', u'maxreq', u'cacheable', u'cip', u'cipheader', u'usip', u'pathmonitor', u'pathmonitorindv', u'useproxyport', u'healthmonitor', u'sc', u'sp', u'rtspsessionidremap', u'clttimeout', u'svrtimeout', u'cka', u'tcpb', u'cmp', u'maxbandwidth', u'monthreshold', u'state', u'downstateflush', u'tcpprofilename', u'httpprofilename', u'comment', u'appflowlog', u'netprofile', u'autoscale', u'memberport', u'monconnectionclose', u'servername', u'port', u'weight', u'customserverid', u'serverid', u'hashid', u'monitor_name_svc', u'dup_weight', u'riseapbrstatsmsgcode', u'delay', u'graceful', u'includemembers', u'newname' ] readonly_attrs = [ u'numofconnections', u'serviceconftype', u'value', u'svrstate', u'ip', u'monstatcode', u'monstatparam1', u'monstatparam2', u'monstatparam3', u'statechangetimemsec', u'stateupdatereason', u'clmonowner', u'clmonview', u'groupcount', u'riseapbrstatsmsgcode2', u'serviceipstr', u'servicegroupeffectivestate', u'__count' ] servicegroup_proxy = ConfigProxy(actual=servicegroup(), client=client, attribute_values_dict=module.params, readwrite_attrs=readwrite_attrs, readonly_attrs=readonly_attrs) def service_group_exists(): log('service_group_exists') if servicegroup.count_filtered( client, 'servicegroupname:%s' % module.params['servicegroupname']) > 0: return True else: return False def service_group_identical(): log('service_group_identical') servicegroups = servicegroup.get_filtered( client, 'servicegroupname:%s' % module.params['servicegroupname']) if servicegroup_proxy.has_equal_attributes(servicegroups[0]): return True else: return False def get_servicegroups_from_module_params(): log('get_servicegroups_from_module_params') readwrite_attrs = [ u'servicegroupname', u'ip', u'port', u'state', u'hashid', u'serverid', u'servername', u'customserverid', u'weight' ] readonly_attrs = [ u'delay', u'statechangetimesec', u'svrstate', u'tickssincelaststatechange', u'graceful', u'__count' ] members = [] for config in module.params['servicemembers']: # Make a copy to update config = copy.deepcopy(config) config['servicegroupname'] = module.params['servicegroupname'] member_proxy = ConfigProxy( actual=servicegroup_servicegroupmember_binding(), client=client, attribute_values_dict=config, readwrite_attrs=readwrite_attrs, readonly_attrs=readonly_attrs) members.append(member_proxy) return members def service_group_servicemembers_identical(): log('service_group_servicemembers_identical') service_group_members = servicegroup_servicegroupmember_binding.get( client, module.params['servicegroupname']) module_service_groups = get_servicegroups_from_module_params() log('Number of service group members %s' % len(service_group_members)) if len(service_group_members) != len(module_service_groups): return False # Fallthrough to member evaluation identical_count = 0 for actual_member in service_group_members: for member in module_service_groups: if member.has_equal_attributes(actual_member): identical_count += 1 break if identical_count != len(service_group_members): return False # Fallthrough to success return True def delete_all_servicegroup_members(): log('delete_all_servicegroup_members') if servicegroup_servicegroupmember_binding.count( client, module.params['servicegroupname']) == 0: return service_group_members = servicegroup_servicegroupmember_binding.get( client, module.params['servicegroupname']) log('len %s' % len(service_group_members)) log('count %s' % servicegroup_servicegroupmember_binding.count( client, module.params['servicegroupname'])) for member in service_group_members: log('%s' % dir(member)) log('ip %s' % member.ip) log('servername %s' % member.servername) if all([ hasattr(member, 'ip'), member.ip is not None, hasattr(member, 'servername'), member.servername is not None, ]): member.ip = None member.servicegroupname = module.params['servicegroupname'] servicegroup_servicegroupmember_binding.delete(client, member) def add_all_servicegroup_members(): log('add_all_servicegroup_members') for member in get_servicegroups_from_module_params(): member.add() try: if module.params['operation'] == 'present': log('Checking present') if not service_group_exists(): if not module.check_mode: servicegroup_proxy.add() client.save_config() module_result['changed'] = True elif not service_group_identical(): if not module.check_mode: servicegroup_proxy.update() client.save_config() module_result['changed'] = True if not service_group_servicemembers_identical(): if not module.check_mode: delete_all_servicegroup_members() add_all_servicegroup_members() client.save_config() module_result['changed'] = True # Sanity check for operation log('sanity check') if not service_group_exists(): module.fail_json(msg='Service group is not present', loglines=loglines) if not service_group_identical(): module.fail_json( msg='Service group is not identical to configuration', loglines=loglines) if not service_group_servicemembers_identical(): module.fail_json( msg='Service group members differ from configuration', loglines=loglines) elif module.params['operation'] == 'absent': if service_group_exists(): if not module.check_mode: servicegroup_proxy.delete() client.save_config() module_result['changed'] = True else: module_result['changed'] = False # Sanity check for operation if service_group_exists(): module.fail_json(msg='Service group is present') except nitro_exception as e: msg = "nitro exception errorcode=" + str( e.errorcode) + ",message=" + e.message module.fail_json(msg=msg, loglines=loglines) client.logout() module.exit_json(loglines=loglines, **module_result)