Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00053 006285 19031116 na godz. na dobę w sumie
Zautomatyzuj swoją firmę z Pythonem. Praktyczne rozwiązania dla firmowej sieci - książka
Zautomatyzuj swoją firmę z Pythonem. Praktyczne rozwiązania dla firmowej sieci - książka
Autor: Liczba stron: 320
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-5331-2 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> python - programowanie
Porównaj ceny (książka, ebook (-35%), audiobook).

Żadna współczesna firma nie może funkcjonować bez rozwiązań IT. Co więcej, stale trzeba mieć na uwadze wzrost wymagań wobec systemów informatycznych i konieczność wdrażania kolejnych aplikacji. Poza tym nie można ani na chwilę zapominać o kwestiach cyberbezpieczeństwa - ryzyko naruszenia integralności i bezpieczeństwa danych spędza sen z powiek wielu administratorom. Jeśli do tego dodać standardowe zadania związane z bieżącym działaniem firmowej sieci, okaże się, że praca administratora nie jest ani łatwa, ani prosta. Ratunkiem może być automatyzacja, która znacznie usprawnia czynności administracyjne.

Książka jest przeznaczona dla administratorów sieci, którzy chcą wykorzystać Pythona do zautomatyzowania części swoich obowiązków. Pokazano tu kilka praktycznych przykładów takiego zastosowania Pythona oraz narzędzi Ansible i Python Fabric, opisano też techniki konfiguracji serwera. Szczegółowo przedstawiono sposoby automatyzacji zadań związanych z zarządzaniem użytkownikami, bazą danych oraz procesami. Znalazły się tu również wskazówki ułatwiające pisanie skryptów dla usług testowych oraz przygotowanie automatyzacji pracy na maszynach wirtualnych i w środowisku chmurowym. W końcowych rozdziałach zaprezentowano niezwykle ważne zagadnienia bezpieczeństwa wraz z możliwościami automatyzacji w tym zakresie.

Najważniejsze zagadnienia przedstawione w książce:

