Nên xem các bài dưới đây trước khi xem bài này:
- Cài đặt python tại đây
- Dictionnary trong python tại đây
- Import thư viện tại đây
- Cách cấu hình ssh tại đây
- Cách cài đặt TFTP server tại đây
- Cách xử lý file tại đây
- Loop if tại đây
- Netmiko basic tại đây
- Backup vlan tại đây
Sơ đồ lab:
Dùng thư viện netmiko để thực hiện backup cấu hình của các router/switch:
Yêu cầu:
1. Tên file backup để mặc định các thông tin thiết bị như nội dung
file device_list.csv:
2. Định nghĩa hàm backup theo từng vendor riêng, thực hiện chương kiểm tra
vendor và gọi các hàm tương ứng, tên file backup có
dạng thoigian_vendor_IPAddr. Thông tin thiết bị
file deviceS_list.csv có nội dung như dưới:
3. Netniko support những vendor nào
Chuẩn bị:
Thực hiện:
1. Tên file backup để mặc định các thông tin thiết bị như nội dung
file device_list.csv:
Code:
from netmiko import ConnectHandler
bk_device = {} # định nghĩa Dictionary rỗng
with open ("device_list.csv","r") as rfile: # mở file
keys = rfile.readline().split(",")# lấy dòng đầu tiên/dòng tiêu đề chuyển thành list
values = rfile.read() # các dòng còn lại là giá trị cần gán vào dict
#print(keys)
#print(values)
for values in values.splitlines(): # trả về một chuỗi tương ứng là một dòng trong biến values
values = values.split(",") # mỗi dòng chuyển thành list
for i in range(1,len(keys)-1,1): # lặp để lấy giá trị ( trừ 1 là bỏ cột remark)
bk_device[keys[i]] = values[i] # gán từng cặp keys và values tương ứng cho dict
# print(bk_device)
# thiết lập kết nối đến thiết bị và backup cấu hình
print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")
net_connect = ConnectHandler(**bk_device)
output = net_connect.send_command_timing("copy running-config tftp:") # thực hiện backup cấu hình
if "Address or name of remote host []" in output:
output += net_connect.send_command_timing("192.168.0.48") # nhập địa chỉ TFTP server
if "Destination filename" in output:
output += net_connect.send_command_timing("\n") # Enter để chọn tên mặc định
print(output)
print("-" * 80)
Kết quả:
C:\python>python Demo.pyDang ket noi vao IP:'192.168.0.1' voi Username: 'admin'Address or name of remote host []? Destination filename [r1-confg]? !!1250 bytes copied in 0.111 secs (11261 bytes/sec)--------------------------------------------------------------------------------Dang ket noi vao IP:'192.168.0.2' voi Username: 'admin'Address or name of remote host []? Destination filename [r2-confg]? !!1041 bytes copied in 0.088 secs (11830 bytes/sec)--------------------------------------------------------------------------------Dang ket noi vao IP:'192.168.0.3' voi Username: 'admin'Address or name of remote host []? Destination filename [r3-confg]? !!1041 bytes copied in 0.086 secs (12105 bytes/sec)--------------------------------------------------------------------------------C:\python>
2. Định nghĩa hàm backup theo từng vendor riêng, thực hiện chương kiểm tra
vendor và gọi các hàm tương ứng, tên file backup có
dạng thoigian_vendor_IPAddr.
Chúng tôi tạm tách ra làm phần code để các bạn dễ hiểu
- Định nghĩa hàm backup
from netmiko import ConnectHandler
bk_device = {}
tftpserver = "192.168.0.48"
def cisco_ios(txt): # hàm backup cho cisco ios
cmd = "copy running-config tftp:"
filename = txt
net_connect = ConnectHandler(**bk_device)
output = net_connect.send_command_timing(cmd)
if "Address or name of remote host []" in output:
output += net_connect.send_command_timing(tftpserver)
if "Destination filename" in output:
output += net_connect.send_command_timing(filename)
print(output)
print("-" * 80)
def cisco_asa(txt):
print("Chua viet cisco_asa")
def juniper_srx(txt):
print("Chua viet juniper_srx")
- Mở file deviceS_list.csv, định nghĩa tên file backup và gọi hàm backup tương ứng cho từng vendor
from datetime import datetime
with open ("deviceS_list.csv","r") as rfile: # mở file
keys = rfile.readline().split(",")
values = rfile.read()
#print(keys)
#print(values)
for values in values.splitlines():
values = values.split(",")
for i in range(1,len(keys)-1,1):
bk_device[keys[i]] = values[i]
print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")
now = datetime.now().strftime("%Y-%b-%d_%H%M%S") # lấy ngày giờ hiện tại (thoigian)
filename = now + "_" + values[4] + "_" + values[1] # tên file backup là: thoigian_vendor_IPAddr
if values[4] == "cisco_ios" :
cisco_ios(filename) # gọi hàm backup cisco_ios đã được định nghĩa trước đó
elif values[4] == "cisco_asa" :
cisco_asa(filename)
elif values[4] == "juniper_srx" :
juniper_srx(filename)
else:
print("thiet bi khac")
- Code chính (gộp 2 phần trên lại và đây là code chạy):
from netmiko import ConnectHandler
from datetime import datetime
bk_device = {}
tftpserver = "192.168.0.48"
def cisco_ios(txt): # hàm backup cho cisco ios
cmd = "copy running-config tftp:"
filename = txt
net_connect = ConnectHandler(**bk_device)
output = net_connect.send_command_timing(cmd)
if "Address or name of remote host []" in output:
output += net_connect.send_command_timing(tftpserver)
if "Destination filename" in output:
output += net_connect.send_command_timing(filename)
print(output)
print("-" * 80)
def cisco_asa(txt):
print("Chua viet cisco_asa")
def juniper_srx(txt):
print("Chua viet juniper_srx")
with open ("deviceS_list.csv","r") as rfile: # mở file
keys = rfile.readline().split(",")
values = rfile.read()
#print(keys)
#print(values)
for values in values.splitlines():
values = values.split(",")
for i in range(1,len(keys)-1,1):
bk_device[keys[i]] = values[i]
print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")
now = datetime.now().strftime("%Y-%b-%d_%H%M%S") # lấy ngày giờ hiện tại (thoigian)
filename = now + "_" + values[4] + "_" + values[1] # tên file backup là: thoigian_vendor_IPAddr
if values[4] == "cisco_ios" :
cisco_ios(filename) # gọi hàm backup cisco_ios đã được định nghĩa trước đó
elif values[4] == "cisco_asa" :
cisco_asa(filename)
elif values[4] == "juniper_srx" :
juniper_srx(filename)
else:
print("thiet bi khac")
- Kết Quả:
3. Netniko support những vendor nào
Chúng ta cố tình gán giá trị của device_type là abcXYZ, key KHÔNG CÓ
trong hàm thư viện để chương trình
sinh ra lỗi và sẽ
liệt kê cho chúng ta biết netmiko hiện tại đang hỗ trợ nhưng
vendor nào.
Code:
from netmiko import ConnectHandler
R1 = {
"host":"192.168.0.1",
"username":"admin",
"password":"admin1234@r1",
"device_type":"abcXYZ" # cố tình đưa từ sai vào
}
net_connect = ConnectHandler(**R1)
Kết quả:
C:\python>python Demo.pyTraceback (most recent call last):File "Demo.py", line 10, in <module>net_connect = ConnectHandler(**R1)File "C:\Program Files (x86)\Python38-32\lib\site-packages\netmiko\ssh_dispatcher.py", line 261, in ConnectHandlerraise ValueError(ValueError: Unsupported device_type: currently supported platforms are:a10accedianalcatel_aosalcatel_srosapresia_aeosarista_eosaruba_osavaya_ersavaya_vspbrocade_fastironbrocade_netironbrocade_nosbrocade_vdxbrocade_vyoscalix_b6checkpoint_gaiaciena_saoscisco_asacisco_ioscisco_nxoscisco_s300cisco_tpcisco_wlccisco_xecisco_xrcloudgenix_ioncoriantdell_dnos9dell_force10dell_isilondell_os10dell_os6dell_os9dell_powerconnectdlink_dseltexeltex_esrendaceenterasysextremeextreme_ersextreme_exosextreme_netironextreme_nosextreme_slxextreme_vdxextreme_vspextreme_wingf5_linuxf5_ltmf5_tmshflexvnffortinetgeneric_termserverhp_comwarehp_procurvehuaweihuawei_olthuawei_smartaxhuawei_vrpv8ipinfusion_ocnosjuniperjuniper_junosjuniper_screenoskeymilekeymile_noslinuxmellanoxmellanox_mlnxosmikrotik_routerosmikrotik_switchosmrv_lxmrv_optiswitchnetapp_cdotnetscalernokia_srosoneaccess_oneosovs_linuxpaloalto_panospluribusquanta_meshrad_etxruckus_fastironruijie_ossophos_sfosubiquiti_edgeubiquiti_edgeswitchubiquiti_unifiswitchvyatta_vyosvyoswatchguard_firewareC:\python>
Xong!
Hy vọng sẽ giúp được các bạn trong công việc của mình.
Cám ơn chủ thớt về bài viết
ReplyDeleteQuá hay và rõ ràng...nếu kết hợp với việc automatically run by scheduled thì IT sẽ "lười" được tí rồi...hihi