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))
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))
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))
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
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
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)
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
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