/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

Network Automation #002 - Netmiko Backup Cisco Configuration To TFTP Server

 Nên xem các bài dưới đây trước khi xem bài nà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.py
Dang 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.py
Traceback (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 ConnectHandler
    raise ValueError(
ValueError: Unsupported device_type: currently supported platforms are:
a10
accedian
alcatel_aos
alcatel_sros
apresia_aeos
arista_eos
aruba_os
avaya_ers
avaya_vsp
brocade_fastiron
brocade_netiron
brocade_nos
brocade_vdx
brocade_vyos
calix_b6
checkpoint_gaia
ciena_saos
cisco_asa
cisco_ios
cisco_nxos
cisco_s300
cisco_tp
cisco_wlc
cisco_xe
cisco_xr
cloudgenix_ion
coriant
dell_dnos9
dell_force10
dell_isilon
dell_os10
dell_os6
dell_os9
dell_powerconnect
dlink_ds
eltex
eltex_esr
endace
enterasys
extreme
extreme_ers
extreme_exos
extreme_netiron
extreme_nos
extreme_slx
extreme_vdx
extreme_vsp
extreme_wing
f5_linux
f5_ltm
f5_tmsh
flexvnf
fortinet
generic_termserver
hp_comware
hp_procurve
huawei
huawei_olt
huawei_smartax
huawei_vrpv8
ipinfusion_ocnos
juniper
juniper_junos
juniper_screenos
keymile
keymile_nos
linux
mellanox
mellanox_mlnxos
mikrotik_routeros
mikrotik_switchos
mrv_lx
mrv_optiswitch
netapp_cdot
netscaler
nokia_sros
oneaccess_oneos
ovs_linux
paloalto_panos
pluribus
quanta_mesh
rad_etx
ruckus_fastiron
ruijie_os
sophos_sfos
ubiquiti_edge
ubiquiti_edgeswitch
ubiquiti_unifiswitch
vyatta_vyos
vyos
watchguard_fireware

C:\python>


Xong!

Hy vọng sẽ giúp được các bạn trong công việc của mình.

1 comment:

  1. Cám ơn chủ thớt về bài viết

    Quá 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

    ReplyDelete

/*header slide*/