/*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 #007 - Netmiko - Tìm Và Cấu Hình Description Cho Interface Khi Biết IP Address

Nên xem các bài trước khi xem bài này


Sơ đồ LAB:


YÊU CẦU

Dùng Netmiko SSH vào switch sau đó thực hiện các yêu cầu như bên dưới khi biết thông tin về IP address và phần mô tả của thiết bị trong file cho trước "devices_list.csv"

  1. In kết quả tìm được IP nào đang kết nối vào port nào ra màn hình và ghi thông tin kết nối chi tiết vào file
  2. Cấu hình description cho interface với thông tin trong file devices_list.csv

THỰC HIỆN:

  • Chuẩn bị 
a. File danh sách thiết bị device_list.csv có dạng


b. Cấu hình trên switch cisco:


1. In kết quả tìm được IP nào đang kết nối vào port nào ra màn hình và ghi thông tin kết nối chi tiết vào file

  • Code:

'''
Tìm thiết bị đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó
Danh sách các IP cần tìm để trong file "device_list.csv"
(Điều kiện là thiết bị cisco cần kết nối đã được cấu hình SSH)
Kết quả tìm được in ra màn hình và lưu vào file "Show_arp_Ketqua_192.168.0.1.csv"

Câu lệnh chính dùng trong bài:
- show arp <ip cần tìm>
- show mac address-table address <địa chỉ mac cần tìm>

'''
import netmiko # import thư viện netmiko
import os 

# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = { 
	"host":"192.168.0.1",
	"username":"admin",
	"password":"admin1234@core",
	"device_type":"cisco_ios"
	}
	
print("Connecting to a host: " + Sw_1["host"] + "...\n") # Hiển thị thông báo kết nối tới
# dùng hàm ConnectHandler trong thư viện netmiko để kết nối với Sw_1 với các thông tin đã định nghĩa trong dictionnary
net_connect = netmiko.ConnectHandler(**Sw_1) 

with open ("device_list.csv","r") as rfile: # mở file

	keys = rfile.readline() # lấy dòng đầu tiên
	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)
'''
để remove xuống dòng (newline) chúng ta có thể dùng
print(keys,end="")
'''

file_ketqua = "Show_arp_Ketqua_" + Sw_1["host"] + ".csv" # định nghĩa tên file cần ghi kết quả
file_header = keys.rstrip() + ",Vlan,Mac Address,Type,Port\n" # bỏ newline (\n) ở cuối dòng và nối thêm chuỗi để ghi vào file chuẩn bị để chứa kết quả show mac address và chèn newline vào cuối

f = open(file_ketqua,"w") 
# print(file_header)
f.write(file_header)
f.flush() # thực hiện ghi
f.close() # đóng file để giải phóng bộ nhớ

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
	ip_addr = values[0] # giá trị của cột đầu tiên là địa chỉ IP cần lấy ra
	ip_description = values[1]
	# print(ip_addr)
	# print(ip_description)
	# print(values)
	print("*" + ip_addr + ":") # In ra IP đang cần show

	net_connect.send_command("ping" + " " + ip_addr) # ping địa chỉ IP cần kiểm tra để switch cập nhật vào bảng MAC 

	show_arp = "show arp" + " " + ip_addr
	show_arp = net_connect.send_command(show_arp) # thực hiện lênh show arp với chính IP cần tìm

	# In ra dòng thứ nhì trong chuỗi
	# print (show_arp.splitlines()[1])

	# lấy dòng thứ nhì và phân ra từng cụm
	fields = show_arp.splitlines()[1].split()

	# lấy cụm thứ 4 (là địa chỉ MAC) tính từ trái sang, sau đó sẽ thực hiện lệnh show mac với MAC này
	mac_addr = fields[3]

	# print (mac_addr)

	show_mac_addr = "show mac address-table address" + " " + mac_addr 
	show_mac_addr = net_connect.send_command(show_mac_addr) # thực hiện lệnh show
	
	show_mac_addr = show_mac_addr.splitlines()[5].split() # lấy dòng thứ 6 chuyển thành list
	print(show_mac_addr) # In kết quả show ra màn hình
	print() # In ra dòng trắng 
	show_mac_addr = values + show_mac_addr # thực hiện nối thông tin ban đầu và kết quả 
	#print(show_mac_addr)
	show_mac_addr = ",".join(show_mac_addr) + "\n" # convert list sang string và thêm "," vào giữa mỗi cụm
	
	f = open(file_ketqua,"a") 
	f.write(show_mac_addr) # thực hiện ghi thêm kết quả vào file kết quả
path = os.getcwd() # lấy đường dẫn hiện tại

print("*" * 20 + "KẾT QUẢ ĐƯỢC LƯU TẠI" + "*" * 20)
print(r"{}".format(path))
print(file_ketqua)
print("*" * 60 + "\n")

  • Kết quả:

Connecting to a host: 192.168.0.1...

*192.168.0.101:
['1', '0050.7966.6803', 'DYNAMIC', 'Et0/1']

*192.168.0.102:
['1', '0050.7966.6805', 'DYNAMIC', 'Et0/2']

*192.168.0.103:
['1', '0050.7966.6806', 'DYNAMIC', 'Et0/3']

*192.168.0.104:
['1', '0050.7966.6804', 'DYNAMIC', 'Et1/3']

*192.168.0.105:
['1', '0050.7966.6802', 'DYNAMIC', 'Et1/2']

********************KẾT QUẢ ĐƯỢC LƯU TẠI********************
C:\vck\LAB
Show_arp_Ketqua_192.168.0.1.csv
************************************************************

[Finished in 19.5s]

Nội dung file show_arp_Ketqua có dạng


2. Cấu hình description cho interface với thông tin trong file devices_list.csv

  • Code:

'''
Tìm thiết bị đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó
Danh sách các IP cần tìm để trong file "device_list.csv"

(Điều kiện là thiết bị cisco cần kết nối đã được cấu hình SSH)
Kết quả tìm được in ra màn hình và lưu vào file "Show_arp_Ketqua_192.168.0.1.csv"

Câu lệnh chính dùng trong bài:
- show arp <ip cần tìm>
- show mac address-table address <địa chỉ mac cần tìm>

- int <tên interface>
- description <nội dung cần chú thích>

'''
import netmiko # import thư viện netmiko
import os 

# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = { 
	"host":"192.168.0.1",
	"username":"admin",
	"password":"admin1234@core",
	"device_type":"cisco_ios"
	}
	
print("Connecting to a host: " + Sw_1["host"] + "...\n") # Hiển thị thông báo kết nối tới
# dùng hàm ConnectHandler trong thư viện netmiko để kết nối với Sw_1 với các thông tin đã định nghĩa trong dictionnary
net_connect = netmiko.ConnectHandler(**Sw_1) 

with open ("device_list.csv","r") as rfile: # mở file

	keys = rfile.readline() # lấy dòng đầu tiên
	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)
'''
để remove xuống dòng (newline) chúng ta có thể dùng
print(keys,end="")
'''

file_config = Sw_1["host"] + ".txt" # định nghĩa tên file config
f = open(file_config,"w") # khởi tạo file config rỗng
f.flush() # thực hiện ghi
f.close() # đóng file để giải phóng bộ nhớ

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
	ip_addr = values[0] # giá trị của cột đầu tiên là địa chỉ IP cần lấy ra
	ip_description = values[1]
	# print(ip_addr)
	# print(ip_description)
	# print(values)
	# print("*" + ip_addr + ":") # In ra IP đang cần show

	net_connect.send_command("ping" + " " + ip_addr) # ping địa chỉ IP cần kiểm tra để switch cập nhật vào bảng MAC 

	show_arp = "show arp" + " " + ip_addr
	show_arp = net_connect.send_command(show_arp) # thực hiện lênh show arp với chính IP cần tìm

	# In ra dòng thứ nhì trong chuỗi
	# print (show_arp.splitlines()[1])

	# lấy dòng thứ nhì và phân ra từng cụm
	fields = show_arp.splitlines()[1].split()

	# lấy cụm thứ 4 (là địa chỉ MAC) tính từ trái sang, sau đó sẽ thực hiện lệnh show mac với MAC này
	mac_addr = fields[3]

	# print (mac_addr)

	show_mac_addr = "show mac address-table address" + " " + mac_addr 
	show_mac_addr = net_connect.send_command(show_mac_addr) # thực hiện lệnh show
	
	show_mac_addr = show_mac_addr.splitlines()[5].split() # lấy dòng thứ 6 chuyển thành list
	# print(show_mac_addr) # In kết quả show ra màn hình
	int_port = show_mac_addr[3] # lấy tên interface
	# print(int_port)
	
	'''
	Đưa các thông tin cần cấu hình cho interface vào file cấu hình mẫu

	'''
	f = open(file_config,"a") 
	f.write("interface " + " " + int_port + "\n") 
	f.write("description " + " ===Link to " + ip_addr + " " + ip_description + "===\n")
	f.write("exit\n")
	f.flush() # thực hiện ghi
	f.close() # đóng file để giải phóng bộ nhớ

	net_connect.send_config_from_file(file_config) # thực hiện cấu hình từ file cấu hình mẫu
	net_connect.save_config() # lưu cấu hình
'''
Kiểm tra sau khi cấu hình 
'''
show_int_des = "show interface description"
show_int_des = net_connect.send_command(show_int_des)
print(show_int_des)



  • Kết quả:
Connecting to a host: 192.168.0.1...

Interface                      Status         Protocol Description
Et0/0                          up             up       
Et0/1                          up             up       ===Link to 192.168.0.101 IP Phone===
Et0/2                          up             up       ===Link to 192.168.0.102 Wireless Controller===
Et0/3                          up             up       ===Link to 192.168.0.103 Juniper===
Et1/0                          up             up       
Et1/1                          up             up       
Et1/2                          up             up       ===Link to 192.168.0.105 PC===
Et1/3                          up             up       ===Link to 192.168.0.104 Linux Server===
Vl1                            up             up       
[Finished in 35.4s]

Xong!

No comments:

Post a Comment

/*header slide*/