netbox-agent/README.md

152 lines
3.9 KiB
Markdown
Raw Normal View History

2019-08-02 18:34:35 +02:00
# Netbox agent
2019-08-02 18:32:33 +02:00
2019-08-05 10:01:33 +02:00
This project aims to create hardware automatically into [Netbox](https://github.com/netbox-community/netbox) based on standard tools (dmidecode, lldpd, parsing /sys/, etc).
2019-08-04 15:20:57 +02:00
The goal is to generate an existing infrastructure on Netbox and have the ability to update it regularly by executing the agent.
# Features
* Create servers, chassis and blade through standard tools (`dmidecode`)
2019-08-29 17:52:14 +02:00
* Create physical, bonding and vlan network interfaces with IPs (IPv4 & IPv6)
* Create IPMI interface if found
* Create or get existing VLAN and associate it to interfaces
2019-08-05 18:12:27 +02:00
* Generic ability to guess datacenters and rack location through drivers (`cmd` and `file` and custom ones)
2019-08-26 12:24:48 +02:00
* Update existing `Device` and `Interface`
2019-08-05 18:12:27 +02:00
* Handle blade moving (new slot, new chassis)
2019-08-26 12:24:48 +02:00
* Automatic cabling (server's interface to switch's interface) using lldp
2019-08-26 16:57:13 +02:00
* Local inventory using `Inventory Item` for CPU, RAM, RAID cards, physical disks (behind raid cards)
2019-09-05 13:57:30 +02:00
* PSUs creation and power consumption reporting (based on vendor's tools)
2019-08-04 15:20:57 +02:00
# Requirements
- Netbox >= 2.6
- Python >= 3.4
- [pynetbox](https://github.com/digitalocean/pynetbox/)
- [python3-netaddr](https://github.com/drkjam/netaddr)
- [python3-netifaces](https://github.com/al45tair/netifaces)
2019-09-05 13:57:30 +02:00
- [jsonargparse](https://github.com/omni-us/jsonargparse/)
- ethtool
- dmidecode
- ipmitool
2019-08-26 12:24:48 +02:00
- lldpd
2019-09-05 13:57:30 +02:00
- lshw
# Known limitations
* The project is only compatible with Linux.
Since it uses `ethtool` and parses `/sys/` directory, it's not compatible with *BSD distributions.
* Netbox `>=2.6.0,<=2.6.2` has a caching problem ; if the cache lifetime is too high, the script can get stale data after modification.
We advise to set `CACHE_TIME` to `0`.
2019-08-04 15:20:57 +02:00
# Configuration
2019-08-04 20:10:43 +02:00
```
netbox:
2019-08-04 15:20:57 +02:00
url: 'http://netbox.internal.company.com'
token: supersecrettoken
network:
ignore_interfaces: "(dummy.*|docker.*)"
ignore_ips: (127\.0\.0\..*)
2019-08-26 11:05:41 +02:00
# enable auto-cabling
lldp: true
2019-08-04 15:20:57 +02:00
datacenter_location:
driver: "cmd:cat /etc/qualification | tr [a-z] [A-Z]"
regex: "DATACENTER: (?P<datacenter>[A-Za-z0-9]+)"
# driver: 'cmd:lldpctl'
# regex: 'SysName: .*\.([A-Za-z0-9]+)'
#
# driver: "file:/tmp/datacenter"
# regex: "(.*)"
rack_location:
2019-08-04 15:20:57 +02:00
# driver: 'cmd:lldpctl'
# match SysName: sw-dist-a1.dc42
# regex: 'SysName:[ ]+[A-Za-z]+-[A-Za-z]+-([A-Za-z0-9]+)'
#
# driver: "file:/tmp/datacenter"
# regex: "(.*)"
inventory: true
2019-08-04 15:20:57 +02:00
```
2019-08-02 18:32:33 +02:00
2019-08-29 17:52:14 +02:00
# Specific workflow
## Blades
Each vendor class has a `is_blade` method which is later used for `Device` creation using the Netbox [parent/child feature](https://netbox.readthedocs.io/en/stable/core-functionality/devices/).
The `get_blade_slot` method return the name of the `Device Bay`.
Certain vendors don't report the blade slot in `dmidecode`, so we can use the `slot_location` regex feature of the configuration file.
## Anycast IP
The default behavior of the agent is to assign an interface to an IP.
So two servers with anycasted IPs, running update mode, would only trigger IP's interface assignement in a loop.
In order to handle this case, user need to set Netbox IP's mode to `Anycast` so that the agent will create another one if it's present on another server.
2019-08-02 18:34:35 +02:00
# Hardware
2019-08-02 18:32:33 +02:00
Tested on:
2019-08-02 18:34:35 +02:00
## Dell Inc.
2019-08-02 18:32:33 +02:00
2019-08-02 18:34:35 +02:00
### Blades
2019-08-03 16:02:07 +02:00
2019-08-08 14:46:06 +02:00
* PowerEdge M1000e (your `DeviceType` should have slots named `Slot 01` and so on)
2019-08-02 18:32:33 +02:00
* PowerEdge M640
* PowerEdge M630
* PowerEdge M620
* PowerEdge M610
2019-08-02 18:34:35 +02:00
### Pizzas
2019-08-03 16:02:07 +02:00
2019-08-02 18:32:33 +02:00
* DSS7500
2019-08-26 15:38:44 +02:00
## HP / HPE
2019-08-02 18:34:35 +02:00
2019-08-03 16:02:07 +02:00
### Blades
2019-08-08 14:46:06 +02:00
* HP BladeSystem c7000 Enclosure G2 / G3 (your `DeviceType` should have slots named `Bay 1` and so on)
2019-08-03 16:02:07 +02:00
* HP ProLiant BL460c Gen8
* HP ProLiant BL460c Gen9
* HP ProLiant BL460c Gen10
2019-08-03 16:02:07 +02:00
### Pizzas
* ProLiant DL380p Gen8
2019-08-26 15:38:44 +02:00
* ProLiant SL4540 Gen8
* ProLiant SL4540 Gen9
* ProLiant XL450 Gen10
2019-08-02 18:32:33 +02:00
2019-08-26 15:38:44 +02:00
## Supermicro
2019-08-02 18:34:35 +02:00
2019-08-26 15:38:44 +02:00
### Blades
Feel free to send me a dmidecode output for Supermicro's blade!
### Pizzas
* SSG-6028R
* SYS-6018R
2019-08-02 18:32:33 +02:00
2019-08-26 16:39:36 +02:00
## QCT
### Blades
* QuantaMicro X10E-9N
### Pizzas
* Nothing ATM, feel free to send me a dmidecode or make a PR!
2019-08-02 18:34:35 +02:00
# TODO
2019-08-02 18:32:33 +02:00
- [ ] `CustomFields` support with firmware versions for Device (BIOS), RAID Cards and disks