Ejemplo n.º 1
0
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,
        )
Ejemplo n.º 3
0
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,
        )