Automatyzacja sieci z Netmiko

Napisz swój pierwszy skrypt do automatyzacji sieci w Pythonie z wykorzystaniem biblioteki Netmiko. Dowiesz się, jak nawiązać zdalne połączenie ze sprzętem sieciowym, jak podejrzeć konfigurację i ją zmodyfikować.
Automatyzacja Sieci z Netmiko

Netmiko to biblioteka napisana w Pythonie przez Kirka Byersa. Jest jedną z najłatwiejszych opcji wejścia w świat automatyzacji sieci. Dlaczego? Ponieważ Netmiko wykorzystuje Pythonową bibliotekę Paramiko do łączenia się poprzez SSH do CLI. Wszystkie przekazywane przez nasz program polecenia są już Ci świetnie znane z obcowania z CLI danego producenta.

Instalacja Netmiko

Zanim zabierzemy się za nasz pierwszy skrypt, musimy zainstalować Pythona oraz  Netmiko. Ponieważ nie jest to standardowa biblioteka Pythona, zanim zaczniemy z niej korzystać, musimy ją doinstalować. Bez obaw, Python ma świetny manager bibliotek – pip, dzięki któremu możemy zainstalować brakującą bibliotekę.

pip install netmiko

Choć kod Pythona można pisać nawet w notatniku, gorąco polecam zaopatrzyć się w IDE, czyli specjalne środowisko programistyczne. Ułatwi Ci to i przyspieszy pracę, choćby przez podświetlenie składni. Osobiście korzystam z Pycharm lub Visual Studio Code.

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 [email protected]
[email protected]'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 z getpass

Zapisywanie haseł jawnym tekstem jest bardzo złym pomysłem 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 pozwala na bezpieczną obsługę haseł. Wprowadzane przez użytkownika hasło nie będzie wyświetlane na ekranie. W naszym skrypcie tworzymy kolejną zmienną o nazwie passwd (nazwa dowolna), która poprosi użytkownika o podanie hasła i przechowa je w pamięci jako ciąg znaków (ang. string). Następnie tak utworzone 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 dla danego użytkownika poziom uprawnień. Dla większości poleceń typu show będzie to wystarczające. Jednak część poleceń 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, ci zaś mogą posługiwać się odmiennymi zestawami 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()

Jak widzisz, zastosowaliśmy również metodę exit_config_mode(), aby wyjść z trybu konfiguracyjnego i wrócić do trybu uprzywilejowanego, w celu sprawdzenia wprowadzonych zmian.

Zakończenie skryptu przez użytkownika

W obecnej formie skrypt wykonuje nasze instrukcje i po wykonaniu zadania ulega zamknięciu. Co, jednak gdybyśmy chcieli zobaczyć co 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 ze wbudowanej w Pythona funkcji input(). Wyświetla ona tekst na ekranie oraz oczekuje na interakcję ze strony użytkownika. Dzięki temu 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 zastosowaniem Netmiko. Teraz już wiesz, w jaki sposób możesz sprawnie podłączyć się do zdalnego urządzenia, zmienić konfigurację oraz wykonać wiele poleceń typu show.

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

19 aplikacji, które musi znać każdy sieciowiec

Blog wspiera partner diamentowy

Borg5 - Diamentowy partner bloga

Narzędziownik sieciowca

19 aplikacji newsletter

Grupa na Facebooku

Pierwsze kroki w sieciach

Najnowsze artykuły

Jak zadbać o bezpieczeństwo BGP?

Jak zadbać o bezpieczeństwo BGP?

Podcast w wersji wideoSłuchaj na spotifyZ podcastu dowiesz się Czy czeka nas rok IPv6? Czym różnią się sieci Service Provider od sieci Enterprise? Dlaczego Border Gateway Protocol to najlepszy protokół routingu? Kiedy warto wdrożyć BGP? Jakie zagrożenia wiążą się ze...

Monitoring infrastruktury

Monitoring infrastruktury

Podcast w wersji wideoSłuchaj na spotifyZ podcastu dowiesz się Czym monitorować infrastrukturę? i dlaczego Zabbix jest najlepszą opcją monitoringu? Jakie mamy alternatywy dla Zabbixa i kiedy warto rozważyć ich wdrożenie?  Jakie wyzwania stawia wdrożenie monitoringu...

Nadchodzi PLNOG 30!

Nadchodzi PLNOG 30!

Najstarsza w Polsce, telekomunikacyjna konferencja powraca w formie stacjonarnej. Tej jesieni, 6-7 września, daj się porwać w pasjonującą kosmiczną podróż z najnowszymi technologiami i inspirującymi rozwiązaniami. Razem z najlepszymi specjalistami rynku telco...

Czym jest chmura obliczeniowa?

Czym jest chmura obliczeniowa?

Podcast w wersji wideoSłuchaj na spotifyZ podcastu dowiesz się Czym jest chmura obliczeniowa? Jakie są zalety chmury? W jakich przypadkach warto wdrożyć chmurę? Jak nie pójść z torbami korzystając z chmury? Jak wygląda bezpieczeństwo w chmurze? Czy chmura zabierze...

bITconf 2022 – Bydgoska konferencja IT

bITconf 2022 – Bydgoska konferencja IT

bITconf 2022 – święto bydgoskiego IT  Już we wrześniu, po dwóch latach przerwy, odbędzie się największa konferencja technologiczna w województwie kujawsko – pomorskim. bITconf 2020, czyli Bydgoszcz IT conference, to konferencja organizowana przez lokalne społeczności...

Jesteśmy partnerem  konferencji

PLNOG
Bydgoszcz konferencja IT

O autorze

Rafał Rudewicz

Specjalizuję się w rozwiązaniach Enterprise oraz Service Provider. Projektuję, wdrażam oraz naprawiam sieci dla największych firm na świecie.

Komentarze

0 komentarzy

Wyślij komentarz

Twój adres e-mail nie zostanie opublikowany.

Powiązane posty

Nie znaleziono żadnych wyników

Nie znaleziono szukanej strony. Proszę spróbować innej definicji wyszukiwania lub zlokalizować wpis przy użyciu nawigacji powyżej.

Zapisz się na newsletter