DevNet

Automatyzacja sieci z Netmiko

Automatyzacja Sieci z Netmiko
W: DevNet

Netmiko to biblioteka napisana w języku Python przez Kirka Byersa. Jest jedną z najłatwiejszych opcji wejścia w świat automatyzacji sieci.
Dlaczego? Ponieważ Netmiko wykorzystuje bibliotekę Pythona o nazwie Paramiko do nawiązywania połączeń poprzez SSH z interfejsami wiersza poleceń (CLI). Wszystkie polecenia przekazywane przez nasz program są już Ci dobrze znane z korzystania z interfejsu wiersza poleceń danego producenta.

Instalacja Netmiko

Zanim przystąpimy do napisania naszego pierwszego skryptu, musimy zainstalować Pythona oraz Netmiko. Ponieważ Netmiko nie jest standardową biblioteką Pythona, musimy ją najpierw zainstalować. Na szczęście Python posiada doskonały menedżer pakietów - pip, który umożliwia łatwą instalację brakującej biblioteki.

pip install netmiko 

Zanim zaczniesz

Zanim przejdziemy do samego pisania kodu, trzeba zrobić jeszcze kilka rzeczy. Przede wszystkim upewnij się, że masz dostęp do urządzenia, na którym będziesz testował swój program.

W moim przypadku będzie to wirtualny router Cisco w labie.

ping 172.31.5.176
Pinging 172.31.5.176 with 32 bytes of data:
Reply from 172.31.5.176: bytes=32 time=22ms TTL=254
Reply from 172.31.5.176: bytes=32 time=25ms TTL=254
Reply from 172.31.5.176: bytes=32 time=23ms TTL=254
ssh cisco@172.31.5.176
cisco@172.31.5.176's password:
BDG-ACCR-01>

Pierwszy skrypt z netmiko

from netmiko import ConnectHandler
connection = ConnectHandler(
device_type='cisco_ios',
host='172.31.5.176',  
username='cisco', 
password='cisco')

output = connection.send_command('show ip interface brief')

print(output)
print('Zamykam polaczenie')

connection.disconnect()

Prześledźmy teraz, krok po kroku, co się dzieje w naszym kodzie:

  • Importujemy klasę ConnectHandler z biblioteki Netmiko.
  • Tworzymy obiekt connection (dowolna nazwa), wywołując konstruktor klasy ConnectHandler z pewnymi parametrami:
    • device_type,
    • host,
    • username,
    • password,
  • Tworzymy zmienną output (dowolna nazwa), która używa metody send_command() do przekazania polecenia do routera.
  • Wbudowana funkcja print() wyrzuca na okno konsoli informacje zwrócone przez router oraz napis o zakończeniu sesji.
  • Metoda disconnect() kończy sesję SSH.

Zobaczmy teraz, co się stanie po uruchomieniu skryptu:

C:/Users/RafałRudewicz/PycharmProjects/pierwszy_skrypt/main.py
Interface          IP-Address   OK? Method Status                Protocol
GigabitEthernet0/0 172.31.5.176 YES DHCP   up up 
GigabitEthernet0/1 10.1.1.10    YES NVRAM  administratively down down 
GigabitEthernet0/2 unassigned   YES unset  administratively down down 
GigabitEthernet0/3 unassigned   YES unset  administratively down down 
Zamykam polaczenie

Zabezpiecz hasła za pomocą getpass.

Zapisywanie haseł w postaci jawnego tekstu jest bardzo niebezpieczne i poza testami należy unikać takiego rozwiązania.

from netmiko import ConnectHandler
import getpass

passwd = getpass.getpass('Podaj haslo: ') 
connection = ConnectHandler( 
device_type='cisco_ios',
host='172.31.5.176', 
username='cisco', 
password=passwd)

output=connection.send_command('show ip interface brief')

print(output) 
print('Zamykam polaczenie')

connection.disconnect()

Biblioteka getpass umożliwia bezpieczną obsługę haseł. Wprowadzone przez użytkownika hasło nie będzie wyświetlane na ekranie.

W naszym skrypcie tworzymy nową zmienną o nazwie passwd, która prosi użytkownika o podanie hasła i przechowuje je w pamięci jako ciąg znaków (string). Następnie to wprowadzone hasło zostanie przekazane jako wartość parametru password.

Przejście do trybu uprzywilejowanego – enable

Netmiko, łącząc się z urządzeniem, będzie posiadać domyślny poziom uprawnień dla danego użytkownika.

