Configurar 50 switches manualmente es trabajo de días. Con Python y Netmiko, es trabajo de minutos. La automatización de redes ya no es opcional — es la habilidad que separa a los ingenieros de redes del futuro de los del pasado.

¿Qué es Netmiko?

Netmiko es una biblioteca Python que simplifica las conexiones SSH a dispositivos de red: routers Cisco, switches Juniper, firewalls Palo Alto y muchos más. Está construida sobre Paramiko (SSH para Python) pero agrega una capa de abstracción que hace que trabajar con CLI de dispositivos sea muy sencillo.

Instalación

# Instalar Netmiko
pip install netmiko

# Verificar instalación
python -c "import netmiko; print(netmiko.__version__)"

Conexión básica a un router Cisco

El bloque fundamental de cualquier script con Netmiko es el diccionario de dispositivo y la conexión:

from netmiko import ConnectHandler

# Definir el dispositivo
router = {
    'device_type': 'cisco_ios',    # tipo de dispositivo
    'host': '192.168.1.1',         # IP del dispositivo
    'username': 'admin',
    'password': 'cisco123',
    'secret': 'enable_pass',       # contraseña de enable (si aplica)
    'port': 22,                    # puerto SSH (22 por defecto)
}

# Conectar y ejecutar un comando
with ConnectHandler(**router) as conn:
    conn.enable()                          # entrar a modo privilegiado
    output = conn.send_command('show ip interface brief')
    print(output)

Tipos de dispositivos soportados

Netmiko soporta más de 80 tipos de dispositivos. Los más comunes:

Vendor device_type
Cisco IOS cisco_ios
Cisco NX-OS cisco_nxos
Juniper JunOS juniper_junos
MikroTik RouterOS mikrotik_routeros
Linux (SSH genérico) linux

Enviar configuración a múltiples dispositivos

Aquí es donde Netmiko realmente brilla. Imagina que necesitas configurar una VLAN en 20 switches:

from netmiko import ConnectHandler

# Lista de switches
switches = [
    {'host': '192.168.1.10', 'device_type': 'cisco_ios', 'username': 'admin', 'password': 'cisco123'},
    {'host': '192.168.1.11', 'device_type': 'cisco_ios', 'username': 'admin', 'password': 'cisco123'},
    {'host': '192.168.1.12', 'device_type': 'cisco_ios', 'username': 'admin', 'password': 'cisco123'},
    # ... más switches
]

# Comandos de configuración
nueva_vlan = [
    'vlan 100',
    'name ESTUDIANTES',
    'exit',
    'interface vlan 100',
    'description Red de estudiantes',
    'ip address 10.100.0.1 255.255.255.0',
    'no shutdown',
]

# Aplicar en todos los switches
for dispositivo in switches:
    try:
        with ConnectHandler(**dispositivo) as conn:
            conn.enable()
            output = conn.send_config_set(nueva_vlan)
            conn.save_config()  # equivale a "write memory"
            print(f"✅ {dispositivo['host']} — configurado correctamente")
    except Exception as e:
        print(f"❌ {dispositivo['host']} — Error: {e}")

Leer inventario desde un archivo

Para redes grandes, mantener los dispositivos en el script es impráctico. Lo mejor es leerlos desde un archivo CSV o YAML:

import csv
from netmiko import ConnectHandler

# dispositivos.csv:
# host,username,password,device_type
# 192.168.1.10,admin,cisco123,cisco_ios
# 192.168.1.11,admin,cisco123,cisco_ios

with open('dispositivos.csv') as f:
    reader = csv.DictReader(f)
    for row in reader:
        with ConnectHandler(**row) as conn:
            output = conn.send_command('show version | include Version')
            print(f"{row['host']}: {output.strip()}")

Guardar la salida en archivos de log

from netmiko import ConnectHandler
from datetime import datetime

fecha = datetime.now().strftime('%Y%m%d_%H%M')

router = {
    'device_type': 'cisco_ios',
    'host': '192.168.1.1',
    'username': 'admin',
    'password': 'cisco123',
}

comandos = ['show running-config', 'show ip route', 'show ip interface brief']

with ConnectHandler(**router) as conn:
    conn.enable()
    for cmd in comandos:
        output = conn.send_command(cmd)
        nombre_archivo = f"backup_{router['host']}_{cmd.replace(' ','_')}_{fecha}.txt"
        with open(nombre_archivo, 'w') as f:
            f.write(output)
        print(f"Guardado: {nombre_archivo}")

Conclusión

Netmiko democratiza la automatización de redes. Lo que antes requería conocimientos profundos de SNMP o herramientas caras como SolarWinds, hoy se puede hacer con 20 líneas de Python. Para un estudiante de redes, aprender Python + Netmiko es una ventaja competitiva enorme en el mercado laboral actual.

"Un ingeniero de redes que sabe Python no gestiona 50 dispositivos — gestiona 5000."