martes, 17 de agosto de 2021

 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 acceso a diferentes fabricantes implicaría el conocimiento variado de cada uno de ellos, lo interesante de Napalm, es que nos hace fácil el acceso, por que han desarrollado el  get_network_driver, al cual solo tenemos que decirle que IOS queremos que controle. 

Vamos a hacer una práctica automatización y para ello se debe levantar primero la VM de GNS3 en VMware.

Usaremos la siguiente topología de GNS3

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.

    Switch IOS: vios_l2-adventerprisek9-m.ssa.high_iron_20190423.qcow2    IOS

    Router IOS: vios-adventerprisek9-m.vmdk.SPA.157-3.M3.qcow2   IOS

Para su configuración debes hacer una importación del dispositivo (Appliance)


Debes haber bajado tres archivos para el router y uno de ellos es el de GNS3 appliance

Next, Next, 


Con esto tendrás instalado el router, de forma similar puedes agregar al switch

Si te preguntas de donde se obtiene esta información, la respuesta la obtienes de GNS3 Marketplace



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.

Configuración del switch
S1#sho runn
version 15.2
!
hostname S1
!
username user1 privilege 15 password 0 cisco
!
ip domain-name cisco.com
!
interface Vlan1
 ip address 192.168.1.41 255.255.255.0
 no shutdown
!
ip ssh version 2

line vty 0 4
 login local
 transport input ssh
!
end
S1#


Configuración del router R1
R1#sho runn
version 15.7
hostname R1
!
ip domain name cisco.com
username user1 privilege 15 password 0 cisco
!
interface GigabitEthernet0/0
 ip address 192.168.1.43 255.255.255.0
 no shutdown

line vty 0 4
 login local
 transport input ssh
!
end
R1#


Desde la consola o Terminal de VSC, verifique que ya tiene instalado la versión 3 de Python, para ello ejecute python --version









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.

napalm --user user1 --password cisco --vendor ios 192.168.1.43 call get_interfaces

Con este comando y usando napalm le consultamos al router sobre sus interfaces y nos devuelve los datos de cada interfaz usando el formato json.






















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.



En la aplicación, primero se importa napalm, luego se define una función donde se invoca al método get_network_driver y le indicamos que vamos a usarlo con un ios tradicional.

Se crea un objeto ios_router y se le pasa los parámetros para acceder al dispositivo: IP, nombre de usuario y password.

Luego le aplicamos el método open al objeto, con lo cual se inicia la conexión hacia el dispositivo. Si no aparece ningún mensaje de error significa que la conexión es exitosa
Aplicamos a continuación el método is_alive para verificar el estado de esa conexión.
Finalmente, se usa el método close para cerrar la conexión


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".


Necesitamos la librería tabulate, si no lo tenemos, debemos instalarlo, por lo que desde la consola del Visual S.C. usamos el comando pip install tabulate

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: