Пример #1
0
def main():
    """
    Main entry point for module execution
    """
    argument_spec = dict(
        netbox_url=dict(type="str", required=True),
        netbox_token=dict(type="str", required=True, no_log=True),
        data=dict(type="dict", required=True),
        state=dict(required=False,
                   default="present",
                   choices=["present", "absent"]),
        first_available=dict(type="bool", required=False, default=False),
        validate_certs=dict(type="bool", default=True),
    )

    global module
    module = AnsibleModule(argument_spec=argument_spec,
                           supports_check_mode=True)

    # Fail module if pynetbox is not installed
    if not HAS_PYNETBOX:
        module.fail_json(msg=missing_required_lib('pynetbox'),
                         exception=PYNETBOX_IMP_ERR)

    # Assign variables to be used with module
    app = "ipam"
    endpoint = "prefixes"
    url = module.params["netbox_url"]
    token = module.params["netbox_token"]
    data = module.params["data"]
    state = module.params["state"]
    first_available = module.params["first_available"]
    validate_certs = module.params["validate_certs"]

    # Attempt to create Netbox API object
    try:
        nb = pynetbox.api(url, token=token, ssl_verify=validate_certs)
    except Exception:
        module.fail_json(msg="Failed to establish connection to Netbox API")
    try:
        nb_app = getattr(nb, app)
    except AttributeError:
        module.fail_json(msg="Incorrect application specified: %s" % (app))
    nb_endpoint = getattr(nb_app, endpoint)
    norm_data = normalize_data(data)
    try:
        norm_data = _check_and_adapt_data(nb, norm_data)
        if "present" in state:
            return module.exit_json(**ensure_prefix_present(
                nb, nb_endpoint, norm_data, first_available))
        else:
            return module.exit_json(
                **ensure_prefix_absent(nb, nb_endpoint, norm_data))
    except pynetbox.RequestError as e:
        return module.fail_json(msg=json.loads(e.error))
    except ValueError as e:
        return module.fail_json(msg=str(e))
    except AttributeError as e:
        return module.fail_json(msg=str(e))
Пример #2
0
def main():
    '''
    Main entry point for module execution
    '''
    argument_spec = dict(netbox_url=dict(type="str", required=True),
                         netbox_token=dict(type="str",
                                           required=True,
                                           no_log=True),
                         data=dict(type="dict", required=True),
                         state=dict(required=False,
                                    default='present',
                                    choices=['present', 'absent', 'new']),
                         validate_certs=dict(type="bool", default=True))

    module = AnsibleModule(argument_spec=argument_spec,
                           supports_check_mode=False)

    # Fail module if pynetbox is not installed
    if not HAS_PYNETBOX:
        module.fail_json(msg=missing_required_lib('pynetbox'),
                         exception=PYNETBOX_IMP_ERR)

    # Assign variables to be used with module
    changed = False
    app = 'ipam'
    endpoint = 'ip_addresses'
    url = module.params["netbox_url"]
    token = module.params["netbox_token"]
    data = module.params["data"]
    state = module.params["state"]
    validate_certs = module.params["validate_certs"]

    # Attempt to create Netbox API object
    try:
        nb = pynetbox.api(url, token=token, ssl_verify=validate_certs)
    except Exception:
        module.fail_json(msg="Failed to establish connection to Netbox API")
    try:
        nb_app = getattr(nb, app)
    except AttributeError:
        module.fail_json(msg="Incorrect application specified: %s" % (app))

    nb_endpoint = getattr(nb_app, endpoint)
    norm_data = normalize_data(data)
    try:
        norm_data = _check_and_adapt_data(nb, norm_data)
        if state in ("new", "present"):
            return _handle_state_new_present(module, state, nb_app,
                                             nb_endpoint, norm_data)
        elif state == "absent":
            return module.exit_json(
                **ensure_ip_address_absent(nb_endpoint, norm_data))
        else:
            return module.fail_json(msg="Invalid state %s" % state)
    except pynetbox.RequestError as e:
        return module.fail_json(msg=json.loads(e.error))
    except ValueError as e:
        return module.fail_json(msg=str(e))
Пример #3
0
def main():
    '''
    Main entry point for module execution
    '''
    argument_spec = dict(
        netbox_url=dict(type="str", required=True),
        netbox_token=dict(type="str", required=True, no_log=True),
        data=dict(type="dict", required=True),
        state=dict(required=False, default='present', choices=['present', 'absent']),
        validate_certs=dict(type="bool", default=True)
    )

    global module
    module = AnsibleModule(argument_spec=argument_spec,
                           supports_check_mode=True)

    # Fail module if pynetbox is not installed
    if not HAS_PYNETBOX:
        module.fail_json(msg=missing_required_lib('pynetbox'), exception=PYNETBOX_IMP_ERR)

    # Fail if device name is not given
    if not module.params["data"].get("name"):
        module.fail_json(msg="missing device name")

    # Assign variables to be used with module
    app = 'dcim'
    endpoint = 'devices'
    url = module.params["netbox_url"]
    token = module.params["netbox_token"]
    data = module.params["data"]
    state = module.params["state"]
    validate_certs = module.params["validate_certs"]

    # Attempt to create Netbox API object
    try:
        nb = pynetbox.api(url, token=token, ssl_verify=validate_certs)
    except Exception:
        module.fail_json(msg="Failed to establish connection to Netbox API")
    try:
        nb_app = getattr(nb, app)
    except AttributeError:
        module.fail_json(msg="Incorrect application specified: %s" % (app))

    nb_endpoint = getattr(nb_app, endpoint)
    norm_data = normalize_data(data)
    try:
        if 'present' in state:
            result = ensure_device_present(nb, nb_endpoint, norm_data)
        else:
            result = ensure_device_absent(nb_endpoint, norm_data)
        return module.exit_json(**result)
    except pynetbox.RequestError as e:
        return module.fail_json(msg=json.loads(e.error))
    except ValueError as e:
        return module.fail_json(msg=str(e))
Пример #4
0
def netbox_create_ip_address(nb, nb_endpoint, data):
    result = []
    if data.get('vrf'):
        norm_data = normalize_data(data)
        if norm_data.get("status"):
            norm_data["status"] = IP_ADDRESS_STATUS.get(
                norm_data["status"].lower())
        if norm_data.get("role"):
            norm_data["role"] = IP_ADDRESS_ROLE.get(norm_data["role"].lower())
        data = find_ids(nb, norm_data)
        if data.get('failed'):
            result.append(data)
            return result

        if not nb_endpoint.get(address=data["address"], vrf_id=data['vrf']):
            try:
                return nb_endpoint.create([data])
            except pynetbox.RequestError as e:
                return json.loads(e.error)
        else:
            result.append(
                {'failed': '%s already exists in Netbox' % (data["address"])})
    else:
        if not nb_endpoint.get(address=data["address"]):
            norm_data = normalize_data(data)
            if norm_data.get("status"):
                norm_data["status"] = IP_ADDRESS_STATUS.get(
                    norm_data["status"].lower())
            if norm_data.get("role"):
                norm_data["role"] = IP_ADDRESS_ROLE.get(
                    norm_data["role"].lower())
            data = find_ids(nb, norm_data)

            try:
                return nb_endpoint.create([data])
            except pynetbox.RequestError as e:
                return json.loads(e.error)
        else:
            result.append(
                {'failed': '%s already exists in Netbox' % (data["address"])})

    return result
Пример #5
0
def netbox_delete_device(nb_endpoint, data):
    norm_data = normalize_data(data)
    endpoint = nb_endpoint.get(name=norm_data["name"])
    result = []
    try:
        if endpoint.delete():
            result.append(
                {'success': '%s deleted from Netbox' % (norm_data["name"])})
    except AttributeError:
        result.append({'failed': '%s not found' % (norm_data["name"])})
    return result
Пример #6
0
def netbox_create_device(nb, nb_endpoint, data):
    norm_data = normalize_data(data)
    if norm_data.get("status"):
        norm_data["status"] = DEVICE_STATUS.get(norm_data["status"].lower(), 0)
    if norm_data.get("face"):
        norm_data["face"] = FACE_ID.get(norm_data["face"].lower(), 0)
    data = find_ids(nb, norm_data)
    try:
        return nb_endpoint.create([norm_data])
    except pynetbox.RequestError as e:
        return json.loads(e.error)
Пример #7
0
def test_normalize_data():
    assert "name" not in QUERY_TYPES
    assert QUERY_TYPES.get("rack") == "slug"
    assert QUERY_TYPES.get("primary_ip") != "slug"

    raw_data = {
        "name": "Some name",
        "primary_ip": "10.3.72.74/31",
        "rack": "Some rack",
    }
    normalized_data = raw_data.copy()
    normalized_data["rack"] = "some-rack"

    assert normalize_data(raw_data) == normalized_data
Пример #8
0
def netbox_delete_ip_address(nb, nb_endpoint, data):
    norm_data = normalize_data(data)
    result = []
    if data.get('vrf'):
        data = find_ids(nb, norm_data)
        endpoint = nb_endpoint.get(address=norm_data["address"], vrf_id=data['vrf'])
    else:
        endpoint = nb_endpoint.get(address=norm_data["address"])

    try:
        if endpoint.delete():
            result.append({'success': '%s deleted from Netbox' % (norm_data["address"])})
    except AttributeError:
        result.append({'failed': '%s not found' % (norm_data["address"])})
    return result