Automatización de la red con Napalm
Publicado el 17 de Agosto del 2021
Apoyando a mis alumnos en esta nueva tendencia de la automatización de las redes, les traigo otra alternativa de administración de los routers y switches, de forma remota y automatizada usando Napalm y programando las actividades con Python.
Napalm es una especie de API que permite administrar a los dispositivos independiente del fabricante, es una librería desarrollada con Python por dos programadores y se han acoplado muchos más, en la actualidad, se tiene desarrollado una variedad de métodos para algunos sistemas operativos de routers y switches de diferentes fabricantes.
El tipo de router y switch que tenía en mi GNS3 no me servían, no funcionaba para pruebas de automatización, esto es te va a resultar normal con el tiempo, no todo funciona y hay que ir investigando por nuevas alternativas. La versión 15.6 lo cambié por el de 15.7 para el caso del router.
Para este lab tuve que que agregar estos dos dispositivos, a continuación sus nombres completos, y navegando por Internet los podrás bajar.
La topología tiene 4 elementos, en particular la nube o cloude1 nos va a permitir la conexión a Internet, además permite que nuestra PC real esté en contacto con los dispositivos de GNS3, esto permite que pueda usar una aplicación instalada en mi PC, Visual Studio Code (VSC), desde la cual estaremos corriendo las aplicaciones en Python, para controlar al router y switch de GNS3.
La configuración previa del switch y router es la necesaria para que sea administrada vía SSH, adjunto las dos configuraciones.
Instale napalm si no lo tiene instalado, con el comando pip install napalm
Se puede usar el comando napalm --help para conocer los comandos que podemos usar para interactuar con los router y switches, previo al uso de las aplicaciones en Python.
Con este comando puedo consultarle al router que interfaces tiene y su características, para ello se debe indicar el usuario, su password, el tipo de IOS (vendor), el host, en este caso la IP que identifica al host, puede ser también su nombre y finalmente se llama a un método, en este ejemplo lo haremos con get_interfaces.
Usando el método get_interfaces_ip podemos ver las IP de las interfaces del router, se puede conocer la IP de una interfaz, la única que tiene IP, las otras 3 no aparecieron.
napalm --user user1 --password cisco --vendor ios 192.168.1.43 call get_interfaces_ip
Usando el método get_arp_table para ver la tabla ARP del router, se puede apreciar así.
napalm --user user1 --password cisco --vendor ios 192.168.1.43 call get_arp_table
Si usamos los comandos típicos del router para hacer las consultas, nos entrega los datos desordenados, ya no los presenta en el formato json.
napalm --user user1 --password cisco --vendor ios 192.168.1.43 call cli --method-kwargs "commands=['show ip route']"
Los métodos get_xx han sido desarrollados para la consulta de algunos datos y se los debe buscar en su documentación, para saber cuales están disponibles. Se muestra a continuación solo algunos de ellos.
Ahora vamos a trabajar con Python, lo primero que haremos es un pequeño programa (napalm01.py), que permita verificar si hay interacción con el router o switch.
Previo a la ejecución, podemos presionar Terminal / Nuevo terminal
Luego usamos el comando clear para liberar más la consola y queda así.
A continuación vamos a ejecutar el programa napalm01.py y lo hacemos desde el mismo VSC.
La respuesta obtenida es la siguiente, donde se muestra que el test ha sido completado satisfactoriamente.
Se crea un objeto ios_router y se le pasa los parámetros para acceder al dispositivo: IP, nombre de usuario y password.
Para cerrar esta presentación, vamos a desarrollar un programa en Python (napalm04.py), usando napalm para logrando obtener datos de los equipos de la red, para esta prueba solo tendremos en cuenta a un router y un switch, podrían ser muchos mas, dependiendo de la lista que declaremos.
Solo haremos la aplicación para routers del tipo IOS clásico, no lo haremos con los IOSXR, para no complicar por ahora nuestro proceso de aprendizaje, como dicen. " menos es más".
Iniciamos el programa importando napalm y tabulate, este último, para imprimir con facilidad los datos de los dispositivos.
Se define una función, luego un objeto mediante el método de napalm "get_network_driver" y seleccionamos al ios tradicional.
Se hace la lista de dispositivos que van a ser monitoreados, tomando tres parámetros para identificarlo: su IP, tipo de IOS y tipo de dispositivo.
Se crea la lista network_devices y se accede a cada dispositivo, para lo cual se debe indicar el usuario y password y se tomando nota de varios parámetros: hostname, vendor, etc
Si ejecutamos, este es el resultado: