def main(): module = AnsibleModule(argument_spec=dict( hostname=dict(required=True), username=dict(required=True), password=dict(required=True, no_log=True), settings=dict(required=False, type='dict'), parameter=dict(required=True, choices=[ 'ntp_client', 'clock', 'identity', 'logging', 'routerboard_settings' ], type='str'), state=dict(required=False, choices=['present', 'absent'], type='str'), ), supports_check_mode=True) params = module.params if params['parameter'] == 'routerboard_settings': params['parameter'] = 'routerboard/settings' if params['parameter'] == 'ntp_client': params['parameter'] = 'ntp/client' clean_params(params['settings']) mt_obj = MikrotikIdempotent(hostname=params['hostname'], username=params['username'], password=params['password'], state=params['state'], desired_params=params['settings'], idempotent_param=None, api_path='/system/' + params['parameter'], check_mode=module.check_mode) mt_obj.sync_state() if mt_obj.failed: module.fail_json(msg=mt_obj.failed_msg) elif mt_obj.changed: module.exit_json( failed=False, changed=True, msg=mt_obj.changed_msg, diff={ "prepared": { "old": mt_obj.old_params, "new": mt_obj.new_params, } }, ) else: module.exit_json( failed=False, changed=False, #msg='', msg=params['settings'], )
def main(): module = AnsibleModule(argument_spec=dict( hostname=dict(required=True), username=dict(required=True), password=dict(required=True, no_log=True), name=dict(required=False, type='str'), comment=dict(required=False, type='str'), admin_mac=dict(required=False, type='str'), auto_mac=dict(required=False, type='str'), ageing_time=dict(required=False, type='str'), forward_delay=dict(required=False, type='str'), max_message_age=dict(required=False, type='str'), transmit_hold_count=dict(required=False, type='str'), arp=dict(required=False, choices=['disabled', 'enabled', 'proxy-arp', 'reply-only'], type='str'), protocol_mode=dict(required=False, choices=['none', 'rstp', 'stp'], type='str'), settings=dict(required=False, type='dict'), state=dict(required=False, choices=['present', 'absent'], type='str'), ), supports_check_mode=True) hostname = module.params['hostname'] username = module.params['username'] password = module.params['password'] state = module.params['state'] ansible_bridge_name = module.params['name'] check_mode = module.check_mode changed = False changed_message = [] msg = "" mk = mt_api.Mikrotik(hostname, username, password) try: mk.login() except: module.fail_json(msg="Could not log into Mikrotik device." + " Check the username and password.", ) bridge_path = '/interface/bridge' response = mk.api_print(base_path=bridge_path) bridge_params = module.params mikrotik_bridge = {} for item in response: if 'name' in item[1]: if ansible_bridge_name == item[1]['name']: mikrotik_bridge = item[1] ######################################################## # Check if we need to edit the bridge settings ######################################################## if bridge_params['settings'] is not None: settings_path = '/interface/bridge/settings' settings_response = mk.api_print(settings_path) settings_response = settings_response[0][1] settings = bridge_params['settings'] bridge_settings_diff_keys = {} for key in settings: if isinstance(settings[key], bool): settings[key] = str(settings[key]) settings[key] = str.lower(settings[key]) else: if settings[key] == "yes": settings[key] = "true" if settings[key] == "no": settings[key] = "false" for key in settings: if key in settings_response: if settings[key] != settings_response[key]: bridge_settings_diff_keys[key] = settings[key] else: bridge_settings_diff_keys[key] = settings[key] if bridge_settings_diff_keys != {}: if not check_mode: mk.api_edit(base_path=settings_path, params=bridge_settings_diff_keys) changed_message.append(bridge_settings_diff_keys) changed = True else: changed = False ####################################### # remove unneeded parameters # clean up parameters ###################################### remove_params = ['hostname', 'username', 'password', 'state', 'settings'] for i in remove_params: del bridge_params[i] clean_params(bridge_params) if '.id' in mikrotik_bridge: client_id = mikrotik_bridge['.id'] else: client_id = False ################################################################## # We need to make sure that bridge_bridge name is a string # if it's null then it has not been defined. ################################################################### if (state == "present" and isinstance(ansible_bridge_name, str)): if mikrotik_bridge == {}: if not check_mode: mk.api_add(base_path=bridge_path, params=bridge_params) changed_message.append(ansible_bridge_name + " added") changed = True, else: bridge_diff_keys = {} for key in bridge_params: if key in mikrotik_bridge: if bridge_params[key] != mikrotik_bridge[key]: bridge_diff_keys[key] = bridge_params[key] else: bridge_diff_keys[key] = bridge_params[key] if bridge_diff_keys != {}: bridge_diff_keys['numbers'] = client_id if not check_mode: mk.api_edit(base_path=bridge_path, params=bridge_diff_keys) changed = True changed_message.append("Changed bridge: " + bridge_params['name']) else: #################### # Already up date ################### if not changed: changed = False elif state == "absent": if client_id: if not check_mode: mk.api_remove(base_path=bridge_path, remove_id=client_id) changed_message.append(bridge_params['name'] + " removed") changed = True ##################################################### # if client_id is not set there is nothing to remove ##################################################### else: if not changed: changed = False elif settings: ######################################################## # if settings were set we were modifying bridge settings # only pass else: module.exit_json( failed=True, changed=False, ) if changed: module.exit_json(failed=False, changed=True, msg=changed_message) else: module.exit_json( failed=False, changed=False, )
def main(): module = AnsibleModule( argument_spec=dict( hostname =dict(required=True), username =dict(required=True), password =dict(required=True), interface =dict(required=True, type='str'), bridge =dict(required=False, type='str'), comment =dict(required=False, type='str'), path_cost =dict(required=False, type='str'), priority =dict(required=False, type='str'), horizon =dict(required=False, type='str'), external_fdb=dict( required=False, choices=['yes', 'no', 'auto'], type='str' ), auto_isolate=dict( required=False, choices=['yes', 'no'], type='str' ), edge=dict( required=False, choices=['auto', 'yes', 'no', 'no-discover', 'yes-discover'], type='str' ), point_to_point=dict( required=False, choices=['yes', 'no', 'auto'], type='str' ), state=dict( required=True, choices=['present', 'absent'], type='str' ), ), supports_check_mode=True ) hostname = module.params['hostname'] username = module.params['username'] password = module.params['password'] state = module.params['state'] ansible_bridge_port_interface = module.params['interface'] changed = False changed_message = [] check_mode = module.check_mode msg = "" mk = mt_api.Mikrotik(hostname, username, password) try: mk.login() except: module.fail_json( msg="Could not log into Mikrotik device." + " Check the username and password.", ) bridge_port_path = '/interface/bridge/port' response = mk.api_print(base_path=bridge_port_path) bridge_port_params = module.params mikrotik_bridge_port = {} for item in response: if 'interface' in item[1].keys(): if ansible_bridge_port_interface == item[1]['interface']: mikrotik_bridge_port = item[1] ####################################### # remove unneeded parameters ###################################### remove_params = ['hostname', 'username', 'password', 'state'] for i in remove_params: del bridge_port_params[i] ########################################## # modify clean_params in place ############################################ clean_params(bridge_port_params) if '.id' in mikrotik_bridge_port: client_id = mikrotik_bridge_port['.id'] else: client_id = False if state == "present": if mikrotik_bridge_port == {}: if not check_mode: mk.api_add( base_path=bridge_port_path, params=bridge_port_params ) changed_message.append(ansible_bridge_port_interface + " added to bridge") changed = True, else: bridge_port_diff_keys = {} for key in bridge_port_params: if key in mikrotik_bridge_port: if bridge_port_params[key] != mikrotik_bridge_port[key]: bridge_port_diff_keys[key] = bridge_port_params[key] else: bridge_port_diff_keys[key] = bridge_port_params[key] if bridge_port_diff_keys != {}: bridge_port_diff_keys['numbers'] = client_id if not check_mode: mk.api_edit(base_path=bridge_port_path, params=bridge_port_diff_keys) changed = True changed_message.append("Changed bridge port: " + bridge_port_params['bridge']) else: #################### # Already up date ################### if not changed: changed = False elif state == "absent": if client_id: if not check_mode: mk.api_remove(base_path=bridge_port_path, remove_id=client_id) changed_message.append(bridge_port_params['interface'] + " removed") changed = True ##################################################### # if client_id is not set there is nothing to remove ##################################################### else: if not changed: changed = False else: module.exit_json( failed=True, changed=False, ) if changed: module.exit_json( failed=False, changed=True, msg=changed_message ) else: module.exit_json( failed=False, changed=False, )
def main(): module = AnsibleModule(argument_spec=dict( hostname=dict(required=True), username=dict(required=True), password=dict(required=True, no_log=True), name=dict(required=True, type='str'), on_event=dict(required=False, type='str'), comment=dict(required=False, type='str'), interval=dict(required=False, type='str'), policy=dict(required=False, type='list'), start_date=dict(required=False, type='str'), start_time=dict(required=False, type='str'), state=dict(required=True, choices=['present', 'absent'], type='str'), ), supports_check_mode=True) hostname = module.params['hostname'] username = module.params['username'] password = module.params['password'] state = module.params['state'] check_mode = module.check_mode ansible_scheduler_name = module.params['name'] changed = False changed_message = [] msg = "" mk = mt_api.Mikrotik(hostname, username, password) try: mk.login() except: module.fail_json(msg="Could not log into Mikrotik device." + " Check the username and password.", ) api_path = '/system/scheduler' response = mk.api_print(base_path=api_path) ansible_scheduler_params = module.params mikrotik_scheduler_task = {} for item in response: if 'name' in item[1]: if ansible_scheduler_name == item[1]['name']: mikrotik_scheduler_task = item[1] ####################################### # remove unneeded parameters ###################################### remove_params = ['hostname', 'username', 'password', 'state'] for i in remove_params: del ansible_scheduler_params[i] ########################################## # modify params in place ############################################ clean_params(ansible_scheduler_params) if '.id' in mikrotik_scheduler_task: client_id = mikrotik_scheduler_task['.id'] else: client_id = False if state == "present": ################################################# # Convert policy list to comma separated string ################################################# if mikrotik_scheduler_task == {}: if 'policy' in ansible_scheduler_params: list_to_string = "" list_to_string = ','.join( map(str, ansible_scheduler_params['policy'])) ansible_scheduler_params['policy'] = list_to_string if not check_mode: mk.api_add(base_path=api_path, params=ansible_scheduler_params) changed_message.append(ansible_scheduler_name + " added to bridge") changed = True, else: scheduler_diff_keys = {} ######################################################################## # policy parameter is a comma separated list of values in a string that # we receive from mikrotik # we need to convert it to a list and then do a comparison against # ansible policy list to get the difference # if there is a difference between the two we need to convert the # ansible_scheduler_params['policy'] to a string with comma separated values ######################################################################### if 'policy' in ansible_scheduler_params: dif_list = [] if 'policy' in mikrotik_scheduler_task: policy = mikrotik_scheduler_task['policy'].split(',') dif_list = set( ansible_scheduler_params['policy']) & set(policy) if dif_list == []: list_to_string = "" list_to_string = ','.join( map(str, ansible_scheduler_params['policy'])) scheduler_diff_keys['policy'] = list_to_string for key in ansible_scheduler_params: if key != 'policy': if key in mikrotik_scheduler_task: if ansible_scheduler_params[ key] != mikrotik_scheduler_task[key]: scheduler_diff_keys[ key] = ansible_scheduler_params[key] else: scheduler_diff_keys[key] = ansible_scheduler_params[ key] if scheduler_diff_keys != {}: scheduler_diff_keys['numbers'] = client_id if not check_mode: mk.api_edit(base_path=api_path, params=scheduler_diff_keys) changed = True changed_message.append("Changed scheduler task : " + ansible_scheduler_params['name']) else: #################### # Already up date ################### if not changed: changed = False elif state == "absent": if client_id: if not check_mode: mk.api_remove(base_path=api_path, remove_id=client_id) changed_message.append(ansible_scheduler_params['name'] + " removed") changed = True ##################################################### # if client_id is not set there is nothing to remove ##################################################### else: if not changed: changed = False else: module.exit_json(failed=True, changed=False, msg="state is invalid") if changed: module.exit_json(failed=False, changed=True, msg=changed_message) else: module.exit_json( failed=False, changed=False, )