/*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 #008 - Netmiko Finding Device IP Addresses Connected To Juniper - JunOS Switch

Nên tham khảo bài Juniper - JunOS (mục 2) trước khi xem bài này

YÊU CẦU: 

Dùng thư viện Netmiko trong python để SSH vào switch Juniper - JunOS để  tìm các thiết bị hiện tại đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó. Các địa chỉ IP cần tìm được lưu trữ trong file "device_list.csv". 

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"

THỰC HIỆN:

1. Chuẩn bị file danh sách thiết bị có dạng


2. 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ị Juniper 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 hostname < địa chỉ ip cần tìm>
- show ethernet-switching table <đị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":"juniper_junos"
	}
print("Connecting to a host: " + Sw_1["host"] + "...") # 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) 
print("Connected successfully\n")


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,MAC Flags,Logical Interface\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ớ

print ("*" * 20 + "KET QUA" + "*" * 20)
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 + " " + "count 4") # ping (ping 4 gói) địa chỉ IP cần kiểm tra để switch cập nhật vào bảng MAC 
	show_arp = "show arp" + " " + "hostname" + " " + 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

	#print (show_arp)
	# 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 đầu tiên (là địa chỉ MAC) tính từ trái sang
	mac_addr = fields[0]

	# print (mac_addr)

	show_mac_addr = "show ethernet-switching table" + " " + mac_addr
	show_mac_addr = net_connect.send_command(show_mac_addr) # thực hiện lệnh show
	print(show_mac_addr)
	show_mac_addr = show_mac_addr.splitlines()[8].split() # lấy dòng thứ 8 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 
	#print(type(show_mac_addr))
	#print(type(values))
	
	for i in [6,5,3]:  
		del show_mac_addr[i] # thực hiện xóa các phần tử không cần lấy

	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")

3. Kết quả:

Connecting to a host: 192.168.0.1...
Connected successfully

********************KET QUA********************
*172.16.125.11:
MAC flags (S - static MAC, D - dynamic MAC, L - locally learned, P - Persistent static, C - Control MAC
           SE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC)


Ethernet switching table : 109 entries, 109 learned
Routing instance : default-switch
    Vlan                MAC                 MAC         Age    Logical                NH        RTR 
    name                address             flags              interface              Index     ID
    vlan-125            c0:74:ad:32:2d:3c   D             -   ge-1/0/1.0             0         0       


*172.16.126.11:
MAC flags (S - static MAC, D - dynamic MAC, L - locally learned, P - Persistent static, C - Control MAC
           SE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC)


Ethernet switching table : 109 entries, 109 learned
Routing instance : default-switch
    Vlan                MAC                 MAC         Age    Logical                NH        RTR 
    name                address             flags              interface              Index     ID
    vlan-126            d4:f5:ef:09:c0:1e   D             -   ge-1/0/3.0             0         0       


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

[Finished in 17.5s]

Nội dung của file Show_arp_Ketqua_192.168.0.1.csv có dạng


Xong!

2 comments:

  1. bài viết hay quá anh, rất hữu ích!!!

    ReplyDelete
    Replies
    1. khi làm thực tế nếu có việc nào lặp đi lặp lại nhiều lần, thì gửi yêu cầu mình build code cho. Chỉ là chia sẽ kiến thức lẫn nhau thôi. không ngại nhé

      Delete

/*header slide*/