> ## Content Index
> Fetch the complete content index at: https://innasiec.pl/llms.txt
> Use this file to discover other available public pages before exploring further.

# Automatyzacja Sieci z Netmiko i Python - Przewodnik dla Początkujących
- URL: https://innasiec.pl/automatyzacja-sieci-z-netmiko/
- Published: 2022-05-16T07:00:00.000Z
- Updated: 2025-01-10T11:37:44.000Z
- Author: Rafał Rudewicz
- Tags: #wordpress, NetDevOps, #syntax-highlight, #toc

**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.**

```shell
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.

```shell
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

```python
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:

```Shell
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.

```Python
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 t**worzymy 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.

```Python
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.

```Python
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?

```python
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!**