Dla większości poleceń typu show będzie to wystarczające. Jednak niektóre polecenia oraz edycja konfiguracji wymagają podniesienia uprawnień i przejścia w tryb enable. Dlatego wprowadzimy pewne modyfikacje w skrypcie.

from netmiko import ConnectHandler
import getpass

passwd = getpass.getpass('Podaj haslo: ') 
connection = ConnectHandler( 
device_type='cisco_ios',
host='172.31.5.176', 
username='cisco', 
password=passwd, 
secret=passwd) 

connection.enable() 
output=connection.send_command('show run') 

print(output) 
print('Zamykam polaczenie') 

connection.disconnect()

Dla tworzonego obiektu connection przekazujemy teraz również parametr secret, który przechowuje hasło enable.

Dla uproszczenia przyjęliśmy założenie, że oba hasła użytkownika są identyczne. W celu podniesienia uprawnień i przejścia do trybu uprzywilejowanego używamy metody enable() na naszym obiekcie connection.

Przejście do trybu konfiguracyjnego

Aby przejść do trybu konfiguracyjnego w Netmiko, mamy w zasadzie dwie opcje. Jedną z nich jest użycie znanej już metody send_command() z poleceniem configure terminal. Jednak bardziej elegancką i preferowaną opcją jest użycie metody config_mode().

Dlaczego tak?
Netmiko potrafi obsługiwać wiele typów urządzeń od różnych producentów, którzy mogą używać odmiennych zestawów poleceń dla trybu konfiguracyjnego.

from netmiko import ConnectHandler
import getpass
 

passwd = getpass.getpass('Podaj haslo: ')
connection = ConnectHandler(
device_type='cisco_ios',
host='172.31.5.176',
username='cisco',
password=passwd,
secret=passwd)
connection.enable()
connection.config_mode()
connection.send_command('hostname BDG-ACCR-01')
connection.exit_config_mode()
output=connection.send_command('show run | i hostname')

print(output)
print('Zamykam polaczenie')
connection.disconnect()

Zastosowaliśmy również metodę exit_config_mode(), aby opuścić tryb konfiguracyjny i powrócić do trybu uprzywilejowanego w celu sprawdzenia wprowadzonych zmian.

Zakończenie skryptu przez użytkownika

W obecnej formie skrypt wykonuje nasze instrukcje i po zakończeniu zadania się zamyka.

Co jednak, jeśli chcielibyśmy zobaczyć wprowadzone zmiany?

from netmiko import ConnectHandler
import getpass
 

passwd = getpass.getpass('Podaj haslo: ')
connection = ConnectHandler(
device_type='cisco_ios',
host='172.31.5.176',
username='cisco',
password=passwd,
secret=passwd)
connection.enable()
connection.config_mode()
connection.send_command('hostname BDG-ACCR-01')
connection.exit_config_mode()
output=connection.send_command('show run | i hostname')

print(output)
input("Nacisnij Enter by zakonczyc...")
print('Zamykam polaczenie')
connection.disconnect()

W tym celu skorzystaliśmy z wbudowanej funkcji input() w Pythonie. Funkcja ta wyświetla tekst na ekranie i oczekuje na interakcję użytkownika, dzięki czemu nasz program nie zostanie zamknięty bez naszej zgody.

Podsumowanie

Gratulacje, właśnie dowiedziałeś się, jak napisać swój pierwszy skrypt do automatyzacji sieci z wykorzystaniem Netmiko. Teraz wiesz, jak sprawnie podłączyć się do zdalnego urządzenia, zmienić konfigurację oraz wykonać wiele poleceń typu show.

Daj znać w komentarzu, czy miałeś wcześniej styczność z automatyzacją sieci!

Napisane przez
Rafał Rudewicz
Pasjonat sieci komputerowych i automatyzacji. CCNP Enterprise & DevNet Specialist. IP/MPLS SME. Dołącz do mnie, aby razem odkrywać fascynujący świat technologii!
Komentarze
Spis treści
Świetnie! Udało ci się pomyślnie zarejestrować.
Witaj z powrotem! Zalogowałeś się pomyślnie.
Pomyślnie subskrybowałeś Inna Sieć.
Twój link wygasł.
Sukces! Sprawdź swoją skrzynkę e-mailową, aby uzyskać magiczny link do logowania.
Sukces! Twoje informacje rozliczeniowe zostały zaktualizowane.
Twoje informacje rozliczeniowe nie zostały zaktualizowane.