Nornir | Introducción, instalación y primer script básico

Como habéis podido observar, soy muy fan de Ansible ya que es una herramienta de network automation muy fácil de aprender y no requiere saber mucho de programación en Python para poder usarlo.

Sin embargo, me he dado cuenta que Ansible tiene sus limitaciones ya que cuando ejecutamos un playbook como por ejemplo cuando queremos ejecutar show ip int brief en multiples routers y switches Cisco es un proceso un tanto lento ya que realiza cada conexión SSH secuencialmente y no a la vez con lo que imaginaros que si tenemos que gestionar cientos o miles de dispositivos de red la cantidad de segundos y minutos que tendriamos que esperar para obtener el output de nuestro playbook.

Para ello, existe un nueva herramienta de automatización de redes llamada Nornir que se supone que es una especie de evolución de Ansible (hay que gente que le llama Ansible 2.0) pero que está creado puramente en Python y soluciona alguno de los problemas or limitaciones de Ansible.

Algunas de estas mejoras son las siguientes:

- Es capaz de realizar mútiples de conexiones SSH simuláneas (no secuencialmente como lo hacia Ansible)

- Al ser basado en Python 100% tenedremos muchas menos limitaciones a la hora de crear nuestros propios scripts al contrario de Ansible que está creado con su propio lenguaje de programación (incluido Python también))

- El troubleshooting en Nornir es más fácil comparado con Ansible ya que el DEBUG en Python es más intuitivo o proporciona más información que este mismo.

- Nornir se puede usar conjuntamente con algunas de las librerias de networking en Python conocidas como Netmiko, NAPALM o Netbox.

Instalación de Nornir

Como siempre, necesitaremos un PC o una máquina virtual en una distribución Linux. Asumiendo que Python3 está instalado en vuestro Linux, tan solo tendréis que ejecutar este comando para instalar Nornir al completo:

root@angel-pc:/# sudo pip3 install nornir

También, es recomendable instalar los siguientes plugins o módulos de nornir (aqui están todos los plugins disponibles para Nornir para más info)

 root@angel-pc:/# sudo pip3 install nornir_napalm

root@angel-pc:/# sudo pip3 install nornir_netmiko


Prerequisitos nornir + Nuestro primer script

Lo primero que haremos es crear una carpeta llamada "nornir", puede ser creada donde vosotros querais en mi casa la creé aquí:

root@angel-pc:/# mkdir /home/angel/script/nornir

En segundo lugar, necesitaremos crear estos 3 archivos en nuestra carpeta de nornir:

- config.yaml <-- Similar al archivo ansible.cfg de Ansible
- hosts.yaml <-- Similar al archivo hosts de Ansible (o inventory file)
- groups.yaml <-- Archivo usado para distinguir los routers y switches en distintos grupos de dispositivos de red (ej: routers cisco, switches cisco, routers HP,  routers Juniper, etc)

Este es el código de cada uno de estos 3 archivos:

config.yaml

root@angel-pc:/home/angel/scripts/nornir# nano config.yaml
---
inventory:
    plugin: SimpleInventory
    options:
        host_file: "/home/angel/scripts/nornir/hosts.yaml"
        group_file: "/home/angel/scripts/nornir/groups.yaml"
runner:
    plugin: threaded
    options:
        num_workers: 20


hosts.yaml

root@angel-pc:/home/angel/scripts/nornir# nano hosts.yaml
---
SW1:
    hostname: 192.168.1.10
    platform: 'ios'
    username: usuario_ssh
    password: password_ssh
    groups:
        - cisco_group
R1:
    hostname: 192.168.1.20
    platform: 'ios'
    username: usuario_ssh
    password: password_ssh
    groups:
        - cisco_group

groups.yaml 

root@angel-pc:/home/angel/scripts/nornir# nano groups.yaml
---

cisco_group:
        platform: 'ios'



Una vez tenemos estos 3 archivos ya podríamos crear nuestro primer script en Nornir.

Creamos nuestro script en nano y lo llamamos nornir_script1.py (fijaros que el script está en formato Python)

root@angel-pc:/home/angel/scripts/nornir# nano nornir_script1.py 

Luego incluimos el siguiente código:

from nornir import InitNornir
from nornir_napalm.plugins.tasks import napalm_get

import pprint

nr = InitNornir(config_file="/home/angel/scripts/nornir/config.yaml")
rtr = nr.filter(name="SW1")
r = rtr.run(
    task=napalm_get,
    getters=["facts"]
)
pprint.pprint(r["SW1"][0].result)


Con este primer script básico lo que conseguiremos es conectarnos a SW1 (192.168.1.10) via SSH y conseguir la siguiente información del dispositivo de red mediante la libreria en python de NAPALM

Para ello ejecutamos el script:

root@angel-pc:/home/angel/scripts/nornir# python3 nornir_script1.py 

y obtendremos el siguiente output:


{'facts': {'fqdn': 'SW1',
           'hostname': 'SW1,
           'interface_list': ['Vlan1',
                              'Vlan2',
                              'GigabitEthernet0/0',
                              'GigabitEthernet1/0/1',
                              'GigabitEthernet1/0/2',
                              'GigabitEthernet1/0/3',
                              'GigabitEthernet1/0/4',
                              'GigabitEthernet1/0/5',
                              'GigabitEthernet1/0/6',
                              'GigabitEthernet1/0/7',
                              'GigabitEthernet1/0/8',
                              'GigabitEthernet1/0/9',
                              'GigabitEthernet1/0/10',
                              'GigabitEthernet1/0/11',
                              'GigabitEthernet1/0/12',
                              'GigabitEthernet1/0/13',
                              'GigabitEthernet1/0/14',
                              'GigabitEthernet1/0/15',
                              'GigabitEthernet1/0/16',
                              'GigabitEthernet1/0/17',
                              'GigabitEthernet1/0/18',
                              'GigabitEthernet1/0/19',
                              'GigabitEthernet1/0/20',
                              'GigabitEthernet1/0/21',
                              'GigabitEthernet1/0/22',
                              'GigabitEthernet1/0/23',
                              'GigabitEthernet1/0/24',
                              'GigabitEthernet1/0/25',
                              'GigabitEthernet1/0/26',
                              'GigabitEthernet1/0/27',
                              'GigabitEthernet1/0/28',
                              'GigabitEthernet1/0/29',
                              'GigabitEthernet1/0/30',
                              'GigabitEthernet1/0/31',
                              'GigabitEthernet1/0/32',
                              'GigabitEthernet1/0/33',
                              'GigabitEthernet1/0/34',
                              'GigabitEthernet1/0/35',
                              'GigabitEthernet1/0/36',
                              'GigabitEthernet1/0/37',
                              'GigabitEthernet1/0/38',
                              'GigabitEthernet1/0/39',
                              'GigabitEthernet1/0/40',
                              'GigabitEthernet1/0/41',
                              'GigabitEthernet1/0/42',
                              'GigabitEthernet1/0/43',
                              'GigabitEthernet1/0/44',
                              'GigabitEthernet1/0/45',
                              'GigabitEthernet1/0/46',
                              'GigabitEthernet1/0/47',
                              'GigabitEthernet1/0/48',
                              'GigabitEthernet1/1/1',
                              'GigabitEthernet1/1/2',
                              'GigabitEthernet1/1/3',
                              'GigabitEthernet1/1/4',
                              'Port-channel1'],
           'model': 'WS-C3650-48PS',
           'os_version': 'IOS-XE Software, Catalyst L3 Switch Software '
                         '(CAT3K_CAA-UNIVERSALK9-M), Version 03.06.06E RELEASE '
                         'SOFTWARE (fc1)',
           'serial_number': 'FDXXXXXYYY',
           'uptime': 24567884,
           'vendor': 'Cisco'}}



Esto es un sencillo script en Nornir que solo aplica para un dispositivo. Es mi primer script asi que tan pronto tenga más conocimiento de como realizar scripts en multiples dispositivos os iré informando!



Comentarios

Entradas populares de este blog

EVE-NG: Instalación de EVE-NG

Fortigate: Capturar paquetes (Packet capture/sniffer)

Cisco ISE | Certificados SSL públicos para Guest Portal