CISCO + Python + Netmiko
Python i biblioteka Netmiko mogą stanowić fantastyczne uzupełnienie codziennej pracy z urządzeniami CISCO. W poniższym wpisie pokaże jak wykonać dowolną komendę na urządzeniu z CISCO IOS przy pomocy skryptu Python.
Biblioteka netmiko wspiera oprócz urządzeń Cisco również masę innych produktów takich jak:
Regularly tested
Arista vEOS
Cisco ASA
Cisco IOS
Cisco IOS-XE
Cisco IOS-XR
Cisco NX-OS
Cisco SG300
HP Comware7
HP ProCurve
Juniper Junos
Linux
Limited testing
Alcatel AOS6/AOS8
Avaya ERS
Avaya VSP
Brocade VDX
Brocade ICX/FastIron
Brocade MLX/NetIron
Cisco WLC
Dell-Force10 DNOS9
Dell PowerConnect
Huawei
Mellanox
Palo Alto PAN-OS
Pluribus
Ubiquiti EdgeOS
Vyatta VyOS
Experimental
A10
Accedian
Alcatel-Lucent SR-OS
Aruba
Ciena SAOS
Cisco Telepresence
CheckPoint Gaia
Enterasys
Extreme EXOS
Extreme Wing
F5 LTM
Fortinet
MRV Communications OptiSwitch
W celu zainstalowania biblioteki netmiko wykonujemy następującą komendę:
pip install netmiko
Collecting netmiko Downloading netmiko-1.4.3.tar.gz (47kB) 100% |################################| 51kB 287kB/s Collecting paramiko>=1.13.0 (from netmiko) Downloading paramiko-2.3.1-py2.py3-none-any.whl (182kB) 100% |################################| 184kB 975kB/s Collecting scp>=0.10.0 (from netmiko) Downloading scp-0.10.2-py2.py3-none-any.whl Collecting pyyaml (from netmiko) Downloading PyYAML-3.12-cp27-cp27m-win_amd64.whl (197kB) 100% |################################| 204kB 1.2MB/s Collecting pynacl>=1.0.1 (from paramiko>=1.13.0->netmiko) Downloading PyNaCl-1.1.2-cp27-cp27m-win_amd64.whl (130kB) 100% |################################| 133kB 1.2MB/s Collecting cryptography>=1.5 (from paramiko>=1.13.0->netmiko) Downloading cryptography-2.1.2-cp27-cp27m-win_amd64.whl (1.3MB) 100% |################################| 1.3MB 660kB/s Collecting bcrypt>=3.1.3 (from paramiko>=1.13.0->netmiko) Downloading bcrypt-3.1.4-cp27-cp27m-win_amd64.whl Collecting pyasn1>=0.1.7 (from paramiko>=1.13.0->netmiko) Downloading pyasn1-0.3.7-py2.py3-none-any.whl (63kB) 100% |################################| 71kB 2.5MB/s Collecting six (from pynacl>=1.0.1->paramiko>=1.13.0->netmiko) Downloading six-1.11.0-py2.py3-none-any.whl Collecting cffi>=1.4.1 (from pynacl>=1.0.1->paramiko>=1.13.0->netmiko) Downloading cffi-1.11.2-cp27-cp27m-win_amd64.whl (163kB) 100% |################################| 163kB 2.4MB/s Collecting idna>=2.1 (from cryptography>=1.5->paramiko>=1.13.0->netmiko) Downloading idna-2.6-py2.py3-none-any.whl (56kB) 100% |################################| 61kB 4.4MB/s Collecting enum34; python_version < "3" (from cryptography>=1.5->paramiko>=1.13.0->netmiko) Downloading enum34-1.1.6-py2-none-any.whl Collecting asn1crypto>=0.21.0 (from cryptography>=1.5->paramiko>=1.13.0->netmiko) Downloading asn1crypto-0.23.0-py2.py3-none-any.whl (99kB) 100% |################################| 102kB 2.4MB/s Collecting ipaddress; python_version < "3" (from cryptography>=1.5->paramiko>=1.13.0->netmiko) Downloading ipaddress-1.0.18-py2-none-any.whl Collecting pycparser (from cffi>=1.4.1->pynacl>=1.0.1->paramiko>=1.13.0->netmiko) Downloading pycparser-2.18.tar.gz (245kB) 100% |################################| 256kB 2.6MB/s Installing collected packages: six, pycparser, cffi, pynacl, idna, enum34, asn1crypto, ipaddress, cryptography, bcrypt, pyasn1, paramiko, scp, pyyaml, netmiko Running setup.py install for pycparser ... done Running setup.py install for netmiko ... done Successfully installed asn1crypto-0.23.0 bcrypt-3.1.4 cffi-1.11.2 cryptography-2.1.2 enum34-1.1.6 idna-2.6 ipaddress-1.0.18 netmiko-1.4.3 paramiko-2.3.1 pyasn1-0.3.7 pycparser-2.18 pynacl-1.1.2 pyyaml-3.12 scp-0.10.2 six-1.11.0
PIERWSZY SKRYPT
Najpierw musimy zaimportować funkcję ConnectHandler z biblioteki netmiko. Następnie definiujemy słownik urządzeń sieciowych składający się z typu urządzenia, adresu IP, nazwy użytkownika i hasła, który reprezentuje urządzenie do którego chcemy nawiązać połączenie ssh. (netmiko umożliwia również połączenia telnet, należy w tym celu zmienić device_type z cisco_ios na cisco_ios_telnet).
W moim przypadku chcę się podłączyć przez ssh do routera R1 o adresie IP 192.168.174.200 korzystając z użytkownika admin o haśle cisco.
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from netmiko import ConnectHandler >>> cisco = {'device_type':'cisco_ios','ip':'192.168.174.200','username':'admin','password':'cisco'} >>> net_connect = ConnectHandler(**cisco)
Po wydaniu ostatniej komendy net_connect = ConnectHandler(**cisco) następuję połączenie ssh do routera, można to zweryfikować logując się na urządzenie i wydając komendę: show users
R1#show users Line User Host(s) Idle Location * 0 con 0 idle 00:00:00 2 vty 0 admin idle 00:09:25 192.168.174.1 Interface User Mode Idle Peer Address
Teraz możemy wykonać dowolną komendę i wypisać ją na ekranie:
>>> output = net_connect.send_command('show ip int brief') >>> print output Interface IP-Address OK? Method Status Protocol FastEthernet0/0 192.168.174.200 YES manual up up FastEthernet1/0 10.0.10.1 YES NVRAM up up FastEthernet1/1 unassigned YES NVRAM administratively down down
>>> output = net_connect.send_command('show run') >>> print output Building configuration... Current configuration : 1175 bytes ! ! Last configuration change at 17:59:31 UTC Wed Oct 25 2017 ! version 15.2 service timestamps debug datetime msec service timestamps log datetime msec ! hostname R1 ! boot-start-marker boot-end-marker ! ! ! no aaa new-model no ip icmp rate-limit unreachable ip cef ! ! ! no ip domain lookup ip domain name cisco no ipv6 cef ! ! multilink bundle-name authenticated ! ! ! username admin privilege 15 secret 5 $1$EVqH$s80zvoLdjFQM88a6ifTpA/ ! ! ip tcp synwait-time 5 ! ! ! interface FastEthernet0/0 ip address 192.168.174.200 255.255.255.0 duplex full ! interface FastEthernet1/0 ip address 10.0.10.1 255.255.255.0 speed auto duplex auto ! interface FastEthernet1/1 no ip address shutdown speed auto duplex auto ! ip forward-protocol nd ! ! ip http server no ip http secure-server ip route 0.0.0.0 0.0.0.0 192.168.174.1 ! ! ! control-plane ! ! line con 0 exec-timeout 0 0 privilege level 15 logging synchronous stopbits 1 line aux 0 exec-timeout 0 0 privilege level 15 logging synchronous stopbits 1 line vty 0 4 login local transport input ssh ! ! end
Kilka przydatnych metod dostępnych w netmiko:
- net_connect.config_mode() — Enter into config mode
- net_connect.check_config_mode() — Check if you are in config mode, return a boolean
- net_connect.exit_config_mode() — Exit config mode
- net_connect.clear_buffer() — Clear the output buffer on the remote device
- net_connect.enable() — Enter enable mode
- net_connect.exit_enable_mode() — Exit enable mode
- net_connect.find_prompt() — Return the current router prompt
- net_connect.commit(arguments) — Execute a commit action on Juniper and IOS-XR
- net_connect.disconnect() — Close the SSH connection
- net_connect.send_command(arguments) — Send command down the SSH channel, return output back
- net_connect.send_config_set(arguments) — Send a set of configuration commands to remote device
- net_connect.send_config_from_file(arguments) — Send a set of configuration commands loaded from a file
W dalszych wpisach pokażę więcej możliwości i przykładowe skrypty z wykorzystaniem biblioteki netmiko.