¿Cómo dar tus primeros pasos en la automatización de redes con NAPALM? Cisco IOS y Cisco XR
Introducción
NAPALM (Network Automation and Programmability Abstraction Layer with Multivendor support) es una biblioteca de Python que implementa un conjunto de funciones para interactuar con diferentes sistemas operativos de dispositivos de red utilizando una API unificada.
NAPALM admite varios métodos para conectarse a los dispositivos, manipular configuraciones o recuperar datos.
El equipo oficial que mantiene NAPALM, también conocido como los “Core Developers“, han hecho desarrollos para múltiples fabricantes y sistemas operativos. Actualmente soportan:
- Arista EOS
- Cisco IOS
- Cisco IOS-XR
- Cisco NX-OS
- Juniper JunOS
Además de los controladores principales, napalm también admite controladores impulsados por la comunidad. Esta comunidad mantiene sus repositorios de controladores en Github. Aquí podran encontrar controladores para otros fabricantes como Huawei, Cumulus, HP, ArubaOS, entre otros.
En este tutorial vamos a dar los primeros pasos para que puedas instalar NAPALM. Seguiremos con colectar información de routers Cisco con el sistema operativo IOS y IOS-XR y finalmente realizar configuraciones. Conociendo estos pasos básicos estoy seguro que se te abrirán las puertas a decenas de ideas y casos de uso en lo que puedes aprovechar este conocimiento.
Conocimiento Requerido para este Tutorial
Para sacar el mejor provecho de este Tutorial se hace requerido lo siguiente:
- Ambiente de trabajo sea Ubuntu Linux o cualquier distribución basada en Ubuntu.
- También es requerido tener conocimientos básicos de Python.
Paso #1 – Instalación de Ambiente Virtual en Python
Las recientes versiones de Ubuntu vienen con Python3 instalado por lo que es posible que no tengas que instalarlo. Para validar si tienes Python3 instalado en tu Ubuntu se puede ejecutar este comando:
python3 -V
La salida debería ser similar a esta:
Python 3.6.9
En caso de que no tengas Python3 o la versión compatible, puedes instalar Python3 desde los repositorios de Ubuntu. Si no sabes como, puedes ver mi tutorial de como instalar Python3.
Para no instalar NAPALM en nuestras librerías de manera permanente, crearemos un ambiente virtual de trabajo con Python. Para eso necesitaremos instalar el siguiente paquete:
sudo apt-get install -y python3-venv
Una vez hayamos instalado este paquete, pues crearemos el ambiente virtual:
python3 -m venv virtual_env_napalm
Para usar este entorno, debe activarlo, lo que puede hacer escribiendo el siguiente comando que llama al script de activación:
source virtual_env_napalm
/bin/activate
Tu Prompt ahora tendrá como prefijo el nombre de el entorno, en este caso se llama virtual_env_napalm. Tu prefijo puede verse algo diferente, pero el nombre de tu entorno entre paréntesis debería ser lo primero que veas en tu línea de comandos, ejemplo:
(virtual_env_napalm) codingnetworks@lab-pc:~$
Paso #2 – Instalación de Dependencias
Ahora que tenemos montado nuestro ambiente virtual, vamos a instalar todas las dependencias de NAPALM.
Primero debemos obtener el gestor de paquetes de Python PIP3. Para instalarlo puedes ejecutar el siguiente comando:
sudo apt-get install python3-pip
Otras dependencias que tiene NAPALM, especificamente para sistemas operativos IOS y IOS-XR es la siguiente:
sudo apt-get install -y --force-yes libssl-dev libffi-dev python-dev python-cffi
Ya estamos listo para instalar NAPALM.
Paso #3 – Instalación de la Librería NAPALM
El comando de instalación es sencillo:
pip3 install napalm
Listo! Vayamos inmediatamente a escribir nuestro código.
Paso #4 – Conectandote a un router Cisco IOS y Cisco IOS-XR
Nuestra primera tarea será la de escribir un código para conectarnos a un router Cisco con IOS y otro con IOS-XR. A continuación el código:
import napalm
def main():
# Use the appropriate network driver to connect to the device:
driver_ios = napalm.get_network_driver("ios")
driver_iosxr = napalm.get_network_driver("iosxr")
#Create routers objects
ios_router = driver_ios(
hostname="192.168.56.11",
username="codingnetworks",
password="codingnetworks",
optional_args={"inline_transfer": True}
)
iosxr_router = driver_iosxr(
hostname="192.168.56.31",
username="codingnetworks",
password="codingnetworks",
)
#Connect to the routers
print("Connecting to ios router ...")
ios_router.open()
print("Checking ios router Connection Status:")
print(ios_router.is_alive())
print("Connecting to IOS XR router ...")
iosxr_router.open()
print("Checking IOS XR router Connection Status:")
print(iosxr_router.is_alive())
# close the session with the device.
iosxr_router.close()
ios_router.close()
print("Done.")
if name == "main":
main()
Tomemos este código, guardemoslo en un archivo llamado “napalm_practice.py” y vamos a correrlo con el siguiente comando:
python3 napalm_practice.py
La salida debería ser similar a esta:
Connecting to ios router …
Checking ios router Connection Status:
{'is_alive': True}
Connecting to IOS XR router …
Checking IOS XR router Connection Status:
{'is_alive': True}
Done.
Con este simple código nos conectamos a dos routers, validamos el estado de la conexión y nos desconectamos. Acabamos de completar otro paso hacia la programabilidad y automatización.
Paso #5 – Colectar información de los equipos
Tomemos el código del paso anterior y agreguemos unas cuantas líneas con las cuales vamos a recolectar la tabla ARP de los dos routers. Luego esta información colectada será presentada en pantalla.
import napalm
import json
def main():
# Use the appropriate network driver to connect to the device:
driver_ios = napalm.get_network_driver("ios")
driver_iosxr = napalm.get_network_driver("iosxr")
#Create routers objects
ios_router = driver_ios(
hostname="192.168.56.11",
username="codingnetworks",
password="codingnetworks",
optional_args={"inline_transfer": True}
)
iosxr_router = driver_iosxr(
hostname="192.168.56.31",
username="codingnetworks",
password="codingnetworks",
)
#Connect to the routers
print("Connecting to ios router ...")
ios_router.open()
print("Connecting to IOS XR router ...")
iosxr_router.open()
#Getting ARP Table information
print("IOS XR router: Get ARP Table ...")
print(json.dumps(iosxr_router.get_arp_table(), indent=4))
print("IOS router: Get ARP Table ...")
print(json.dumps(ios_router.get_arp_table(), indent=4))
#Close the session with the device.
iosxr_router.close()
ios_router.close()
print("Done.")
if name == "main":
main()
Tomemos este código, guardemoslo en un archivo llamado “napalm_practice.py” y vamos a correrlo con el siguiente comando:
python3 napalm_practice.py
La salida debería similar a esta:
Connecting to ios router …
Checking ios router Connection Status:
{'is_alive': True}
Connecting to IOS XR router …
Checking IOS XR router Connection Status:
{'is_alive': True}
iosxr router: Get ARP Table …
[
{
"interface": "GigabitEthernet0/0/0/2",
"mac": "0A:00:27:00:00:16",
"ip": "192.168.56.1",
"age": 7.0
},
{
"interface": "GigabitEthernet0/0/0/2",
"mac": "50:00:00:0B:00:03",
"ip": "192.168.56.31",
"age": 0.0
}
]
ios router: Get ARP Table …
[
{
"interface": "GigabitEthernet0/1",
"mac": "50:00:00:06:00:01",
"ip": "172.17.10.1",
"age": 0.0
},
{
"interface": "GigabitEthernet0/3",
"mac": "0A:00:27:00:00:16",
"ip": "192.168.56.1",
"age": 0.0
},
{
"interface": "GigabitEthernet0/3",
"mac": "50:00:00:06:00:03",
"ip": "192.168.56.11",
"age": 0.0
}
]
Done.
Tomen en cuenta que en esta ocasión importamos el modulo “json”. La razón se debe a que convirtiendo a JSON un diccionario, se puede presentar de una manera mas ”bonita”.
Paso #6 – Realizar configuraciones básicas
Es el momento de realizar una configuración básica. Lo que haremos es configurar una descripción a una interfaz del router con el sistema operativo IOS.
import napalm
def main():
# Use the appropriate network driver to connect to the device:
driver_ios = napalm.get_network_driver("ios")
driver_iosxr = napalm.get_network_driver("iosxr")
#Create routers objects
ios_router = driver_ios(
hostname="192.168.56.11",
username="codingnetworks",
password="codingnetworks",
optional_args={"inline_transfer": True}
)
iosxr_router = driver_iosxr(
hostname="192.168.56.31",
username="codingnetworks",
password="codingnetworks",
)
#Connect to the routers
print("Connecting to ios router ...")
ios_router.open()
print("Connecting to IOS XR router ...")
iosxr_router.open()
#Loading ios router object with the needed configuration.
ios_router.load_merge_candidate(filename=None, config="interface gi0/2\ndescription Test")
print("\nDiff:")
print(ios_router.compare_config())
#Commit the configuration into the router.
print("Committing ...")
ios_router.commit_config()
# close the session with the device.
iosxr_router.close()
ios_router.close()
print("Done.")
if name == "main":
main()
Tomemos este código, guardemoslo en un archivo llamado “napalm_practice.py” y vamos a correrlo con el siguiente comando:
python3 napalm_practice.py
La salida debería similar a esta:
Connecting to ios router …
Checking ios router Connection Status:
{'is_alive': True}
Connecting to IOS XR router …
Checking IOS XR router Connection Status:
{'is_alive': True}
Diff:
+interface gi0/2
+description Test
Committing …
Done.
Continua aprendiendo
Espero que este código les haya servido como base para que puedan iniciar con el módulo NAPALM y sus aventuras con la Programabilidad y Automatización de Redes. A continuación les dejo varios enlaces donde pueden expandir su conocimiento sobre NAPALM:
Documentación Oficial de NAPALM:
https://napalm.readthedocs.io/en/latest/
Métodos soportados por NAPALM para colectar información o modificar configuración en equipos.
https://napalm.readthedocs.io/en/latest/support/index.html
Detalles de cada método, parámetros, lo que retornan, lo pueden encontrar en el siguiente link:
https://napalm.readthedocs.io/en/latest/base.html
Si tienen preguntas o dudas sobre lo que vieron en este post o sobre lo que encuentren en la documentación oficial, comenten debajo y con gusto aclararemos sus dudas.