Netmiko

Dernière modification le 11 janvier 2020

Netmiko est une librairie Python multi-vendeurs pour simplifier l’accès SSH aux équipements à l’aide de la librairie Paramiko.

Netmiko supporte de nombreux constructeurs qui sont classés en trois catégories :

  • Regularly Tested
  • Limited Testing
  • Experimental

Les constructeurs que j’ai pour habitude de mettre en avant dans le domaine NetDevOps : Juniper, Cisco, Cumulus et Arista constituent la quasi totalité de la catégorie « Regularly Tested ». En 2016, j’ai écrit le module Alcatel AOS pour Netmiko, mais dans la mesure où je ne le maintiens plus et où peu de personnes l’utilisent régulièrement, il est passé dans la catégorie « Limited Testing ».

L’installation est très simple : pip3 install netmiko

Exemple d’usage :

#!/usr/bin/env python3

from netmiko import ConnectHandler
from netmiko.ssh_exception import NetMikoTimeoutException
from netmiko.ssh_exception import NetMikoAuthenticationException
from paramiko.ssh_exception import SSHException
from colorama import init, Fore

# Devices list
vqfx01 = {
  'device_type': 'juniper',
  'ip': 'localhost',
  'username' : 'root',
  'password' : 'Juniper',
  'port' : '2222'
}
all_vqfx = [
  vqfx01
]

# Show command function
def show_command(command, search):
  output = net_connect.send_command(command)
  print (
    '\nCommand: {0}{1} \n'
    .format(
      Fore.BLUE,
      command
    )
  )
  for single_line in output.splitlines():
    if search in single_line:
      print (single_line)

# Set command function
def set_command(command):
  net_connect.send_command('cli')
  net_connect.config_mode()
  net_connect.send_command(command)
  net_connect.commit(comment='Enabled NETCONF service', and_quit=True)

# Main process
init(autoreset=True)
for a_vqfx in all_vqfx:
  try:
    net_connect = ConnectHandler(**a_vqfx)
    print (
      '\n\n{0}{1} Device: {2} port: {3} {4}'
      .format(
         Fore.GREEN,
         '>'*10,
         a_vqfx['ip'],
         a_vqfx['port'],
         '<'*10
      )
    )
    show_command('show configuration', 'netconf')
    print (
      '\n{0}{1} \n'
      .format(
        Fore.BLUE,
        'Applying netconf configuration'
      )
    )
    set_command('set system services netconf ssh')
    show_command('show configuration', 'netconf')
    print ('\n')
  except NetMikoTimeoutException:
    print (
      '\n\n{0}{1} Device: {2} port: {3} {4} {5}'
      .format(
        Fore.RED,
        '>'*10,
        a_vqfx['ip'],
        a_vqfx['port'],
        'not reachable',
        '<'*10
      )
    )
  except NetMikoAuthenticationException:
    print (
      '\n\n{0}{1} Device: {2} port: {3} {4} {5}'
      .format(
        Fore.RED,
        '>'*10,
        a_vqfx['ip'],
        a_vqfx['port'],
        'authentication failure',
        '<'*10
      )
    )
  except SSHException:
    print (
      '\n\n{0}{1} Device: {2} port: {3} {4} {5}'
      .format(
        Fore.RED,
        '>'*10,
        a_vqfx['ip'],
        a_vqfx['port'],
        'SSH issue',
        '<'*10
      )
    )
  else:
    net_connect.disconnect()