Automatyzacja zadań - najlepszy przyjaciel najlepszych adminów!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Hands-On Enterprise Automation with Python: Automate common administrative and security tasks with Python Tłumaczenie: Łukasz Wójcicki ISBN: 978-83-283-5331-2 Copyright © Packt Publishing 2018. First published in the English language under the title ‘Hands-On Enterprise Automation with Python – (9781788998512)’ Polish edition copyright © 2019 by Helion SA All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Helion SA ul. Kościuszki 1c, 44-100 Gliwice tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/zafipy.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/zafipy Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:258)ci O autorze O recenzencie Przedmowa Rozdzia(cid:239) 1. Przygotowanie (cid:258)rodowiska pracy Wprowadzenie do j(cid:218)zyka Python Wersje j(cid:218)zyka Python Czy to oznacza, (cid:285)e nie mog(cid:218) napisa(cid:202) programu, który b(cid:218)dzie dzia(cid:239)a(cid:239) jednocze(cid:258)nie dla Pythona w wersji 2 i 3? Instalacja j(cid:218)zyka Python Instalacja PyCharm IDE Konfiguracja projektu za pomoc(cid:200) PyCharma W(cid:239)a(cid:258)ciwo(cid:258)ci (cid:258)rodowiska PyCharm Debugowanie kodu Refaktoryzacja kodu Instalacja pakietów za po(cid:258)rednictwem GUI Podsumowanie Rozdzia(cid:239) 2. Biblioteki stosowane do automatyzacji zada(cid:241) Pakiety Pythona (cid:165)cie(cid:285)ki wyszukiwania pakietów Podstawowe biblioteki Pythona Biblioteki sieciowe Biblioteki do obs(cid:239)ugi systemu i chmury Dost(cid:218)p do kodu (cid:283)ród(cid:239)owego modu(cid:239)u Wizualizacja kodu Pythona Podsumowanie 9 10 11 17 17 18 19 20 22 25 29 29 30 32 34 35 35 36 37 37 39 40 42 45 Poleć książkęKup książkę Spis tre(cid:286)ci Rozdzia(cid:239) 3. Konfigurowanie sieciowego (cid:258)rodowiska laboratoryjnego Wymagania techniczne Kiedy i jak zautomatyzowa(cid:202) zadania w sieci? Dlaczego potrzebujemy automatyzacji? Screen scraping czy API — czego u(cid:285)ywa(cid:202) w automatyzacji? Dlaczego warto wykorzysta(cid:202) Python do automatyzacji zada(cid:241) sieciowych? Przysz(cid:239)o(cid:258)(cid:202) automatyzacji zada(cid:241) sieciowych Konfiguracja laboratorium Instalacja EVE-NG Instalacja na VMware Workstation Instalacja poprzez VMware ESXi Instalacja poprzez Red Hat KVM Dost(cid:218)p do EVE-NG Instalacja pakietu EVE-NG dla klienta (cid:146)adowanie obrazów do EVE-NG Budowanie topologii sieci Dodanie nowych w(cid:218)z(cid:239)ów (cid:146)(cid:200)czenie w(cid:218)z(cid:239)ów Podsumowanie Rozdzia(cid:239) 4. Zarz(cid:200)dzanie urz(cid:200)dzeniami sieciowymi za pomoc(cid:200) j(cid:218)zyka Python Wymagania techniczne Python i SSH Modu(cid:239) Paramiko Modu(cid:239) Netmiko Wykorzystanie protoko(cid:239)u Telnet za pomoc(cid:200) Pythona Zmiana konfiguracji poprzez telnetlib Praca z sieciami z wykorzystaniem biblioteki netaddr Instalowanie modu(cid:239)u netaddr Metody modu(cid:239)u netaddr Przyk(cid:239)adowe przypadki u(cid:285)ycia Konfiguracja kopii zapasowej urz(cid:200)dzenia Utworzenie w(cid:239)asnego terminala dost(cid:218)powego Odczyt danych z arkusza Excela Wi(cid:218)cej przyk(cid:239)adów Podsumowanie Rozdzia(cid:239) 5. Pobieranie u(cid:285)ytecznych informacji z urz(cid:200)dze(cid:241) sieciowych Wymagania techniczne Zasada dzia(cid:239)ania parserów Wprowadzenie do wyra(cid:285)e(cid:241) regularnych Tworzenie wyra(cid:285)e(cid:241) regularnych za pomoc(cid:200) Pythona Audyt konfiguracji za pomoc(cid:200) biblioteki CiscoConfParse Biblioteka CiscoConfParse Wspierani producenci Instalacja biblioteki CiscoConfParse Praca z bibliotek(cid:200) CiscoConfParse 4 47 47 48 48 48 49 50 51 51 52 54 55 56 60 61 61 62 63 65 67 68 68 68 71 77 80 82 82 83 85 85 88 90 92 93 95 96 96 96 98 104 104 105 105 106 Poleć książkęKup książkę Wizualizacja danych za pomoc(cid:200) biblioteki MatplotLib Instalacja biblioteki Matplotlib (cid:109)wiczenia z bibliotek(cid:200) Matplotlib Wizualizacja danych protoko(cid:239)u SNMP za pomoc(cid:200) biblioteki Matplotlib Podsumowanie Rozdzia(cid:239) 6. Tworzenie konfiguracji przy u(cid:285)yciu j(cid:218)zyków Python i Jinja2 Co to jest YAML? Formatowanie plików YAML Tworzenie konfiguracji przy u(cid:285)yciu Jinja2 Odczyt szablonów z pliku U(cid:285)ywanie p(cid:218)tli i operacji warunkowych w Jinja2 Podsumowanie Rozdzia(cid:239) 7. Równoleg(cid:239)e wykonywanie skryptu w j(cid:218)zyku Python W jaki sposób system operacyjny wykonuje kod Pythona? Biblioteka Pythona do przetwarzania wieloprocesowego Pierwsze kroki z przetwarzaniem wieloprocesowym Komunikacja wewn(cid:200)trzprocesowa Podsumowanie Rozdzia(cid:239) 8. Przygotowanie (cid:258)rodowiska laboratoryjnego Jak uzyska(cid:202) obraz systemu operacyjnego? Pobieranie dystrybucji CentOS Pobieranie dystrybucji Ubuntu Tworzenie maszyny do automatyzacji za pomoc(cid:200) hipernadzorcy Tworzenie maszyny Linuxowej za pomoc(cid:200) VMware ESXi Tworzenie maszyny Linuxowej za pomoc(cid:200) KVM Pierwsze kroki z Cobblerem Jak dzia(cid:239)a Cobbler? Instalacja Cobblera na serwerze automatyzacji Udost(cid:218)pnianie serwerów za po(cid:258)rednictwem Cobblera Podsumowanie Rozdzia(cid:239) 9. Modu(cid:239) subprocess Klasa Popen() Odczyt z stdin, stdout i stderr Funkcja call() Podsumowanie Rozdzia(cid:239) 10. Uruchamianie zada(cid:241) zwi(cid:200)zanych z administracj(cid:200) systemu za pomoc(cid:200) biblioteki Fabric Wymagania techniczne Co to jest Fabric? Instalacja Operacje biblioteki Fabric Spis tre(cid:286)ci 108 109 109 112 113 115 115 116 119 126 127 135 137 137 139 140 143 144 145 145 146 146 147 147 152 156 156 157 160 165 167 167 170 173 174 175 176 176 177 178 5 Poleć książkęKup książkę Spis tre(cid:286)ci Uruchomienie pierwszego pliku Fabric Wi(cid:218)cej na temat narz(cid:218)dzia fab Sprawdzanie stanu systemu za pomoc(cid:200) narz(cid:218)dzia Fabric Inne przydatne w(cid:239)a(cid:258)ciwo(cid:258)ci modu(cid:239)u Fabric Role Menad(cid:285)ery kontekstu Podsumowanie Rozdzia(cid:239) 11. Generowanie raportów i monitorowanie systemu Zbieranie danych w systemie Linux Wysy(cid:239)anie e-mailem wygenerowanych danych Wykorzystanie modu(cid:239)ów obs(cid:239)uguj(cid:200)cych dat(cid:218) i czas Regularne uruchamianie skryptu Zarz(cid:200)dzanie u(cid:285)ytkownikami za pomoc(cid:200) Ansible Linux Microsoft Windows Podsumowanie Rozdzia(cid:239) 12. Wspó(cid:239)praca z baz(cid:200) danych Instalacja MySQL na serwerze automatyzacji Zabezpieczanie zainstalowanej aplikacji Weryfikacja instalacji bazy danych Dost(cid:218)p do bazy danych MySQL z poziomu j(cid:218)zyka Python Wysy(cid:239)anie zapyta(cid:241) do bazy danych Wstawianie rekordów do bazy Podsumowanie Rozdzia(cid:239) 13. Administracja systemem za pomoc(cid:200) Ansible Terminologia Ansible Instalacja Ansible w systemie Linux Systemy RHEL i CentOS Ubuntu Korzystanie z Ansible w trybie ad hoc Jak dzia(cid:239)a Ansible? Tworzenie pierwszego playbooka Warunki, uchwyty i p(cid:218)tle Ansible Tworzenie warunków Tworzenie p(cid:218)tli w Ansible Uruchamianie zada(cid:241) za pomoc(cid:200) uchwytów Praca z faktami Ansible Praca z szablonami Ansible Podsumowanie 6 180 183 184 188 188 189 191 193 193 198 200 202 203 203 204 205 207 207 208 209 210 212 213 216 217 218 219 219 219 220 223 224 226 226 229 230 231 232 234 Poleć książkęKup książkę Rozdzia(cid:239) 14. Tworzenie maszyn wirtualnych VMware i zarz(cid:200)dzanie nimi Konfigurowanie (cid:258)rodowiska laboratoryjnego Tworzenie pliku VMX za pomoc(cid:200) Jinja2 Budowa szablonu VMX Obs(cid:239)uga danych z Excela Generowanie plików VMX Pythonowe klienty VMware Instalacja PyVmomi Pierwsze kroki z PyVmomi Zmiana stanu maszyny wirtualnej Wi(cid:218)cej przyk(cid:239)adów Zarz(cid:200)dzanie instancjami za pomoc(cid:200) playbooków Ansible Podsumowanie Rozdzia(cid:239) 15. Wspó(cid:239)praca z API OpenStack Dzia(cid:239)anie us(cid:239)ug sieciowych RESTful Konfigurowanie (cid:258)rodowiska pracy Instalacja pakietu rdo-OpenStack Tworzenie pliku odpowiedzi Edycja pliku odpowiedzi Uruchomienie packstat Dost(cid:218)p do GUI OpenStacka Wysy(cid:239)anie (cid:285)(cid:200)da(cid:241) do OpenStacka Tworzenie instancji za pomoc(cid:200) j(cid:218)zyka Python Tworzenie obrazu Ustawianie konfiguracji serwera (ustawianie flavorów) Tworzenie sieci i podsieci Uruchamianie instancji Zarz(cid:200)dzanie instancjami OpenStacka za pomoc(cid:200) Ansible Instalacja biblioteki Shade oraz Ansible Tworzenie playbooka Ansible Podsumowanie Rozdzia(cid:239) 16. Automatyzacja us(cid:239)ug AWS za pomoc(cid:200) Boto3 Modu(cid:239)y Pythona do obs(cid:239)ugi AWS Instalacja Boto3 Zarz(cid:200)dzanie instancjami AWS Usuwanie instancji Automatyzowanie us(cid:239)ug AWS S3 Tworzenie kube(cid:239)ków (cid:146)adowanie pliku do kube(cid:239)ka Usuwanie kube(cid:239)ka Podsumowanie Spis tre(cid:286)ci 235 235 238 238 241 243 250 251 252 256 257 257 260 261 262 263 264 264 265 265 265 266 269 269 271 272 274 275 276 276 279 281 281 282 284 285 286 286 287 287 288 7 Poleć książkęKup książkę Spis tre(cid:286)ci Rozdzia(cid:239) 17. Framework Scapy Zasada dzia(cid:239)ania frameworku Scapy Instalacja frameworku Scapy Systemy Unixowe Wsparcie dla systemów Windows i macOS Tworzenie pakietów za pomoc(cid:200) frameworku Scapy Przechwytywanie i modyfikowanie pakietów Wstrzykiwanie danych do pakietów Pods(cid:239)uchiwanie pakietów Zapisywanie pakietów do pliku pcap Podsumowanie Rozdzia(cid:239) 18. Budujemy skaner sieciowy za pomoc(cid:200) j(cid:218)zyka Python Zasada dzia(cid:239)ania skanera sieciowego Budujemy skaner sieciowy za pomoc(cid:200) j(cid:218)zyka Python Ulepszanie kodu Skanowanie us(cid:239)ug Wspó(cid:239)dzielenie kodu za pomoc(cid:200) GitHuba Tworzenie konta na GitHubie Tworzenie i (cid:239)adowanie kodu Podsumowanie Skorowidz 289 289 290 290 291 291 296 297 299 301 301 303 303 304 305 307 310 311 311 316 317 8 Poleć książkęKup książkę 4 Zarz(cid:200)dzanie urz(cid:200)dzeniami sieciowymi za pomoc(cid:200) j(cid:218)zyka Python Do tej pory nauczyli(cid:258)my si(cid:218), jak korzysta(cid:202) z Pythona w ró(cid:285)nych systemach operacyjnych, i do- wiedzieli(cid:258)my si(cid:218), jak zbudowa(cid:202) topologi(cid:218) sieci za pomoc(cid:200) narz(cid:218)dzia EVE-NG. W tym rozdziale nauczymy si(cid:218), jak korzysta(cid:202) z bibliotek sieciowych, które s(cid:239)u(cid:285)(cid:200) do automatyzacji ró(cid:285)nych zada(cid:241) sieciowych. Python mo(cid:285)e wspó(cid:239)pracowa(cid:202) z urz(cid:200)dzeniami na wielu warstwach sieci. Na pocz(cid:200)tku nauczymy si(cid:218) obs(cid:239)ugiwa(cid:202) warstw(cid:218) niskiego poziomu za pomoc(cid:200) programowania gniazd sieciowych i modu(cid:239)ów socket. Modu(cid:239)y socket dostarczaj(cid:200) interfejsów niskiego poziomu pomi(cid:218)dzy systemem operacyjnym (na którym pracuje Python) a urz(cid:200)dzeniem sieciowym. Po- nadto modu(cid:239)y Pythona mog(cid:200) wspó(cid:239)pracowa(cid:202) na wy(cid:285)szym poziomie poprzez Telnet, SSH i API. Z tego rozdzia(cid:239)u dowiemy si(cid:218) tak(cid:285)e, jak za pomoc(cid:200) Pythona ustanowi(cid:202) zdalne po(cid:239)(cid:200)czenia i jak wykona(cid:202) operacj(cid:218) na zdalnym urz(cid:200)dzeniu, korzystaj(cid:200)c z Telnetu i modu(cid:239)ów SSH. Tematy omówione w tym rozdziale: (cid:81) Jak po(cid:239)(cid:200)czy(cid:202) si(cid:218) z urz(cid:200)dzeniem za pomoc(cid:200) protoko(cid:239)u Telnet i j(cid:218)zyka Python (cid:81) Wspó(cid:239)praca Pythona z SSH (cid:81) Praca z sieciami za pomoc(cid:200) biblioteki netaddr (cid:81) Przyk(cid:239)ady wykorzystania metodologii automatyzacji pracy w sieciach (ang. network automation) Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem Wymagania techniczne Nale(cid:285)y mie(cid:202) zainstalowane nast(cid:218)puj(cid:200)ce narz(cid:218)dzia: (cid:81) Python 2.7.1x; (cid:81) darmowa wersja PyCharm Community lub p(cid:239)atna PyCharm Pro Edition; (cid:81) topologia EVE-NG (zobacz rozdzia(cid:239) 3., „Konfigurowanie sieciowego (cid:258)rodowiska laboratoryjnego”, aby si(cid:218) dowiedzie(cid:202), jak zainstalowa(cid:202) i skonfigurowa(cid:202) emulator). Przytoczone w tym rozdziale (cid:283)ród(cid:239)a skryptów mo(cid:285)esz znale(cid:283)(cid:202) na GitHubie pod adresem https:// github.com/TheNetworker/EnterpriseAutomation.git. Python i SSH W odró(cid:285)nieniu od Telnetu protokó(cid:239) SSH tworzy bezpieczny kana(cid:239) komunikacji mi(cid:218)dzy klientem i serwerem. Utworzony tunel zabezpieczony jest za pomoc(cid:200) ró(cid:285)nych algorytmów szyfruj(cid:200)cych, które skutecznie utrudniaj(cid:200) deszyfracj(cid:218) przesy(cid:239)anych tre(cid:258)ci. Specjali(cid:258)ci ds. sieci w pierwszej kolejno(cid:258)ci decyduj(cid:200) si(cid:218) na u(cid:285)ycie SSH do zabezpieczania swoich ko(cid:241)cówek sieciowych. Python mo(cid:285)e komunikowa(cid:202) si(cid:218) z urz(cid:200)dzeniami sieciowymi za pomoc(cid:200) protoko(cid:239)u SSH, wyko- rzystuj(cid:200)c popularn(cid:200) bibliotek(cid:218) Paramiko. Paramiko wspiera mechanizmy uwierzytelnienia, algo- rytmy wymiany klucza (DSA, RSA, ECDSA i ED25519) oraz wiele innych w(cid:239)a(cid:258)ciwo(cid:258)ci SSH (np. komend(cid:218) proxy i SFTP). Modu(cid:239) Paramiko Paramiko jest najpopularniejszym modu(cid:239)em do obs(cid:239)ugi protoko(cid:239)u SSH za pomoc(cid:200) j(cid:218)zyka Python. Na oficjalnej stronie modu(cid:239)u (na GitHubie) mo(cid:285)emy dowiedzie(cid:202) si(cid:218), (cid:285)e nazwa Paramiko powsta(cid:239)a jako kombinacja dwóch s(cid:239)ów z j(cid:218)zyka esperanto oznaczaj(cid:200)cych „paranoidalny” i „przyja- ciel”. Modu(cid:239) zosta(cid:239) napisany w j(cid:218)zyku Python — poza kilkoma funkcjami (np. kryptograficznymi), które zosta(cid:239)y napisane w j(cid:218)zyku C. Wi(cid:218)cej informacji na temat twórców i historii Paramiko mo(cid:285)esz znale(cid:283)(cid:202) na oficjalnej stronie modu(cid:239)u, pod adresem https://github.com/paramiko/paramiko. Instalacja modu(cid:239)u Je(cid:285)eli pracujesz pod systemem Windows, otwórz konsol(cid:218) polece(cid:241) za pomoc(cid:200) polecenia cmd. Je(cid:285)eli pracujesz pod systemem Linux, skorzystaj z pow(cid:239)oki. Musimy pobra(cid:202) najnowszy modu(cid:239) Paramiko z PyPI (Python Package Index). Dodatkowo zostan(cid:200) pobrane pakiety powi(cid:200)zane z na- szym modu(cid:239)em, tj. cryptography, ipaddress oraz six. Wykonujemy polecenie: pip install paramiko 68 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Nast(cid:218)pnie mo(cid:285)esz zweryfikowa(cid:202) proces instalacji poprzez uruchomienie pow(cid:239)oki Pythona i spró- bowa(cid:202) zaimportowa(cid:202) modu(cid:239) Paramiko — tak jak pokazano na zrzucie poni(cid:285)ej. Po wykonaniu importu Python nie powinien pokaza(cid:202) (cid:285)adnych b(cid:239)(cid:218)dów. Po(cid:239)(cid:200)czenie SSH z urz(cid:200)dzeniem sieciowym Na pocz(cid:200)tku skryptu musimy zaimportowa(cid:202) modu(cid:239), z którego chcemy skorzysta(cid:202). Nast(cid:218)pnie utworzymy klienta SSH, korzystaj(cid:200)c z funkcji SSHClient(). W nast(cid:218)pnej kolejno(cid:258)ci skonfiguru- jemy modu(cid:239) Paramiko, aby automatycznie dodawa(cid:239) klucz ka(cid:285)dego hosta jako zaufany i ustanawia(cid:239) po(cid:239)(cid:200)czenie mi(cid:218)dzy klientem i serwerem. Nast(cid:218)pnie u(cid:285)yjemy funkcji connect i wprowadzimy dane uwierzytelniaj(cid:200)ce: #!/usr/bin/python __author__ = Bassim Aly __EMAIL__ = basim.alyy@gmail.com import paramiko import time Channel = paramiko.SSHClient() Channel.set_missing_host_key_policy(paramiko.AutoAddPolicy()) Channel.connect(hostname= 10.10.88.112 , username= admin , password= access123 , look_for_keys=False, allow_agent=False) shell = Channel.invoke_shell() 69 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem AutoAddPolicy() to tylko jedna z polityk, jak(cid:200) mo(cid:285)na wykorzysta(cid:202) w funkcji set_missing_ (cid:180)host_key_policy(). Jest ona akceptowalna jedynie w naszym (cid:258)rodowisku testowym. W (cid:258)rodo- wisku produkcyjnym powinni(cid:258)my u(cid:285)y(cid:202) bardziej restrykcyjnych polityk typu WarningPolicy() lub RejectPolicy(). Funkcja invoke_shell() wywo(cid:239)ywana na ko(cid:241)cu skryptu tworzy interaktywn(cid:200) sesj(cid:218) pow(cid:239)oki z serwerem SSH. Jako argumenty do funkcji mo(cid:285)na poda(cid:202) dodatkowe parametry: rodzaj termi- nala, szeroko(cid:258)(cid:202) i wysoko(cid:258)(cid:202). Argumenty funkcji connect: (cid:81) Look_For_Keys — domy(cid:258)lnie ma warto(cid:258)(cid:202) True, co wymusza na module Paramiko stosowanie uwierzytelnienia za pomoc(cid:200) pary kluczy (klucz prywatny, klucz publiczny) w stosunku do urz(cid:200)dzenia sieciowego. W przypadku gdy parametr ten ma warto(cid:258)(cid:202) False, stosowane jest uwierzytelnienie za pomoc(cid:200) has(cid:239)a. (cid:81) allow_agent paramiko — dzi(cid:218)ki tej opcji po(cid:239)(cid:200)czenie nast(cid:218)puje do lokalnego agenta SSH. Opcja wymagana jest przy uwierzytelnieniu za pomoc(cid:200) kluczy. W przypadku kiedy do uwierzytelnienia stosujemy login/has(cid:239)o opcja jest ustawiana na False. Ostatecznym dzia(cid:239)aniem skryptu jest wywo(cid:239)anie serii komend do terminala urz(cid:200)dzenia, takich jak show ip int b i show arp, oraz uzyskanie wyniku w pow(cid:239)oce Pythona: shell.send( enable\n ) shell.send( access123\n ) shell.send( terminal length 0\n ) shell.send( show ip int b\n ) shell.send( show arp\n ) time.sleep(2) print shell.recv(5000) Channel.close() Wynik dzia(cid:239)ania skryptu: 70 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Gdy chcemy wywo(cid:239)a(cid:202) komendy, których przetwarzanie zajmuje wi(cid:218)cej czasu, zalecane jest u(cid:285)ycie funkcji time.sleep(). Je(cid:258)li nie u(cid:285)yjemy takiej funkcji i Python za szybko zwróci nam wynik, mo(cid:285)emy spodziewa(cid:202) si(cid:218) pustego wyniku. Modu(cid:239) Netmiko Modu(cid:239) Netmiko jest bardziej rozbudowan(cid:200) wersj(cid:200) modu(cid:239)u Paramiko i potrafi (cid:239)(cid:200)czy(cid:202) si(cid:218) z kon- kretnymi rodzajami urz(cid:200)dze(cid:241) sieciowych. Podczas po(cid:239)(cid:200)czenia SSH modu(cid:239) Paramiko sprawdza jedynie w sposób ogólny, czy dane urz(cid:200)dzenie (z którym si(cid:218) (cid:239)(cid:200)czy) jest na przyk(cid:239)ad serwerem czy drukark(cid:200). Natomiast modu(cid:239) Netmiko (cid:239)(cid:200)czy si(cid:218) z konkretnym typem urz(cid:200)dzenia. Dzi(cid:218)ki temu po(cid:239)(cid:200)czenia s(cid:200) obs(cid:239)ugiwane du(cid:285)o wydajniej. Modu(cid:239) ten obs(cid:239)uguje szeroki zakres urz(cid:200)dze(cid:241) wielu producentów. Netmiko jest swego rodzaju nak(cid:239)adk(cid:200) na Paramiko i rozszerza jego mo(cid:285)liwo(cid:258)ci. Mo(cid:285)emy skorzy- sta(cid:202) z mo(cid:285)liwo(cid:258)ci urz(cid:200)dzenia dostarczanych bezpo(cid:258)rednio od producenta, odczytywa(cid:202) i zapi- sywa(cid:202) informacje w pliku konfiguracyjnym lub wysy(cid:239)a(cid:202) znak powrotu karetki \n po ka(cid:285)dej komendzie. Wsparcie producentów Modu(cid:239) Netmiko wspiera wielu producentów i systematycznie dodawani s(cid:200) nowi. Poni(cid:285)sza lista urz(cid:200)dze(cid:241) zosta(cid:239)a podzielona na trzy grupy: regularnie testowane, testowane w ograni- czonym zakresie oraz eksperymentalne. List(cid:218) mo(cid:285)na znale(cid:283)(cid:202) tak(cid:285)e na GitHubie pod adresem https://github.com/ktbyers/netmiko#supports. Oto lista wspieranych producentów z grupy „regularnie testowane”: 71 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem Oto lista wspieranych producentów z grupy „testowane w ograniczonym zakresie”: Oto lista wspieranych producentów z grupy „eksperymentalne”: Instalacja i weryfikacja Je(cid:285)eli pracujesz pod systemem Windows, otwórz konsol(cid:218) polece(cid:241) za pomoc(cid:200) polecenia cmd. Je(cid:285)eli pracujesz pod systemem Linux, skorzystaj z pow(cid:239)oki. Musimy pobra(cid:202) najnowszy modu(cid:239) Netmiko z PyPI (Python Package Index). Wykonujemy polecenie: pip install netmiko 72 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Nast(cid:218)pnie importujemy modu(cid:239) Netmiko z poziomu pow(cid:239)oki Pythona, aby przekona(cid:202) si(cid:218), czy nie ma b(cid:239)(cid:218)dów: $ python import netmiko Po(cid:239)(cid:200)czenie SSH za pomoc(cid:200) Netmiko Przeszed(cid:239) czas, aby pozna(cid:202) mo(cid:285)liwo(cid:258)ci Netmiko podczas po(cid:239)(cid:200)czenia SSH. Domy(cid:258)lnie w trakcie sesji Netmiko wykonuje wiele operacji w tle: zajmuje si(cid:218) obs(cid:239)ug(cid:200) nieznanych kluczy SSH, ustala typ i rozmiar terminala oraz wykonuje operacje zwi(cid:200)zane z konkretnym typem urz(cid:200)dzenia (np. w(cid:239)(cid:200)czenie trybu uprzywilejowanego). W pierwszej kolejno(cid:258)ci musisz zdefiniowa(cid:202) urz(cid:200)dze- nie (z którym si(cid:218) (cid:239)(cid:200)czy) i wprowadzi(cid:202) warto(cid:258)ci dla pi(cid:218)ciu obowi(cid:200)zkowych parametrów: R1 = { device_type : cisco_ios , ip : 10.10.88.110 , username : admin , password : access123 , secret : access123 , } Pierwszy parametr, device_type, okre(cid:258)la typ urz(cid:200)dzenia. Dzi(cid:218)ki temu okre(cid:258)lamy zakres prawi- d(cid:239)owych komend. Nast(cid:218)pnie definiujemy adres IP (pole ip) urz(cid:200)dzenia. W polu ip mo(cid:285)emy zamiast adresu IP poda(cid:202) nazw(cid:218) hosta — o ile mo(cid:285)e by(cid:202) poprawnie rozwi(cid:200)zana przez serwer DNS. W nast(cid:218)pnych polach (username, password, secret) podajemy login, has(cid:239)o oraz has(cid:239)o dla trybu uprzywilejowanego. W tym miejscu warto zaznaczy(cid:202), (cid:285)e mo(cid:285)esz u(cid:285)y(cid:202) funkcji getpass(), dzi(cid:218)ki której nie podajemy has(cid:239)a w sposób jawny (w kodzie skryptu), lecz w czasie wykonywa- nia skryptu. 73 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem Nale(cid:285)y pami(cid:218)ta(cid:202), (cid:285)e kolejno(cid:258)(cid:202) parametrów (wewn(cid:200)trz zmiennej R1) nie jest wa(cid:285)na. Nie mo(cid:285)na za to zmieni(cid:202) nazw parametrów — musz(cid:200) by(cid:202) dok(cid:239)adnie takie, jak w powy(cid:285)szym przyk(cid:239)adzie. W nast(cid:218)pnej kolejno(cid:258)ci zaimportujemy z modu(cid:239)u Netmiko funkcj(cid:218) ConnectHandler i jako argu- ment do niej podamy zdefiniowan(cid:200) wcze(cid:258)niej struktur(cid:218) R1. Je(cid:285)eli wcze(cid:258)niej nasze urz(cid:200)dze- nia zosta(cid:239)y skonfigurowane z has(cid:239)em trybu uprzywilejowanego (ang. enable-mode), do stwo- rzenia po(cid:239)(cid:200)czenia wystarczy u(cid:285)y(cid:202) funkcji .enable(). Aby wywo(cid:239)a(cid:202) polecenia w terminalu routera, nale(cid:285)y skorzysta(cid:202) z funkcji .send_command(). Wynik zapisujemy w zmiennej output: from netmiko import ConnectHandler connection = ConnectHandler(**R1) connection.enable() output = connection.send_command( show ip int b ) print output Wynik dzia(cid:239)ania skryptu: Domy(cid:258)lnie Netmiko zwraca sam wynik (bez znaku zach(cid:218)ty i wykonywanej komendy), który pó(cid:283)- niej mo(cid:285)e zosta(cid:202) obrobiony przez wyra(cid:285)enia regularne (b(cid:218)dzie o tym mowa w nast(cid:218)pnym rozdziale). Je(cid:285)eli chcemy wy(cid:239)(cid:200)czy(cid:202) t(cid:218) funkcjonalno(cid:258)(cid:202) i otrzyma(cid:202) w odpowiedzi znak zach(cid:218)ty i wykonywane komendy, nale(cid:285)y w funkcji .send_command() okre(cid:258)li(cid:202) warto(cid:258)(cid:202) odpowiednich flag. Zmieniamy warto(cid:258)ci strip_command i strip_prompt na False (domy(cid:258)lnie maj(cid:200) warto(cid:258)(cid:202) True): output = connection.send_command( show ip int b , strip_command=False, strip_prompt=False) Wynik dzia(cid:239)ania: 74 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Konfiguracja urz(cid:200)dze(cid:241) za pomoc(cid:200) Netmiko Netmiko mo(cid:285)e zosta(cid:202) wykorzystany do zdalnej konfiguracji urz(cid:200)dzenia sieciowego (poprzez SSH). Konfiguracj(cid:218) urz(cid:200)dzenia (w formacie listy) uzyskujemy poprzez metod(cid:218) .config. Uzyskana lista mo(cid:285)e by(cid:202) do(cid:239)(cid:200)czona do skryptu Pythona lub odczytana z pliku, a nast(cid:218)pnie przekszta(cid:239)cona w list(cid:218) za pomoc(cid:200) metody readlines(): from netmiko import ConnectHandler SW2 = { device_type : cisco_ios , ip : 10.10.88.112 , username : admin , password : access123 , secret : access123 , } core_sw_config = [ int range gig0/1 - 2 , switchport trunk encapsulation dot1q , switchport mode trunk , switchport trunk allowed vlan 1,2 ] print ########## Connecting to Device {0} ############ .format(SW2[ ip ]) net_connect = ConnectHandler(**SW2) net_connect.enable() print ***** Sending Configuration to Device ***** net_connect.send_config_set(core_sw_config) W skrypcie wykonali(cid:258)my te same czynno(cid:258)ci co w poprzednim zadaniu — poza jedn(cid:200). Wykorzy- stali(cid:258)my funkcj(cid:218) send_config_set. Jako argument pobiera ona konfiguracj(cid:218) w postaci listy, prze(cid:239)(cid:200)cza urz(cid:200)dzenie w tryb konfiguracyjny i (cid:239)aduje nowe dane. W naszym przyk(cid:239)adzie zmodyfikowali(cid:258)my interfejsy gig0/1 i gig0/2 poprzez za(cid:239)adowanie no- wej konfiguracji portów trunk. Mo(cid:285)esz sprawdzi(cid:202), czy konfiguracja przebieg(cid:239)a pomy(cid:258)lnie, poprzez wywo(cid:239)anie komendy show run na urz(cid:200)dzeniu. Powiniene(cid:258) otrzyma(cid:202) rezultat podobny do poni(cid:285)szego: Obs(cid:239)uga wyj(cid:200)tków w Netmiko Kiedy tworzymy skrypt w Pythonie, zak(cid:239)adamy, (cid:285)e urz(cid:200)dzenie jest sprawne i w(cid:239)(cid:200)czone oraz wprowadzone zosta(cid:239)y poprawne dane uwierzytelniaj(cid:200)ce. Cz(cid:218)sto jednak tak nie jest. Czasami wy- st(cid:218)puj(cid:200) problemy z (cid:239)(cid:200)czno(cid:258)ci(cid:200) mi(cid:218)dzy Pythonem i zdalnym urz(cid:200)dzeniem, a czasami u(cid:285)ytkownik wprowadzi(cid:239) nieprawid(cid:239)owe dane uwierzytelniaj(cid:200)ce. Zazwyczaj w takim wypadku Python wyrzuci wyj(cid:200)tek i dzia(cid:239)anie skryptu zostanie przerwane. Nie jest to prawid(cid:239)owe podej(cid:258)cie. 75 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem Modu(cid:239) Netmiko o nazwie netmiko.ssh_exception dostarcza odpowiednie klasy wyj(cid:200)tków, dzi(cid:218)ki którym mo(cid:285)emy obs(cid:239)u(cid:285)y(cid:202) powy(cid:285)sze przypadki. Pierwsz(cid:200) z nich jest klasa Authentication (cid:180)Exception, która obs(cid:239)uguje wyj(cid:200)tki zwi(cid:200)zane z b(cid:239)(cid:218)dami uwierzytelnienia na zdalnym urz(cid:200)- dzeniu. Nast(cid:218)pna klasa, NetMikoTimeoutException, wychwytuje wyj(cid:200)tki zwi(cid:200)zane z b(cid:239)(cid:218)dami przekroczenia czasu oczekiwania (ang. timeout) i innymi problemami komunikacyjnymi. Teraz musimy jedynie wychwyci(cid:202) wyj(cid:200)tki (zwi(cid:200)zane z czasem oczekwania i b(cid:239)(cid:218)dami uwierzytelnienia) rzucane przez metod(cid:218) ConnectHandler(). Dokonamy tego za pomoc(cid:200) instrukcji try-except: from netmiko import ConnectHandler from netmiko.ssh_exception import AuthenticationException, NetMikoTimeoutException device = { device_type : cisco_ios , ip : 10.10.88.112 , username : admin , password : access123 , secret : access123 , } print ########## Connecting to Device {0} ############ .format(device[ ip ]) try: net_connect = ConnectHandler(**device) net_connect.enable() print ***** show ip configuration of Device ***** output = net_connect.send_command( show ip int b ) print output net_connect.disconnect() except NetMikoTimeoutException: print =========== SOMETHING WRONG HAPPEN WITH (cid:180){0} ============ .format(device[ ip ]) except AuthenticationException: print ========= Authentication Failed with (cid:180){0} ============ .format(device[ ip ]) except Exception as unknown_error: print ============ SOMETHING UNKNOWN HAPPEN WITH {0} ============ Automatyczne wykrywanie urz(cid:200)dzenia Netmiko wprowadza mechanizmy pozwalaj(cid:200)ce wykrywa(cid:202) typ urz(cid:200)dzenia. Do tego celu wykorzy- stywana jest baza warto(cid:258)ci OID (ang. object identifier) protoko(cid:239)u SNMP. Na zdalnym urz(cid:200)dzeniu wykonywanych jest kilka komend show, aby porówna(cid:202) zwracane warto(cid:258)ci. Ma to na celu okre(cid:258)le- nie rodzaju urz(cid:200)dzenia i jego systemu operacyjnego. Dzi(cid:218)ki temu Netmiko mo(cid:285)e za(cid:239)adowa(cid:202) odpowiedni sterownik w klasie ConnectHandler(): #!/usr/local/bin/python __author__ = Bassim Aly __EMAIL__ = basim.alyy@gmail.com from netmiko import SSHDetect, Netmiko device = { device_type : autodetect , host : 10.10.88.110 , username : admin , password : access123 , } 76 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python detect_device = SSHDetect(**device) device_type = detect_device.autodetect() print(device_type) print(detect_device.potential_matches) device[ device_type ] = device_type connection = Netmiko(**device) W powy(cid:285)szym skrypcie: (cid:81) Warto(cid:258)(cid:202) autodetect parametru device_type mówi Netmiko, (cid:285)e musi poczeka(cid:202), dopóki nie zostanie rozpoznany rodzaj urz(cid:200)dzenia. (cid:81) Nast(cid:218)pnie, u(cid:285)ywaj(cid:200)c klasy SSHDetect(), modu(cid:239) Netmiko przyst(cid:218)puje do wykrywania. Za po(cid:258)rednictwem protoko(cid:239)u SSH klasa (cid:239)(cid:200)czy si(cid:218) z urz(cid:200)dzeniem i wykonuje kilka komend w celu rozpoznania systemu operacyjnego. Otrzymany wynik b(cid:218)dzie mia(cid:239) struktur(cid:218) s(cid:239)ownika i najlepsze dopasowanie zostanie przypisane do zmiennej device_type w wyniku u(cid:285)ycia funkcji autodetect(). (cid:81) U(cid:285)ywaj(cid:200)c potential_matches, mo(cid:285)emy uzyska(cid:202) wszystkie wyniki, które by(cid:239)y brane pod uwag(cid:218) w momencie dopasowywania najlepszego wyniku. (cid:81) W tym momencie mo(cid:285)emy zaktualizowa(cid:202) parametr device (w naszej strukturze s(cid:239)ownikowej), przypisuj(cid:200)c zmienn(cid:200) device_type. Wykorzystanie protoko(cid:239)u Telnet za pomoc(cid:200) Pythona Telnet jest jednym z najstarszych protokó(cid:239)ów u(cid:285)ywanych w stosie TCP/IP. Stosowany jest g(cid:239)ów- nie do wymiany danych podczas po(cid:239)(cid:200)czenia typu klient – serwer. Do obs(cid:239)ugi (cid:285)(cid:200)da(cid:241) klientów serwer Telnetu wykorzystuje port 23. W tym punkcie skrypt Pythona pos(cid:239)u(cid:285)y nam do stworzenia klienta Telnetu. Naszymi serwerami b(cid:218)d(cid:200) routery i switche. Python oferuje wsparcie dla Telnetu poprzez bibliotek(cid:218) telnetlib. Nie musimy jej dodatkowo instalowa(cid:202) — jest wbudowana. Po stworzeniu obiektu klienta (za pomoc(cid:200) klasy Telnet() z biblioteki telnetlib) mamy do dyspo- zycji dwie wa(cid:285)ne funkcje: read_until() (odczyt z urz(cid:200)dzenia sieciowego) i write() (zapis do urz(cid:200)dzenia sieciowego). Nale(cid:285)y wzi(cid:200)(cid:202) pod uwag(cid:218) to, (cid:285)e funkcja read_until() czy(cid:258)ci dane w buforze, wi(cid:218)c nie b(cid:218)d(cid:200) one dost(cid:218)pne podczas nast(cid:218)pnych odczytów. Je(cid:285)eli odczytujesz wa(cid:285)ne dane, które chcesz zapami(cid:218)- ta(cid:202), musisz je zapisa(cid:202) w zmiennej. Je(cid:285)eli tego nie zrobisz i dane zostan(cid:200) przetworzone w dalszej cz(cid:218)(cid:258)ci skryptu, nie b(cid:218)dziesz móg(cid:239) wróci(cid:202) do oryginalnych danych. 77 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem Dane przesy(cid:239)ane za po(cid:258)rednictwem protoko(cid:239)u Telnet s(cid:200) jawne, wi(cid:218)c wszelkie przesy(cid:239)ane has(cid:239)a i loginy s(cid:200) (cid:239)atwym celem do przechwycenia (np. w wyniku ataku man-in-the-middle). Protokó(cid:239) Telnet w dalszym ci(cid:200)gu wykorzystywany jest przez producentów. Cz(cid:218)sto integrowany jest z VPN-em i protoko(cid:239)ami radius/tacacs, aby zapewni(cid:202) w miar(cid:218) lekki i bezpieczny dost(cid:218)p do urz(cid:200)dzenia. Aby zrozumie(cid:202) ca(cid:239)y skrypt, prze(cid:258)led(cid:283) nast(cid:218)puj(cid:200)ce kroki: 1. Na pocz(cid:200)tku zaimportujemy modu(cid:239) telnetlib i zdefiniujemy zmienne przechowuj(cid:200)ce nazw(cid:218) u(cid:285)ytkownika (username) i has(cid:239)a (password, enable_password): import telnetlib username = admin password = access123 enable_password = access123 2. Zdefiniujemy zmienn(cid:200) tworz(cid:200)c(cid:200) po(cid:239)(cid:200)czenie ze zdalnym hostem. Warto zauwa(cid:285)y(cid:202), (cid:285)e podczas tworzenia po(cid:239)(cid:200)czenia nie podajemy nazwy u(cid:285)ytkownika i has(cid:239)a, lecz jedynie adres IP zdalnego hosta: cnx = telnetlib.Telnet(host= 10.10.88.110 ) # po(cid:239)(cid:200)czenie telnet do bramki 3. W tym momencie podajemy nazw(cid:218) u(cid:285)ytkownika. Poprzez po(cid:239)(cid:200)czenie Telnet odczytujemy odpowied(cid:283) serwera i w ci(cid:200)gu zwracanych danych szukamy s(cid:239)owa Username. Gdy tylko je otrzymamy, mo(cid:285)emy przes(cid:239)a(cid:202) na serwer nasz login. Podobnie post(cid:218)pujemy w przypadku wprowadzania has(cid:239)a u(cid:285)ytkownika i has(cid:239)a dla trybu uprzywilejowanego (ang. enable password): cnx.read_until( Username: ) cnx.write(username + \n ) cnx.read_until( Password: ) cnx.write(password + \n ) cnx.read_until( ) cnx.write( en + \n ) cnx.read_until( Password: ) cnx.write(enable_password + \n ) Wa(cid:285)ne jest, aby czeka(cid:202) na dok(cid:239)adnie takie same s(cid:239)owa (w funkcji read_until()), jakie pojawiaj(cid:200) si(cid:218) w konsoli urz(cid:200)dzenia. W przeciwnym razie b(cid:218)dziemy czeka(cid:202) na wynik do momentu, w którym skrypt zwróci b(cid:239)(cid:200)d z powodu przekroczenia czasu oczekiwania na po(cid:239)(cid:200)czenie. 4. Na ko(cid:241)cu wykonamy komend(cid:218) show ip interface brief. Nast(cid:218)pnie odczytamy ze zdalnego urz(cid:200)dzenia wszystkie dane a(cid:285) do znaku zach(cid:218)ty #. Dzi(cid:218)ki temu otrzymamy dane konfiguracyjne interfejsu routera: cnx.read_until( # ) cnx.write( show ip int b + \n ) output = cnx.read_until( # ) print output 78 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Pe(cid:239)ny kod skryptu: Wynik dzia(cid:239)ania skryptu: Zauwa(cid:285)my, (cid:285)e wynik dzia(cid:239)ania zawiera wykonywan(cid:200) komend(cid:218) show ip int b i znak zach(cid:218)ty ro- utera R1# . Aby si(cid:218) ich pozby(cid:202), powinni(cid:258)my u(cid:285)y(cid:202) wbudowanej funkcji do operacji na strin- gach, np. replace(): cleaned_output = output.replace( show ip int b , ).replace( R1# , ) print cleaned_output 79 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem W naszym kodzie dane uwierzytelniaj(cid:200)ce (login i has(cid:239)a) wprowadzili(cid:258)my w postaci jawnej. Nie jest to poprawna metoda z punktu widzenia bezpiecze(cid:241)stwa. W dalszej cz(cid:218)(cid:258)ci rozdzia(cid:239)u dowiemy si(cid:218), jak ukry(cid:202) takie dane, i stworzymy taki mechanizm, aby uwierzytelnienie nast(cid:218)po- wa(cid:239)o tylko w czasie dzia(cid:239)ania skryptu. Ponadto je(cid:285)eli chcesz wywo(cid:239)a(cid:202) komend(cid:218) typu show running config, która spowoduje wy(cid:258)wietle- nie kilku stron ekranu, warto na pocz(cid:200)tku po(cid:239)(cid:200)czenia wykona(cid:202) komend(cid:218) terminal length 0, która wy(cid:239)(cid:200)czy funkcj(cid:218) przewijania ekranu. Zmiana konfiguracji poprzez telnetlib W poprzednim punkcie rozdzia(cid:239)u dowiedzieli(cid:258)my si(cid:218), jak mo(cid:285)na wykona(cid:202) proste operacje typu show ip int brief za pomoc(cid:200) modu(cid:239)u telnetlib. Teraz musimy wykorzysta(cid:202) t(cid:218) wiedz(cid:218), aby wys(cid:239)a(cid:202) konfiguracj(cid:218) VLAN do czterech switchy w naszej sieci. Za pomoc(cid:200) funkcji range() tworzymy list(cid:218) identyfikatorów VLAN. Nast(cid:218)pnie dany identyfikator VLAN ID wysy(cid:239)amy do konkretnego switcha (w czasie iteracji). Adresy IP switchy zdefiniowali(cid:258)my jako list(cid:218), a lista przetwarzana jest w p(cid:218)tli dzi(cid:218)ki instrukcji for. Ponadto skorzystali(cid:258)my z modu(cid:239)u getpass, aby nie pokazywa(cid:202) has(cid:239)a w konsoli — podajemy je tylko w czasie dzia(cid:239)ania skryptu: #!/usr/bin/python import telnetlib import getpass import time switch_ips = [ 10.10.88.111 , 10.10.88.112 , 10.10.88.113 , 10.10.88.114 ] username = raw_input( Please Enter your username: ) password = getpass.getpass( Please Enter your Password: ) enable_password = getpass.getpass( Please Enter your Enable Password: ) for sw_ip in switch_ips: print \n#################### Working on Device + sw_ip + #################### connection = telnetlib.Telnet(host=sw_ip.strip()) connection.read_until( Username: ) connection.write(username + \n ) connection.read_until( Password: ) connection.write(password + \n ) connection.read_until( ) connection.write( enable + \n ) connection.read_until( Password: ) connection.write(enable_password + \n ) connection.read_until( # ) connection.write( config terminal + \n ) # tryb konfiguracji vlans = range(300,400) for vlan_id in vlans: print \n********* Adding VLAN + str(vlan_id) + ********** connection.read_until( # ) connection.write( vlan + str(vlan_id) + \n ) time.sleep(1) connection.write( exit + \n ) connection.read_until( # ) connection.close() 80 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python W najbardziej zewn(cid:218)trznej p(cid:218)tli for przechodzimy przez wszystkie switche. W (cid:258)rodku p(cid:218)tli dla ka(cid:285)dego switcha generujemy identyfikatory VLAN z zakresu od 300 do 400 i wysy(cid:239)amy je do konkretnego urz(cid:200)dzenia. Wynik dzia(cid:239)ania skryptu: Wynik dzia(cid:239)ania skryptu mo(cid:285)esz tak(cid:285)e sprawdzi(cid:202), pos(cid:239)uguj(cid:200)c si(cid:218) konsol(cid:200) switcha: 81 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem Praca z sieciami z wykorzystaniem biblioteki netaddr In(cid:285)ynierowie zajmuj(cid:200)cy si(cid:218) sieciami teleinformatycznymi bardzo cz(cid:218)sto w swojej pracy pos(cid:239)u- guj(cid:200) si(cid:218) adresami IP. Twórcy Pythona stworzyli wspania(cid:239)(cid:200) bibliotek(cid:218), o nazwie netaddr, która bardzo u(cid:239)atwia t(cid:218) prac(cid:218). Na przyk(cid:239)ad aby w aplikacji w prosty sposób uzyska(cid:202) adres sieci i adres broadcast dla adresu 129.183.1.55/21, mo(cid:285)na pos(cid:239)u(cid:285)y(cid:202) si(cid:218) wbudowanymi w modu(cid:239) netaddr funkcjami network i broadcast: net.network 129.183.0. net.broadcast 129.183.0.0 Generalnie modu(cid:239) netaddr udost(cid:218)pnia wsparcie dla: Adresów warstwy 3: iteracja, wycinanie, sortowanie, agregacja i klasyfikacja adresów IP; (cid:81) adresy IPv4 i IPv6, podsieci, maski, prefiksy; (cid:81) (cid:81) wsparcie dla ró(cid:285)nych formatów zapisu (CIDR, dowolne adresy i wzorce, nmap); (cid:81) operacje na zbiorach (unie, intersekcje i wiele innych) adresów IP i podsieci; (cid:81) parsowanie ró(cid:285)norodnych formatów i notacji; (cid:81) uzyskiwanie informacji o adresie IP z IANA (ang. Internet Assigned Numbers Authority); (cid:81) uzyskiwanie odwrotnych translacji adresów DNS (ang. DNS reverse lookups); (cid:81) supernetting i subnetting (grupowanie sieci). Adresów warstwy 2: (cid:81) manipulacja adresami MAC i identyfikatorami EUI-64; (cid:81) uzyskiwanie informacji IEEE (OUI, IAB); (cid:81) generowanie adresów IPv6. Instalowanie modu(cid:239)u netaddr Modu(cid:239) netaddr mo(cid:285)na zainstalowa(cid:202) za pomoc(cid:200) narz(cid:218)dzia pip: pip install netaddr Do weryfikacji poprawno(cid:258)ci instalacji mo(cid:285)na skorzysta(cid:202) z PyCharma lub konsoli Pythona i spró- bowa(cid:202) zaimportowa(cid:202) modu(cid:239). Je(cid:285)eli podczas importu nie b(cid:218)dzie (cid:285)adnych b(cid:239)(cid:218)dów, oznacza to, (cid:285)e modu(cid:239) zosta(cid:239) prawid(cid:239)owo zainstalowany: $ python import netaddr 82 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Metody modu(cid:239)u netaddr Modu(cid:239) netaddr ma dwie wa(cid:285)ne metody do pracy z adresami IP. Pierwsza z nich, IPAddress(), s(cid:239)u(cid:285)y do definiowania klasowego adresu IP z domy(cid:258)ln(cid:200) mask(cid:200) podsieci. Druga metoda, IPNetwork(), s(cid:239)u(cid:285)y do definiowania bezklasowego adresu IP z notacj(cid:200) CIDR. Obie metody przekszta(cid:239)caj(cid:200) adres IP w postaci stringa na obiekty. Mamy do dyspozycji wiele operacji, które mo(cid:285)emy wykona(cid:202) na takich obiektach. Mo(cid:285)emy na przyk(cid:239)ad sprawdzi(cid:202), czy adres IP jest unicastowy, multicastowy, typu loopback, prywatny czy publiczny oraz czy jest prawid(cid:239)owy. Wynikiem takich operacji jest warto(cid:258)(cid:202) logiczna True lub False, która mo(cid:285)e pó(cid:283)niej zosta(cid:202) wykorzystana w operacjach typu if. Modu(cid:239) wspiera równie(cid:285) operatory porównania dla adresów IP: ==, , . Ponadto mo(cid:285)e genero- wa(cid:202) podsieci, a tak(cid:285)e mo(cid:285)liwe jest przegl(cid:200)danie listy nadsieci w celu uzyskania informacji, czy dany adres IP lub podsie(cid:202) do niej nale(cid:285)y. Modu(cid:239) netaddr mo(cid:285)e ponadto wygenerowa(cid:202) pe(cid:239)n(cid:200) list(cid:218) poprawnych hostów (adres IP sieci i broadcast): #!/usr/bin/python __author__ = Bassim Aly __EMAIL__ = basim.alyy@gmail.com from netaddr import IPNetwork,IPAddress def check_ip_address(ipaddr): ip_attributes = [] ipaddress = IPAddress(ipaddr) if ipaddress.is_private(): ip_attributes.append( IP Address is Private ) else: ip_attributes.append( IP Address is public ) if ipaddress.is_unicast(): ip_attributes.append( IP Address is unicast ) elif ipaddress.is_multicast(): ip_attributes.append( IP Address is multicast ) if ipaddress.is_loopback(): ip_attributes.append( IP Address is loopback ) return \n .join(ip_attributes) def operate_on_ip_network(ipnet): net_attributes = [] net = IPNetwork(ipnet) net_attributes.append( Network IP Address is + str(net.network) + and (cid:180)Netowrk Mask is + str(net.netmask)) net_attributes.append( The Broadcast is + str(net.broadcast)) net_attributes.append( IP Version is + str(net.version)) net_attributes.append( Information known about this network is + str (cid:180)(net.info)) net_attributes.append( The IPv6 representation is + str(net.ipv6())) net_attributes.append( The Network size is + str(net.size)) net_attributes.append( Generating a list of ip addresses inside the subnet ) 83 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem for ip in net: net_attributes.append( \t + str(ip)) return \n .join(net_attributes) ipaddr = raw_input( Please Enter the IP Address: ) print check_ip_address(ipaddr) ipnet = raw_input( Please Enter the IP Network: ) print operate_on_ip_network(ipnet) W powy(cid:285)szym skrypcie za pomoc(cid:200) funkcji raw_input() prosimy u(cid:285)ytkownika o podanie adresu IP i IP sieci. Nast(cid:218)pnie wywo(cid:239)ujemy dwie metody, check_ip_address() i operate_on_ip_network(), i przekazujemy do nich warto(cid:258)ci podane przez u(cid:285)ytkownika. Pierwsza funkcja, check_ip_address(), sprawdza, czy podany adres IP jest unicastowy, multicastowy, prywatny lub czy jest loopbac- kiem. Wynik sprawdzenia zwracany jest u(cid:285)ytkownikowi. Druga funkcja, operate_on_ip_network(), pobiera IP sieci i zwraca ID sieci, mask(cid:218) sieci, broadcast, wersj(cid:218), wszystkie znane informacje na temat sieci, reprezentacj(cid:218) IPv6 oraz generuje wszystkie adresy IP z podsieci. Nale(cid:285)y zapami(cid:218)ta(cid:202), (cid:285)e net.info zwraca u(cid:285)yteczne informacje jedynie w przypadku, gdy adres IP jest publiczny. Musimy tak(cid:285)e zaimportowa(cid:202) funkcje IPNetwork i IPAddress z modu(cid:239)u netaddr, zanim u(cid:285)yjemy ich w programie. Wynik dzia(cid:239)ania skryptu: 84 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Przyk(cid:239)adowe przypadki u(cid:285)ycia Z czasem, gdy nasza sie(cid:202) si(cid:218) rozrasta i w naszej sieci pojawia si(cid:218) wiele nowych urz(cid:200)dze(cid:241) od ró(cid:285)- nych producentów, potrzebujemy stworzy(cid:202) skrypt, który zautomatyzuje pewne czynno(cid:258)ci. W nast(cid:218)pnych rozdzia(cid:239)ach przeanalizujemy trzy przyk(cid:239)ady, które mog(cid:200) s(cid:239)u(cid:285)y(cid:202) do zbierania ró(cid:285)- nych informacji na temat sieci, skrócenia czasu potrzebnego do usuni(cid:218)cia problemu lub odzy- skania ostatniej dobrej konfiguracji sieci. Dzi(cid:218)ki temu specjali(cid:258)ci ds. sieci b(cid:218)d(cid:200) mogli bardziej skupi(cid:202) si(cid:218) na swojej pracy, a nasza sie(cid:202) szybciej odzyska sprawno(cid:258)(cid:202) po awarii. Konfiguracja kopii zapasowej urz(cid:200)dzenia Konfiguracja kopii zapasowej urz(cid:200)dzenia jest jednym z najwa(cid:285)niejszych zada(cid:241) dla specjalisty zajmuj(cid:200)cego si(cid:218) sieciami. W tym przyk(cid:239)adzie napiszemy skrypt, który b(cid:218)dzie tworzy(cid:239) kopi(cid:218) zapasow(cid:200) (ang. backup) ró(cid:285)nych urz(cid:200)dze(cid:241). Do tego zadania wykorzystamy bibliotek(cid:218) Netmiko. W nazwie pliku (z kopi(cid:200) zapasow(cid:200)) powinien by(cid:202) zawarty adres backupowanego urz(cid:200)dzenia — dla (cid:239)atwiejszego odszukania w przysz(cid:239)o(cid:258)ci. Na przyk(cid:239)ad plik kopii zapasowej urz(cid:200)dzenia SW1 powinien nazywa(cid:202) si(cid:218) dev_10.10.88.111_.cfg. Tworzymy skrypt Na pocz(cid:200)tku zdefiniujemy w pliku dost(cid:218)p do switchy. Do wykonania kopii zapasowej konfigura- cji ka(cid:285)dego z urz(cid:200)dze(cid:241) potrzebne b(cid:218)d(cid:200) dane dost(cid:218)powe. Porozdzielamy je przecinkami, aby pó(cid:283)niej w (cid:239)atwy sposób sparsowa(cid:202) dane za pomoc(cid:200) funkcji split() i przekaza(cid:202) je do funkcji ConnectHandler. Taki format zapisu u(cid:239)atwi nam równie(cid:285) zarówno eksport, jak i import danych z programu Microsoft Excel lub dowolnej bazy danych. Oto struktura pliku: device_ipaddress , username , password , enable_password , vendor Do importu pliku (wewn(cid:200)trz skryptu) wykorzystamy instrukcj(cid:218) with open. Do wczytania ka(cid:285)dej linii pliku u(cid:285)yjemy funkcji readlines(). Do parsowania wczytanej linii pliku zastosujemy funkcj(cid:218) split(). Dzi(cid:218)ki temu uzyskamy dost(cid:218)p do ka(cid:285)dego pola rozdzielonego przecinkiem: from netmiko import ConnectHandler from datetime import datetime 85 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem with open( /media/bassim/DATA/GoogleDrive/Packt/EnterpriseAutomationProject/ (cid:180)Chapter5_Using_Python_to_manage_network_devices/UC1_devices.txt ) as devices_file: devices = devices_file.readlines() for line in devices: line = line.strip( \n ) ipaddr = line.split( , )[0] username = line.split( , )[1] password = line.split( , )[2] enable_password = line.split( , )[3] vendor = line.split( , )[4] if vendor.lower() == cisco : device_type = cisco_ios backup_command = show running-config elif vendor.lower() == juniper : device_type = juniper backup_command = show configuration | display set Chcemy stworzy(cid:202) skrypt uniwersalny (obs(cid:239)uguj(cid:200)cy wielu ró(cid:285)nych producentów sprz(cid:218)tu), dlatego musimy sprawdzi(cid:202) parametry analizowanego switcha (za pomoc(cid:200) komendy if) i przypi- sa(cid:202) w(cid:239)a(cid:258)ciwe warto(cid:258)ci do zmiennych device_type i backup_command. Na tym etapie jeste(cid:258)my gotowi, aby nawi(cid:200)za(cid:202) z urz(cid:200)dzeniem po(cid:239)(cid:200)czenie SSH i wykona(cid:202) polece- nie zdefiniowane w zmiennej backup_command. Komend(cid:218) wysy(cid:239)amy, korzystaj(cid:200)c z metody .send_ (cid:180)command() dost(cid:218)pnej za po(cid:258)rednictwem modu(cid:239)u Netmiko: print str(datetime.now()) + Connecting to device {} .format(ipaddr) net_connect = ConnectHandler(device_type=device_type, ip=ipaddr, username=username, password=password, secret=enable_password) net_connect.enable() running_config = net_connect.send_command(backup_command) print str(datetime.now()) + Saving config from device {} .format(ipaddr) f = open( dev_ + ipaddr + _.cfg , w ) f.write(running_config) f.close() print ============================================== Powy(cid:285)szy fragment skryptu otwiera plik o nazwie, która zawarta jest w zmiennej ipaddr, i usta- wia jego atrybut do zapisu. 86 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Wynik dzia(cid:239)ania skryptu: Zwró(cid:202) uwag(cid:218), (cid:285)e pliki kopii zapasowych zosta(cid:239)y utworzone w katalogu domowym projektu i ka(cid:285)dy plik zawiera w nazwie adres IP urz(cid:200)dzenia: Uruchomienie skryptu mo(cid:285)esz zaplanowa(cid:202) na okre(cid:258)lon(cid:200) godzin(cid:218). Mo(cid:285)esz to zrobi(cid:202), tworz(cid:200)c proste zadanie cron w systemie Linux lub wykorzysta(cid:202) harmonogram zada(cid:241) w Windowsie. Przyk(cid:239)adowo mo(cid:285)esz zaplano- wa(cid:202) uruchamianie skryptu codziennie o pó(cid:239)nocy i przechowywa(cid:202) kopie zapasowe w katalogu, którego nazwa mo(cid:285)e okre(cid:258)la(cid:202) dzie(cid:241) backupu. 87 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem Utworzenie w(cid:239)asnego terminala dost(cid:218)powego Jako twórca oprogramowania masz mo(cid:285)liwo(cid:258)(cid:202) napisania takiego kodu, który spe(cid:239)ni wszystkie Twoje oczekiwania. W tym przyk(cid:239)adzie stworzymy w(cid:239)asny terminal, który uzyska dost(cid:218)p do routera za po(cid:258)rednictwem modu(cid:239)u telnetlib. Kombinacja znaków wpisywana w terminalu zostanie przet(cid:239)umaczona na komendy zrozumia(cid:239)e dla urz(cid:200)dzenia. Wynik ich dzia(cid:239)ania b(cid:218)dzie móg(cid:239) zosta(cid:202) wy(cid:258)wietlony w terminalu lub zapisany do pliku: #!/usr/bin/python __author__ = Bassim Aly __EMAIL__ = basim.alyy@gmail.com import telnetlib connection = telnetlib.Telnet(host= 10.10.88.110 ) connection.read_until( Username: ) connection.write( admin + \n ) connection.read_until( Password: ) connection.write( access123 + \n ) connection.read_until( ) connection.write( en + \n ) connection.read_until( Password: ) connection.write( access123 + \n ) connection.read_until( # ) connection.write( terminal length 0 + \n ) connection.read_until( # ) while True: command = raw_input( #: ) if health in command.lower(): commands = [ show ip int b , show ip route , show clock , show banner motd ] elif discover in command.lower(): commands = [ show arp , show version | i uptime , show inventory , ] else: commands = [command] for cmd in commands: connection.write(cmd + \n ) output = connection.read_until( # ) print output print =================== Na pocz(cid:200)tku tworzymy po(cid:239)(cid:200)czenie telnetowe z routerem. Podajemy dane dost(cid:218)powe i wcho- dzimy w tryb uprzywilejowany. Nast(cid:218)pnie w niesko(cid:241)czonej p(cid:218)tli (while True) czekamy na komendy od u(cid:285)ytkownika (funkcja raw_input()). Je(cid:258)li u(cid:285)ytkownik wprowadzi komend(cid:218), to jest ona bezpo(cid:258)rednio przesy(cid:239)ana do urz(cid:200)dzenia sieciowego. 88 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Jednak w przypadku, gdy u(cid:285)ytkownik wprowadzi s(cid:239)owa health lub discover, zostanie wys(cid:239)ana zaprogramowana przez nas seria komend. Takie rozwi(cid:200)zanie mo(cid:285)e by(cid:202) niezwykle u(cid:285)yteczne w razie problemów. Znacznie przy(cid:258)piesza czas reakcji. Wyobra(cid:283)my sobie, (cid:285)e mamy problem z OSPF pomi(cid:218)dzy dwoma s(cid:200)siednimi routerami. Wówczas w stworzonym przez nas terminalu b(cid:218)dziemy mogli wyda(cid:202) polecenie typu tshoot_ospf (o ile wcze(cid:258)niej je oprogramujemy w naszym skrypcie), które wykona seri(cid:218) polece(cid:241) typu sprawdzenie statusu s(cid:200)siadów, sprawdzenie MTU interfejsów, sprawdzenie rozg(cid:239)aszanych sieci i wiele innych. Pozwoli to sprawnie odnale(cid:283)(cid:202) problem. Wynik dzia(cid:239)ania skryptu: Na pocz(cid:200)tku wypróbuj dzia(cid:239)anie skryptu poprzez wpisanie w terminalu komendy health: Jak widzisz, wykona(cid:239)o si(cid:218) kilka polece(cid:241) zrozumia(cid:239)ych dla urz(cid:200)dzenia. Nast(cid:218)pnie spróbuj wpisa(cid:202) komend(cid:218) discover: 89 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem Ponownie zobaczymy w wyniku seri(cid:218) wykonanych polece(cid:241) — tym razem zaprogramowanych dla komendy discover. W nast(cid:218)pnym rozdziale nauczymy si(cid:218) parsowa(cid:202) wynik dzia(cid:239)ania skryptu w celu uzyskania u(cid:285)ytecznych danych. Odczyt danych z arkusza Excela Arkusz Excela cz(cid:218)sto wykorzystywany jest przez specjalistów IT do przechowywania u(cid:285)ytecz- nych informacji na temat infrastruktury teleinformatycznej (adresy IP, rodzaj urz(cid:200)dzenia, dane dost(cid:218)powe). Python wspiera obs(cid:239)ug(cid:218) arkuszy Excela. Dzi(cid:218)ki temu mo(cid:285)emy takie dane wykorzy- sta(cid:202) w naszym skrypcie. W naszym przypadku u(cid:285)yjemy modu(cid:239)u Excel Read (xlrd) do odczytu danych z arkusza UC3_devices.xlsx. Zawiera on nazw(cid:218) hosta, IP, nazw(cid:218) u(cid:285)ytkownika, has(cid:239)o, has(cid:239)o dla trybu uprzywilejowanego i rodzaj sprz(cid:218)tu u(cid:285)ywanego w infrastrukturze. Uzyskane dane wykorzy- stamy w module netmiko. Oto zrzut arkusza Excela: Na pocz(cid:200)tku musimy zainstalowa(cid:202) modu(cid:239) xlrd, z którego b(cid:218)dziemy korzysta(cid:202) przy próbie od- czytu danych z arkusza Excela. Do instalacji modu(cid:239)u u(cid:285)ywamy narz(cid:218)dzia pip: pip install xlrd Modu(cid:239) XLRD wczyta arkusz Excela i przekonwertuje rz(cid:218)dy i kolumny do postaci matrycy. Na przyk(cid:239)ad je(cid:285)eli chcemy odczyta(cid:202) warto(cid:258)(cid:202) pierwszego elementu z lewej, to musimy odwo(cid:239)a(cid:202) si(cid:218) do pola row[0][0]. Dost(cid:218)p do nast(cid:218)pnego elementu le(cid:285)(cid:200)cego po prawej uzyskamy przez od- wo(cid:239)anie do pola row[0][1]. I tak dalej. W czasie odczytu arkusza modu(cid:239) xlrd u(cid:285)ywa dwóch specjalnych liczników: nrows (ang. number of rows) i ncols (ang. number of columns). Warto(cid:258)(cid:202) licznika nrows zwi(cid:218)kszana jest o 1 w przypadku odczytu kolejnego rz(cid:218)du, a warto(cid:258)(cid:202) licznika ncols zwi(cid:218)kszana jest o 1 w przypadku odczytu kolejnej kolumny. Dzi(cid:218)ki tym dwóm parametrom znamy rozmiar matrycy. 90 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python (cid:165)cie(cid:285)k(cid:218) do pliku z arkuszem podajemy w funkcji open_workbook() (dost(cid:218)pna w module xlrd). Nast(cid:218)pnie uzyskujemy dost(cid:218)p do arkusza, u(cid:285)ywaj(cid:200)c funkcji sheet_by_index() lub funkcji sheet_by_name(). W naszym przypadku dane przechowywane s(cid:200) w pierwszym arkuszu (index=0), a (cid:258)cie(cid:285)k(cid:200) dost(cid:218)pu do pliku jest nazwa rozdzia(cid:239)u. Nast(cid:218)pnie b(cid:218)dziemy przechodzi(cid:202) przez po- szczególne wiersze, a dost(cid:218)p do konkretnego wiersza uzyskamy, stosuj(cid:200)c funkcj(cid:218) row(). Zwracane informacje s(cid:200) przedstawiane w postaci listy, wi(cid:218)c mo(cid:285)emy uzyska(cid:202) dost(cid:218)p do ka(cid:285)dej warto(cid:258)ci poprzez jej indeks. Oto skrypt: __author__ = Bassim Aly __EMAIL__ = basim.alyy@gmail.com from netmiko import ConnectHandler from netmiko.ssh_exception import AuthenticationException, NetMikoTimeoutException import xlrd from pprint import pprint workbook = xlrd.open_workbook(r /media/bassim/DATA/GoogleDrive/Packt/ (cid:180)EnterpriseAutomationProject/Chapter4_Using_Python_to_manage_network_devices/ (cid:180)UC3_devices.xlsx ) sheet = workbook.sheet_by_index(0) for index in range(1, sheet.nrows): hostname = sheet.row(index)[0].value ipaddr = sheet.row(index)[1].value username = sheet.row(index)[2].value password = sheet.row(index)[3].value enable_password = sheet.row(index)[4].value vendor = sheet.row(index)[5].value device = { device_type : vendor, 91 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem ip : ipaddr, username : username, password : password, secret : enable_password, } print ########## Connecting to Device {0} ############ .format(device[ ip ]) try: net_connect = ConnectHandler(**device) net_connect.enable() print ***** show ip configuration of Device ***** output = net_connect.send_command( show ip int b ) print output net_connect.disconnect() except NetMikoTimeoutException: print =======SOMETHING WRONG HAPPEN WITH {0}======= .format(device[ ip ]) except AuthenticationException: print =======Authentication Failed with {0}======= .format(device[ ip ]) except Exception as unknown_error: print =======SOMETHING UNKNOWN HAPPEN WITH {0}======= Wi(cid:218)cej przyk(cid:239)adów Modu(cid:239) Netmiko mo(cid:285)na stosowa(cid:202) w bardzo wielu przypadkach, które automatyzuj(cid:200) prac(cid:218) w sieci. Mo(cid:285)e to by(cid:202) (cid:239)adowanie, pobieranie plików aktualizacyjnych na zdalne urz(cid:200)dzenie, (cid:239)adowanie konfiguracji z wykorzystaniem szablonów Jinja2, uzyskiwanie dost(cid:218)pu do terminali serwerowych i wiele innych. Wi(cid:218)cej u(cid:285)ytecznych przyk(cid:239)adów znajdziesz pod adresem https://github.com/ ktbyers/pynet/tree/master/presentations/dfwcug/examples: 92 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Zarz(cid:261)dzanie urz(cid:261)dzeniami sieciowymi za pomoc(cid:261) j(cid:266)zyka Python Podsumowanie W tym rozdziale rozpocz(cid:218)li(cid:258)my praktyczn(cid:200) w(cid:218)drówk(cid:218) po (cid:258)wiecie zautomatyzowanych zada(cid:241) sieciowych. Poznali(cid:258)my wiele dost(cid:218)pnych w j(cid:218)zyku Python narz(cid:218)dzi do nawi(cid:200)zywania po(cid:239)(cid:200)czenia ze zdalnymi urz(cid:200)dzeniami (za po(cid:258)rednictwem protoko(cid:239)ów Telnet i SSH) oraz do wykonywania zdalnych polece(cid:241). Poznali(cid:258)my tak(cid:285)e modu(cid:239) netaddr, który u(cid:239)atwia prac(cid:218) w sieci (praca z adresa- mi IP i podsieciami). Na ko(cid:241)cu pog(cid:239)(cid:218)bili(cid:258)my wiedz(cid:218), analizuj(cid:200)c dwa praktyczne przypadki. Z nast(cid:218)pnego rozdzia(cid:239)u dowiesz si(cid:218), jak przetworzy(cid:202) otrzymane wyniki dzia(cid:239)a(cid:241), aby uzyska(cid:202) z nich praktyczne informacje. 93 Poleć książkęKup książkę Zautomatyzuj swoj(cid:261) firm(cid:266) z Pythonem 94 Poleć książkęKup książkę Skorowidz A Amazon Web Services Amazon Machine Image, 281 Boto3, 282 Elastic Compute Cloud, EC2, 281 Simple Storage Systems, S3, 281, 286 zarz(cid:200)dzanie instancjami, 284 analiza konfiguracji, 95 Ansible, 162, 203 administrowanie infrastruktur(cid:200) VMware, 257 grupowanie serwerów pod wzgl(cid:218)dem funkcji, 218 instalacja RHEL/CentOS, 219 Ubuntu, 219 konfiguracja, 220 playbook, 224, 226, 276, 229 szablony Jinja2, 232 terminologia, 218 tryb ad hoc, 220 uchwyty, 230 uzyskanie informacji o hostach, 231 zarz(cid:200)dzanie, 203, 204, 275 aplikacja Nmap, 304 PuTTY, 60 SecureCRT, 60 automatyzacja sieci, 50 B baza danych MariaDB, 208 MySQL, 207 NSoT, 39 uwierzytelnianie po(cid:239)(cid:200)czenia, 212 weryfikowanie poprawno(cid:258)ci dzia(cid:239)ania, 209 wstawianie rekordów, 213 wysy(cid:239)anie zapyta(cid:241), 212 zabezpieczanie, 208 zamkni(cid:218)cie po(cid:239)(cid:200)czenia, 214 biblioteka, Patrz te(cid:285): modu(cid:239) boto3, 39 CiscoConfParse, 95, 104 instalacja, 105 ConfigParser, 39 Fabric, 40 google-api-python-client, 39 infoblox-client, 38 MatplotLib, 95, 108, 197 instalacja, 109 NAPALM, 38 netaddr, 38, 82 Netmiko, 38, 41, 42, 71 Nornir, 39 NSoT, 39 NX-API, 38 Pandas, 39 Paramiko, 39, 42, 68, 176, 223 Psycopg, 40 pyeapi, 38 PyEZ, 38 pyMYSQL, 40 pyVmomi, 40 SCAPY, 40 Selenium, 40 Shade, 276 smtplib, 198 telnetlib, 77 Byers Kirk, 42 konfiguracja kopii zapasowej urz(cid:200)dzenia, 85 Poleć książkęKup książkę Skorowidz C J CentOS, 145, 207, 264 chmura dostawcy Google, 39 Amazon Web Services (AWS
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Zautomatyzuj swoją firmę z Pythonem. Praktyczne rozwiązania dla firmowej sieci
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: