Netbox is a Datacenter Inventory Management System (DCIM) and IP Address Management System all rolled into one.

Netbox provides a simple API whose documentation can be accessed via the "/api/docs" url of the Netbox server. I believe it is Swagger 1.2 compatible format.

Prerequisites

Latest Netbox

Currently tested using git ref 298ac1ba Basically you should have the patches for API authentication

Configure 4 shell environment variables

Example:

export NETBOX_URL=http://localhost
export NETBOX_USER=admin
export NETBOX_PASSWD=admin
export PXE_SERVER=192.168.1.1

Provide a specific format for the Netbox device roles

This is a way to define multiple roles for a particular device because Netbox does not support adding multiple roles to one device.

Example 1: "linux-switch" device role means that the device is placed in the [linux] and [switch] Ansible inventory groups respectively.

Example 2: "windows-authentication" device role means that the device is placed in the [windows] and [authentication] Ansible inventory groups respectively.

NOTE: Linux Switches inventory entries like Cumulus switches entries will not have an interface list like other linux devices, i.e servers.

Testing the Ansible Dynamic Inventory Script

Download the netbox-ansible inventory script. Run this simple ansible playbook and command to test the inventory.

test.yml

---
- hosts: all
  gather_facts: false
  tasks:
    - debug: var=hostvars[inventory_hostname]
$ chmod +x netbox-ansible.py
$ ansible-playbook -i netbox-ansible.py test.yml

This is a snippet of some sample output

      "x1-r1": {
            "hosts": [
                "172.17.100.202"
            ],
            "vars": {
                "interfaces": {
                    "eth0": {
                        "ip": "",
                        "mac": "F3:11:22:33:44:55"
                    },
                    "eth1": {
                        "ip": "",
                        "mac": "F4:33:11:33:22:11"
                    },
                    "ipmi": {
                        "ip": "172.17.200.10/26",
                        "mac": "08:11:33:22:11"
                    }
                },
                "primary_ip_addr": "172.17.100.202",
                "primary_ip_prefix": "26"
            }
        },
        "switch": {
            "children": [
                "leaf1",
                "leaf2",
                "mgmt-switch"
            ]