Sunday, January 14, 2018

eNMS - a vendor-agnostic NMS for carrier-grade network visualization and network automation

eNMS - first release

I spent the past few weeks working on eNMS, a vendor-agnostic NMS designed for network visualization and, more importantly, network automation. I've just published a first release yesterday that you can find on Github:

http://ift.tt/2DhFJ4L

You can find a description of the main features in the readme, I made some video to make it as clear as possible what you can do with it.

I also hosted a demo version on pythonanywhere, which you can find at the following link:

http://ift.tt/2mxeVCX credentials: username: cisco / password: cisco

(this demo is mainly for you to see what it looks like, I disabled most functionalities.)

Features:

In short, the main features are:

  • interface to Netmiko and NAPALM to send scripts graphically to about any type of network device (or group of devices)

  • possibility to use Jinja2 along with a YAML file to send a template-based script

  • scheduling of the script: you can send a script to any group of devices, at any time, at any frequency (once a day, once a week, etc). When a script is sent to a group of device, it is executed in parallel with multiple processes (so it's very fast, even if you have hundreds of routers/switches).

  • visualization of your network with either Open Street Map or via a force-based algorithm if you don't have the GPS coordinates

  • SSH connection to a device from OpenStreetMap or the force-based visualization

  • TACACS+ authentication

  • Dashboard showing some useful information about your network

  • Advanced regex-based filtering (very important and powerful: see readme for details)

  • Export to Google Earth

  • a few other things

If you want to find out more about the project, I suggest you read the readme on github.

History of the project:

It all started during the NAPALM hackathon end of november, when I created a first version that I called "eNAPALM". After a while, I decided to change a lot of things and it wasn't entirely focused on NAPALM anymore, so I renamed it eNMS. So the project is about 6-7 weeks old and there definitely is some testing / debugging to do (if you find a bug (there should be plenty), you can create an issue on github and I'll do my best to fix it). I reimplemented many features that I had already implemented about a year ago in pyNMS (http://ift.tt/2vPCU2U), a similar project in pyQt.

Technical stack:

Back-end:

  • Python (Flask)

  • APScheduler (job scheduling)

  • NAPALM / Netmiko / Jinja2 / YAML (network automation)

  • SQLAlchemy (SQLite for now but I will switch to PostgreSQL soon)

Front-end:

  • Bootstrap

  • Javascript (leaflet, vis, jquery, etc.)

See the "Credits" section of the readme for more information.

For the front-end, I used a Bootstrap template called "Gentelella" (http://ift.tt/1TvhJfN). When I started, there was no integration of Gentelella with Flask (only Django) so as a pre-requisite of eNMS, I had to do that. I thought it might be interesting for other devs, so I made it a standalone project. If you want to develop some Flask interface, this can be a good place to start, kinda like a Flask boilerplate: http://ift.tt/2Aaxbuo

Contributions:

Contributions are most welcome ! This could be improving the code, adding some features (see the issues for a list of things that would be nice to have), creating some documentation (the readme is pretty much all there is right now), creating files for the containerization (I made a /docker folder to host some dockerfiles for example), and commiting some useful templates that you use.

For the templates, I made a /script folder where I show some examples of Jinja2 templates + the YAML file that goes with it. If you have such j2 template (any platform / OS), and you're willing to share, that would be awesome. (the "structure" would be /script/vendor-name/os-name/the-files-here)

Distribution:

GPLv3. Free.

Be careful:

When you use NAPALM merge or NAPALM replace function, the script is automatically commited ! => Be careful not to destroy your network (disclaimer: if you do destroy your network, I'm not responsible) I will change the behavior in the future, by not commiting after loading the conf and instead, display the diff before commiting, see http://ift.tt/2mv0Fe5



No comments:

Post a Comment