Giter Site home page Giter Site logo

mirzawaqasahmed / netbox-joined-inventory Goto Github PK

View Code? Open in Web Editor NEW

This project forked from sidarion/netbox-joined-inventory

0.0 0.0 0.0 333 KB

Netbox_joined_inventory is a python script that gathers data from a Netbox source-of-truth and stores them as Ansible inventory, group_vars and host_vars files.

License: GNU General Public License v3.0

Python 100.00%

netbox-joined-inventory's Introduction

Netbox_joined_inventory (for network devices)

script

Netbox_joined_inventory joins Netbox as source-of-truth for the network configuration and Ansible as a automation orchestrator.

Netbox_joined_inventory is a script that gathers data from a Netbox as source-of-truth and stores the data as Ansible inventory, group_vars and host_vars.

The Ansible inventory will not contain configuration data - most configuration data is stored in host_vars YAML files.

Netbox_joined_inventory is not a dynamic inventory script for Ansible. A dynamic inventory script would immediately propagate changes in Netbox to Ansible. Instead netbox_joined_inventory generates variables files.

The generated files can be committed to a repository. That way differences to the previous set of configuration files can be reviewed before applying them via Ansible playbooks.

The benefits are clear: an audit trail, traceability, reproducibility, the possibility to roll back and a clean separation between playbook logic and sensitive config data.

The script is specialized for networking devices rather than servers. It features the following functionality:

  • Get an inventory of network devices from Netbox via API

    • Build host groups for Ansible. Condition configurable. E.g. Role(Spines/Leafs/Access), Platform, Network/Security zones, Site
    • Write to an Ansible inventory file. INI-like syntax.
  • Get all interfaces for each network device

    • Write them to the host_vars files. YAML syntax.
    • Including interface name, form/speed, IP addresses, untagged VLANs
  • Get configured VLANs for common device roles. All leafs in an network zone have the same VLAN/VXLAN configuration (see also requirements.txt)

    • Write VLANs to the host_vars files. YAML syntax.
    • VLAN, VXLAN vni, Anycast IP, CIDR, VRF

Target network architecture

The currently implemented architecture targets a spine-leaf deployment over active-active datacenters - it works best within a scale of 50-4000 VLANs. Despite the assumed spine-leaf architecture, the script is written fairly generically and should be adaptable to other architectures and assumptions.

Ansible has many supported network devices: http://docs.ansible.com/ansible/latest/modules/list_of_network_modules.html

Netbox_joined_inventory is primarily tested with CumulusLinux(CL) and EdgeCore switches.

VXLAN is the de facto technology for implementing network virtualization in the data center, enabling layer 2 segments to be extended over an IP core (the underlay). Ethernet Virtual Private Network (EVPN) is a standards-based control plane for VXLAN defined in RFC 7432 and draft-ietf-bess-evpn-overlay that allows for building and deploying VXLANs at scale. It relies on multi-protocol BGP (MP-BGP) for exchanging information and is based on BGP-MPLS IP VPNs (RFC 4364). It has provisions to enable not only bridging between end systems in the same layer 2 segment but also routing between different segments (subnets). There is also inherent support for multi-tenancy. EVPN is often referred to as the means of implementing controller-less VXLAN.

Network simulation

We simulate and test a network configuration before deploying to production. This is done using Vagrant and Cumulus VX, both of which are free to use. There is a very comfortable prepared lab script for it: https://github.com/cumulusnetworks/cldemo-vagrant

There you can test the above mentioned features:

  • MLAG to dual-connect hosts at Layer 2 to two top of rack leafs and uses BGP unnumbered/L3 for everything above the leaf layer.

  • EVPN on Cumulus Linux

Basic playbooks for configuring the CL switches: https://github.com/CumulusNetworks/cldemo-automation-ansible

Conventions and shortcuts

Data that is needed for the script to produce a complete output is further commented in the /requirement.ini file.

  • VLANs get available on a switch using the grouping object "Prefix/VLAN Roles". A switch will get all VLANs configured that are in the "Prefix/VLAN Roles" that is configured using the custom attribute "VLAN domain" on device level.

  • VXLAN VNI will have a 1:1 mapping to the VLAN ID. This limits a possible scale but simplifies the VLAN ID management in smaller deployments.

  • The selection of the BGP enabled interfaces are currently configured outside Netbox. E.g. All leaf switches use swp50-swp51

  • The interfaces in Netbox must have the correct form factor. E.g. VLAN interfaces must be "virtual".

  • VLAN IDs on VLAN interfaces are defined by the number at the end of the interface name. To be recognised as a VLAN interface the interface name must start with the term "vlan". E.g. interface "vlan21" gets recognised as a VLAN interface and VLAN ID 21 will be set.

  • For multi-chassis LAG configuration the clag-id is determined by the number at the end of the interface name. The interface type needs to be set to "Link Aggregation Group (LAG)". E.g. interface "bond3" gets recognised as LAG and clag-id 3 will be set.

Run Configuration

The configuration of netbox_joined_inventory is done in an separate YAML file. If the configuration file is not called netbox_joined_inventory.yml, then you need to pass its name to the script via a parameter. Example:

[user@cent1 ~]$ python3 netbox_joined_inventory.py -c netbox_joined_inventory.yml

The configuration example displays all the currently supported features.

Data model

This example configuration groups together devices-Prefix/VLAN Roles-prefixes

model

Screenshots

The /images directory contains some screenshots on how this looks like in the Netbox web gui:

Adding a device

Add device

Network device custom attribute

Interfaces in a device

interfaces

bond interfaces

VLANs and prefixes

VLANs

Prefixes

netbox-joined-inventory's People

Contributors

marioland avatar kallies avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.