mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Merge pull request #3863 from hSaria/2113-napalm-settings
Fixes #2113: NAPALM driver settings
This commit is contained in:
65
docs/additional-features/napalm.md
Normal file
65
docs/additional-features/napalm.md
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# NAPALM
|
||||||
|
|
||||||
|
NetBox supports integration with the [NAPALM automation](https://napalm-automation.net/) library. NAPALM allows NetBox to fetch live data from devices and return it to a requester via its REST API.
|
||||||
|
|
||||||
|
!!! info
|
||||||
|
To enable the integration, the NAPALM library must be installed. See [installation steps](../../installation/2-netbox/#napalm-automation-optional) for more information.
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /api/dcim/devices/1/napalm/?method=get_environment
|
||||||
|
|
||||||
|
{
|
||||||
|
"get_environment": {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
|
||||||
|
By default, the [`NAPALM_USERNAME`](../../configuration/optional-settings/#napalm_username) and [`NAPALM_PASSWORD`](../../configuration/optional-settings/#napalm_password) are used for NAPALM authentication. They can be overridden for an individual API call through the `X-NAPALM-Username` and `X-NAPALM-Password` headers.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ curl "http://localhost/api/dcim/devices/1/napalm/?method=get_environment" \
|
||||||
|
-H "Authorization: Token f4b378553dacfcfd44c5a0b9ae49b57e29c552b5" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Accept: application/json; indent=4" \
|
||||||
|
-H "X-NAPALM-Username: foo" \
|
||||||
|
-H "X-NAPALM-Password: bar"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Method Support
|
||||||
|
|
||||||
|
The list of supported NAPALM methods depends on the [NAPALM driver](https://napalm.readthedocs.io/en/latest/support/index.html#general-support-matrix) configured for the platform of a device. NetBox only supports [get](https://napalm.readthedocs.io/en/latest/support/index.html#getters-support-matrix) methods.
|
||||||
|
|
||||||
|
## Multiple Methods
|
||||||
|
|
||||||
|
More than one method in an API call can be invoked by adding multiple `method` parameters. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /api/dcim/devices/1/napalm/?method=get_ntp_servers&method=get_ntp_peers
|
||||||
|
|
||||||
|
{
|
||||||
|
"get_ntp_servers": {
|
||||||
|
...
|
||||||
|
},
|
||||||
|
"get_ntp_peers": {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Optional Arguments
|
||||||
|
|
||||||
|
The behavior of NAPALM drivers can be adjusted according to the [optional arguments](https://napalm.readthedocs.io/en/latest/support/index.html#optional-arguments). NetBox exposes those arguments using headers prefixed with `X-NAPALM-`.
|
||||||
|
|
||||||
|
|
||||||
|
For instance, the SSH port is changed to 2222 in this API call:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ curl "http://localhost/api/dcim/devices/1/napalm/?method=get_environment" \
|
||||||
|
-H "Authorization: Token f4b378553dacfcfd44c5a0b9ae49b57e29c552b5" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Accept: application/json; indent=4" \
|
||||||
|
-H "X-NAPALM-port: 2222"
|
||||||
|
```
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
* [#1982](https://github.com/netbox-community/netbox/issues/1982) - Improved NAPALM method documentation in Swagger
|
* [#1982](https://github.com/netbox-community/netbox/issues/1982) - Improved NAPALM method documentation in Swagger
|
||||||
* [#2050](https://github.com/netbox-community/netbox/issues/2050) - Preview image attachments when hovering the link
|
* [#2050](https://github.com/netbox-community/netbox/issues/2050) - Preview image attachments when hovering the link
|
||||||
|
* [#2113](https://github.com/netbox-community/netbox/issues/2113) - Allow NAPALM driver settings to be changed with request headers
|
||||||
* [#2589](https://github.com/netbox-community/netbox/issues/2589) - Toggle for showing available prefixes/ip addresses
|
* [#2589](https://github.com/netbox-community/netbox/issues/2589) - Toggle for showing available prefixes/ip addresses
|
||||||
* [#3090](https://github.com/netbox-community/netbox/issues/3090) - Add filter field for device interfaces
|
* [#3090](https://github.com/netbox-community/netbox/issues/3090) - Add filter field for device interfaces
|
||||||
* [#3187](https://github.com/netbox-community/netbox/issues/3187) - Add rack selection field to rack elevations
|
* [#3187](https://github.com/netbox-community/netbox/issues/3187) - Add rack selection field to rack elevations
|
||||||
|
@ -35,6 +35,7 @@ pages:
|
|||||||
- Custom Scripts: 'additional-features/custom-scripts.md'
|
- Custom Scripts: 'additional-features/custom-scripts.md'
|
||||||
- Export Templates: 'additional-features/export-templates.md'
|
- Export Templates: 'additional-features/export-templates.md'
|
||||||
- Graphs: 'additional-features/graphs.md'
|
- Graphs: 'additional-features/graphs.md'
|
||||||
|
- NAPALM: 'additional-features/napalm.md'
|
||||||
- Prometheus Metrics: 'additional-features/prometheus-metrics.md'
|
- Prometheus Metrics: 'additional-features/prometheus-metrics.md'
|
||||||
- Reports: 'additional-features/reports.md'
|
- Reports: 'additional-features/reports.md'
|
||||||
- Tags: 'additional-features/tags.md'
|
- Tags: 'additional-features/tags.md'
|
||||||
|
@ -407,13 +407,29 @@ class DeviceViewSet(CustomFieldModelViewSet):
|
|||||||
napalm_methods = request.GET.getlist('method')
|
napalm_methods = request.GET.getlist('method')
|
||||||
response = OrderedDict([(m, None) for m in napalm_methods])
|
response = OrderedDict([(m, None) for m in napalm_methods])
|
||||||
ip_address = str(device.primary_ip.address.ip)
|
ip_address = str(device.primary_ip.address.ip)
|
||||||
|
username = settings.NAPALM_USERNAME
|
||||||
|
password = settings.NAPALM_PASSWORD
|
||||||
optional_args = settings.NAPALM_ARGS.copy()
|
optional_args = settings.NAPALM_ARGS.copy()
|
||||||
if device.platform.napalm_args is not None:
|
if device.platform.napalm_args is not None:
|
||||||
optional_args.update(device.platform.napalm_args)
|
optional_args.update(device.platform.napalm_args)
|
||||||
|
|
||||||
|
# Update NAPALM parameters according to the request headers
|
||||||
|
for header in request.headers:
|
||||||
|
if header[:9].lower() != 'x-napalm-':
|
||||||
|
continue
|
||||||
|
|
||||||
|
key = header[9:]
|
||||||
|
if key.lower() == 'username':
|
||||||
|
username = request.headers[header]
|
||||||
|
elif key.lower() == 'password':
|
||||||
|
password = request.headers[header]
|
||||||
|
elif key:
|
||||||
|
optional_args[key.lower()] = request.headers[header]
|
||||||
|
|
||||||
d = driver(
|
d = driver(
|
||||||
hostname=ip_address,
|
hostname=ip_address,
|
||||||
username=settings.NAPALM_USERNAME,
|
username=username,
|
||||||
password=settings.NAPALM_PASSWORD,
|
password=password,
|
||||||
timeout=settings.NAPALM_TIMEOUT,
|
timeout=settings.NAPALM_TIMEOUT,
|
||||||
optional_args=optional_args
|
optional_args=optional_args
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user