Skrypt python do zmiany serwerów ntp na CISCO
by admin · Październik 15, 2017
W poniższym wpisie pokażę prosty skrypt w Pythonie wykorzystujący bibliotekę netmiko oraz textfsm. Skrypt będzie łączył sie po ssh ze switchami CISCO i zmieniać adresy serwerów ntp na nowe.
Wyobraźmy sobie sytuację że mamy 20 switchy ze skonfigurowanymi następującymi adresami serwerów ntp:
SWITCH-1#show run | in ntp
ntp server 192.168.55.100
ntp server 192.168.60.100
Dostaliśmy informację, że niedługo nastąpi zmiana adresów IP serwerów ntp na nowe następujące adresy:
10.0.10.1, 10.0.10.2, 10.0.10.3
i musimy na wszystkich switchach zamienić adresy serwerów ntp. Możemy to zrobić ręcznie, logując się na każdy switch i wydając komendy:
no ntp server …
ntp server..
albo wykorzystać skrypt, który zrobi to za nas.
ZACZYNAMY
Skrypt realizujący to zadanie będzie działał następująco:
- Logowanie do urządzenia
- Wykonanie komendy show run | in ntp i zapisanie wyników
- Usunięcie starych serwerów ntp z wyników z punktu 2.
- Ustawienie nowych serwerów ntp
Skrypt będzie wykorzystywał pliki z komendami, dzięki czemu będziemy mogli go w łatwy sposób przerabiać do innych potrzeb (nie tylko do zmian serwerów ntp). Wystarczy wyedytować pliki commands.txt i commands2.txt oraz zmienić plik textfsm, który parsuje wyniki polecenia z pliku commands2.txt. Zapraszam do przeczytania moich wpisów o Netmiko i TextFSM, które napewno rozjaśnią poniższy skrypt.
SKRYPT
config_cisco.py
#!/usr/bin/python
from netmiko import ConnectHandler
import sys, textfsm
def check_cmd(ip, username, password,commands):
# nawiązanie połączenia do urządzenia
ssh_connection = ConnectHandler(
device_type='cisco_ios',
ip=ip,
username=username,
password=password,
)
result = ""
for i in commands:
result += ssh_connection.send_command(i)+"\n"
# zamknięcie połączenia
ssh_connection.disconnect()
return result
def set_cmd(ip, username, password,commands):
# nawiązanie połączenia do urządzenia
ssh_connection = ConnectHandler(
device_type='cisco_ios',
ip=ip,
username=username,
password=password,
)
result = ssh_connection.send_config_set(commands)
# zamknięcie połączenia
ssh_connection.disconnect()
return result
if __name__ == "__main__":
if len(sys.argv) != 4:
print("\nSkrypt do zmiany adresów serwerów ntp na urzadzeniach cisco:")
print("\tconfig_cisco.py <device_ip>,<device_ip> <użytkownik> <hasło> \n\n")
print("\tprzykładowe użycie: config_cisco.py 192.168.10.10,192.168.10.11 admin cisco123 \n\n")
sys.exit(0)
devices = sys.argv[1]
username = sys.argv[2]
password = sys.argv[3]
set_file = "commands.txt"
get_file = "commands2.txt"
f = open(set_file,'r')
commands = f.read().splitlines()
f.close
f = open(get_file,'r')
commands2 = f.read().splitlines()
f.close
device = devices.split(',')
re_table = textfsm.TextFSM(open("config_devices.textfsm"))
for i in switch:
print "wykonywanie komend z pliku (%s) dla urządzenia %s" %(get_file,i)
#sprawdzanie czy sa juz jakies ntp servery
#sprawdzenie odbywa sie przy pomocy komend z pliku get_file
check_out = check_cmd(i,username,password,commands2)
fsm_results = re_table.ParseText(check_out)
commands3=[]
#sprawdzanie czy juz jest jakis ntp server, jesli jest to go usuwamy
for j in fsm_results:
commands3.append('no '+' '.join(j))
set_out = set_cmd(i,username,password,commands3)
print "wykonywanie komend z pliku (%s) dla switcha %s" % (set_file,i)
#ustawienie nowych serwerow ntp, czyli komend z pliku set_file
set_out = set_cmd(i,username,password,commands)
#koniec
print "koniec"
Plik config_devices.textfsm
Value ntp (\S+)
Value server (\S+)
Value ip (.+)
Start
^${ntp}\s+${server}\s+${ip} -> Record
Pliki z komendami:
commands.txt
ntp server 10.0.10.1
ntp server 10.0.10.2
ntp server 10.0.10.3
commands2.txt
show run | in ntp server
Skrypt uruchamiamy następującym poleceniem:
config_devices.py 192.168.10.10,192.168.10.11,192.168.10.12,192.168.10.13,192.168.10.14,192.168.10.15,192.168.10.16,192.168.10.17,192.168.10.18,192.168.10.19,192.168.10.20,192.168.10.21,192.168.10.22,192.168.10.23,192.168.10.24,192.168.10.25,192.168.10.26,192.168.10.27,192.168.10.28,192.168.10.29 admin cisco123
Oczywiście skrypt można napisać w inny sposób, nie korzystając z textfsm i plików z komendami, ale chciałem pokazać textfsm, bo uważam że jest to nieodzowna biblioteka przy pracy z urządzeniami Cisco i napewno będę publikował więcej skryptów z jej wykorzystaniem.