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"
- 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
- Cấu hình description cho interface với thông tin trong file devices_list.csv
THỰC HIỆN:
- Chuẩn bị
- 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\LABShow_arp_Ketqua_192.168.0.1.csv************************************************************[Finished in 19.5s]
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 DescriptionEt0/0 up upEt0/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 upEt1/1 up upEt1/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!