/*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 #009 - Exporting MAC Address From Switches Cisco IOS & TextFSM Template

 YÊU CẦU:

1. Sử dụng thư viện netmiko kết nối vào switch kết hợp với TextFSM template để export toàn bộ MAC Address và lưu vào file MAC_TextFSM_template.CSV

2. Định nghĩa TextFSM template chỉ lấy các trường: Vlan (chỉ lấy các vlan là số), Mac Address, Port là lưu thành vào file MAC_TextFSM_Custom.CSV


THỰC HIỆN:

1. Sử dụng thư viện netmiko kết nối vào switch kết hợp với TextFSM template để export toàn bộ MAC Address và lưu vào file MAC_TextFSM_template.CSV

  • Chuẩn bị:
Cài đặt thư viện:
- pip install textfsm
- pip install pandas

Tham khảo cách cài đặt thư viện tại đây

  • Code:

'''
- Kết nối switch export tất cả các MAC Address và lưu thành file MAC_TextFSM_template.CSV

- Câu lệnh sử dụng trong bài:
+ show mac address-table

- Thư viện cần cài:
+ pip install textfsm
+ pip install pandas

'''
from netmiko import ConnectHandler
import textfsm
import pandas as pd
import os

path = os.getcwd()	# lấy đường dẫn hiện tại
file_name = "MAC_TextFSM_template.CSV" # tên file cần lưu

# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = { 
	"host":"192.168.100.23",
	"username":"admin",
	"password":"admin1234",
	"device_type":"cisco_ios"
	}
	
print("Dang ket noi den thiet bi co IP: " + 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 = ConnectHandler(**Sw_1) 
print("Ket noi thanh cong!")

sh_mac_addr = "show mac address-table"
sh_mac_addr = net_connect.send_command(sh_mac_addr, use_textfsm = True) # thực hiện lệnh và sử dụng thư viện TextFSM
df = pd.DataFrame(sh_mac_addr) # chuyển dữ liệu thành dạng DataFrame
df.to_csv(file_name, index = False) # thực hiện lưu file nhưng không lưu cột index
print (f"\n=====Tat ca MAC Address duoc luu vao file '{file_name}' tai '{path}'=====")


  • Kết Quả:

Dang ket noi den thiet bi co IP: 192.168.100.23...
Ket noi thanh cong!
=====Tat ca MAC Address duoc luu o file 'MAC_TextFSM_template.CSV' tai 'C:\python'=====
[Finished in 3.3s]



Nhận xét:
Khi sử dụng TextFSM để xử lý cột Mac Address đổi thành destination_address, và Ports đổi thành destination_port chúng ta khó có thể để chỉnh được theo ý.

2. Định nghĩa TextFSM template chỉ lấy các trường: Vlan (chỉ lấy các vlan là số), Mac Address, Port là lưu thành vào file MAC_TextFSM_Custom.CSV

  • Định nghĩa TextFSM Template lưu nội dung vào file show_mac_address.template
Value VLAN (\d+)
Value MAC_ADDRESS ([0-9a-fA-F]{4}(?:\.[0-9a-fA-F]{4}){2})
Value INTERFACE ([^,\s]+)

Start
  ^Vlan\s+Mac Address\s+Type\s+Ports -> TYPE1

TYPE1
  ^\s*${VLAN}\s+${MAC_ADDRESS}\s+\w+\s+${INTERFACE}(?:\s|$$) -> Record


Tham khảo TextFSM template tại đây

  • Code:

'''
- Kết nối switch export tất cả các MAC Address và lưu thành file MAC_TextFSM_Custom.CSV
- Chúng ta tự định nghĩa TextFSM template, các cột tiêu đề chúng ta cũng có thể đặt tên tùy thích và cũng có thể chọn ra/định nghĩa các vlan cần lấy ra trong file đó.

- Câu lệnh sử dụng trong bài:
+ show mac address-table

- Thư viện cần cài:
+ pip install textfsm
+ pip install pandas

'''
from netmiko import ConnectHandler
import textfsm
import pandas as pd
import os

path = os.getcwd()	# lấy đường dẫn hiện tại
file_name = "MAC_TextFSM_Custom.CSV" # tên file cần lưu
textfsm_template = 'show_mac_address.template' # tên template
# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = { 
	"host":"192.168.100.23",
	"username":"admin",
	"password":"admin1234",
	"device_type":"cisco_ios"
	}
	
print("Dang ket noi den thiet bi co IP: " + 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 = ConnectHandler(**Sw_1) 
print("Ket noi thanh cong!")

sh_mac_addr = "show mac address-table"
sh_mac_addr = net_connect.send_command(sh_mac_addr) # thực hiện lệnh show
try:
	with open(textfsm_template) as template: # Mở file show_mac_address.template vừa định nghĩa
		fsm = textfsm.TextFSM(template)
		sh_mac_addr = fsm.ParseText(sh_mac_addr)
	#print(fsm.header)
	#pprint(sh_mac_addr)
	df = pd.DataFrame(sh_mac_addr) # convert dữ liệu sang kiểu DataFrame
	df.to_csv(file_name, header = fsm.header, index = False) # Ghi dữ liệu vừa trích lọc vào file với header tương ứng và không cần điền thêm cột index	
	print (f"\n=====Tat ca MAC Address duoc luu vao file '{file_name}' tai '{path}'=====")
except:
	print (f"\n=====Kiem tra file template '{textfsm_template}' tai '{path}'=====")	


  • Kết quả:



Nhận xét:
Việc tự định nghĩa template chúng ta có thể tùy chọn các trường cần lấy và phần tiêu đề của các cột chúng ta có thể đặt tên tùy thích. Với kết quả trên chúng ta thấy trường Type và các dòng vlan không phải là số sẽ không được đưa vào file MAC_TextFSM_Custom.csv


Xong!


Học Python Qua Ví Dụ #026 - Pandas DataFrame & Đọc CSV File

 YÊU CẦU:

1. Dùng panda để đọc file device_list.csv với các yêu cầu:
- Hiển thị tất cả dữ liệu hiện có trong file
- Lọc và chỉ định các cột muốn đọc ('username', 'password','host','device_type') và chuyển đổi thành Dictionnary
- Chỉ đọc 5 dòng đầu tiên
- Không đọc các dòng thứ nhất, thứ 5 và thứ 6
- Chỉ đọc dòng đầu tiên và chuyển dòng này thành List

2. Dùng panda để đọc file show_mac_address.csv trích lọc cột 'MAC_ADDRESS' và chuyển từng dòng giá trị sang List


THỰC HIỆN

1. Dùng panda để đọc file .csv với các yêu cầu:
- Hiển thị tất cả dữ liệu hiện có trong file
- Lọc và chỉ định các cột muốn đọc ('username', 'password','host','device_type') và chuyển đổi thành Dictionnary
- Chỉ đọc 5 dòng đầu tiên
- Không đọc các dòng thứ nhất, thứ 5 và thứ 6
- Chỉ đọc dòng đầu tiên và chuyển dòng này thành List

Code:

import pandas as pd # dùng khi ghi file csv 
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

device_info = pd.read_csv('device_list.csv', encoding = "utf-8") # đọc và xử lý chuyển dữ liệu về dạng DataFrame, và sử dụng code utf-8, lấy tất cả các cột hiện có
pprint(device_info)

'''
orient str {‘dict’, ‘list’, ‘series’, ‘split’, ‘records’, ‘index’}

‘dict’ (default) : dict like {column -> {index -> value}}
‘list’ : dict like {column -> [values]}
‘series’ : dict like {column -> Series(values)}
‘split’ : dict like {‘index’ -> [index], ‘columns’ -> [columns], ‘data’ -> [values]}
‘records’ : list like [{column -> value}, … , {column -> value}]
‘index’ : dict like {index -> {column -> value}}
'''
column_name = ['username', 'password','host','device_type'] # chỉ định các cột cần lấy
device_info = pd.read_csv('device_list.csv', usecols = column_name, encoding = "utf-8") # đọc và xử lý chuyển dữ liệu về dạng DataFrame, và sử dụng code utf-8
device_info = device_info.to_dict(orient='records') # chuyển đổi về dict tương ứng (ví dụ: nếu file có 10 dòng thì sẽ tạo ra 9 (10 dòng bỏ đi dòng đầu tiên đã làm key) dictionary tương ứng)
pprint(device_info)

device_info = pd.read_csv('device_list.csv', nrows=5) # đọc 5 dòng đầu tiên
pprint(device_info)

device_info = pd.read_csv('device_list.csv', skiprows=[0,5,6]) # KHÔNG ĐỌC các dòng thứ nhất, thứ 5, thứ 6
pprint(device_info)

device_info = pd.read_csv('device_list.csv', nrows=0).columns.tolist() # chỉ lấy 1 dòng đầu tiên 
pprint(device_info) 


2. Dùng panda để đọc file show_mac_address.csv trích lọc cột 'MAC_ADDRESS' và chuyển từng dòng giá trị sang List

import pandas as pd # dùng khi ghi file csv 
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

show_mac_address = pd.read_csv('show_mac_address.csv', encoding = "utf-8") # đọc và xử lý chuyển dữ liệu về dạng DataFrame, và sử dụng code utf-8, lấy tất cả các cột hiện có
column_name = ['MAC_ADDRESS']
show_mac_address = show_mac_address[column_name].values.tolist() # Trích lọc cột MAC_ADDRESS
pprint (show_mac_address)

Tham khảo convert panda to list
Tham khảo convert panda to dict

Xong!

Học Python Qua Ví Dụ #025 - TextFSM, Pandas DataFrame & Ghi CSV File

 YÊU CẦU:

1. Trích lọc lấy các cột dữ liệu Address và Hardware Addr trong khối dữ liệu thô lấy được từ kết quả show arp

2. Trích lọc lấy cột VLAN và MAC_ADDRESS trong khối dữ liệu thô từ kết quả show mac address-table, nhưng chỉ lấy các vlan 101 -> 104 và vlan 107 -> 108. Kết quả trích lọc sẽ được lưu vào file theo định dạng CSV


THỰC HIỆN:

1. Trích lọc lấy các cột dữ liệu Address và Hardware Addr trong khối dữ liệu thô lấy được từ kết quả show arp.

Nhận xét:
Có rất nhi ều cách xử lý để lấy ra được dữ liệu theo yêu cầu. Tuy nhiên hôm nay chúng tôi giới thiệu các bạn sử dụng TextFSM kết hợp với Regular Expression

a. Định nghĩa/tạo file show_arp.template (file này được lưu thư mục chứa file Demo.py) với các dạng: IP Address và Hardward Addr (MAC)

Value MAC_ADDRESS ([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}) 
Value IP_ADDRESS (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

Start 
  ^Internet\s+${IP_ADDRESS}\s+(\d+|\-)\s+${MAC_ADDRESS}\s+ -> Record 

Giải thích:
* Hàng 1:
- MAC_ADDRESS: tên của biến
- ([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}): Giá trị của địa chỉ MAC có dạng (Regular Expression sẽ thực hiện lọc ra nếu thỏa điều kiện)

Hàng 2:
- Value IP_ADDRESS: tên của biến
- (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}): Giá trị của địa chỉ IPv4 có dạng

Hàng 3:
Là dòng trắng(bắt buộc phải có dòng trắng này)

Hàng 4:
Start

Hàng 5:
2 khoảng trắng, dấu "^" chuỗi được bắt đầu bởi <nội dung định nghĩa của regular expression> -> Record: Báo hiệu kết thúc và thực hiện

-Ý nghĩa dòng RegEx "^Internet\s+${IP_ADDRESS}\s+(\d+|\-)\s+${MAC_ADDRESS}\s+":
Bắt đầu là chuỗi Internet, là khoảng trắng có thể xuất hiện 1 hoặc nhiều lầnđịnh dạng của địa chỉ IP_ADDRESS được định nghĩa (vlaue IP_ADDRESS), là khoảng trắng có thể xuất hiện 1 hoặc nhiều lần, có thể là số xuất hiện 1 hoặc nhiều lần HOẶC là ký tự "_", là khoảng trắng có thể xuất hiện 1 hoặc nhiều lần, định dạng của địa chỉ MAC_ADDRESS, là khoảng trắng xuất hiện 1 hoặc nhiều lần

Các bạn có thể tìm hiểu thêm về Regular Expression tại đây


b. Code (Demo.py):

import textfsm
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

show_arp = '''Building-1_Factory-1_2960_24#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.100.7           6   00d7.8f0d.b83f  ARPA   Vlan1
Internet  192.168.100.11          -   08cc.a7dd.e440  ARPA   Vlan1
Internet  192.168.100.32         56   3087.d91e.1c50  ARPA   Vlan1
Internet  192.168.100.35         65   f8e7.1e34.31d0  ARPA   Vlan1
Internet  192.168.100.51         65   348f.2712.aa80  ARPA   Vlan1
Internet  192.168.100.61         65   8423.8805.8370  ARPA   Vlan1
Internet  192.168.100.62         65   c803.f53a.ccf0  ARPA   Vlan1
Internet  192.168.100.63         65   c803.f50c.4a50  ARPA   Vlan1
Internet  192.168.100.65         65   4cb1.cd3c.1af0  ARPA   Vlan1
Internet  192.168.100.66         65   4cb1.cd3b.cd30  ARPA   Vlan1
Internet  192.168.100.179        10   f28c.d229.b87b  ARPA   Vlan1
Internet  192.168.116.15         73   00d7.8f0d.b83f  ARPA   Vlan1
Internet  192.168.116.37        142   00d7.8f0d.b83f  ARPA   Vlan1
'''

with open('show_arp.template') as template: # Mở file show_arp.template vừa định nghĩa
    fsm = textfsm.TextFSM(template)
    show_arp = fsm.ParseText(show_arp)

print(fsm.header) # in ra tên các biến được định nghĩa trong file show_arp.template
pprint(show_arp) # Kết quả trích lọc/lấy được thỏa điều kiện Regular Expression

Kết quả:

['MAC_ADDRESS', 'IP_ADDRESS']
[['00d7.8f0d.b83f', '192.168.100.7'],
 ['08cc.a7dd.e440', '192.168.100.11'],
 ['3087.d91e.1c50', '192.168.100.32'],
 ['f8e7.1e34.31d0', '192.168.100.35'],
 ['348f.2712.aa80', '192.168.100.51'],
 ['8423.8805.8370', '192.168.100.61'],
 ['c803.f53a.ccf0', '192.168.100.62'],
 ['c803.f50c.4a50', '192.168.100.63'],
 ['4cb1.cd3c.1af0', '192.168.100.65'],
 ['4cb1.cd3b.cd30', '192.168.100.66'],
 ['f28c.d229.b87b', '192.168.100.179'],
 ['00d7.8f0d.b83f', '192.168.116.15'],
 ['00d7.8f0d.b83f', '192.168.116.37']]
[Finished in 0.1s]

2. Trích lọc lấy cột VLAN và MAC_ADDRESS trong khối dữ liệu thô từ kết quả show mac address-table, nhưng chỉ lấy các vlan 101 -> 104 và vlan 107 -> 108. Kết quả trích lọc sẽ được lưu vào file theo định dạng CSV

a. Tạo file teamplate show_mac_address.template:

Value VLAN ([1][0]([1-4]|[7-8]))
Value MAC_ADDRESS ([0-9a-fA-F]{4}(?:\.[0-9a-fA-F]{4}){2})

Start
  ^Vlan\s+Mac Address\s+Type\s+Ports -> TYPE1

TYPE1
  ^\s*${VLAN}\s+${MAC_ADDRESS}\s+ -> Record

Giải thích:
Kết quả trả về có thể có nhiều dạng khác nhau, tùy mỗi dạng mà chúng ta xử lý/lấy/trích lọc phù hợp với yêu cầu. Ở đây chúng ta xét nếu chúng trả về dạng: ^Vlan\s+Mac Address\s+Type\s+Ports thì nhảy đến TYPE1 để thực hiện trích lọc. (chú ý phải có dòng trắng số 3, và dòng trắng số 6)

b. Code:

import textfsm
import pandas as pd # dùng khi ghi file csv 
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

show_mac_address = '''Building-1_Factory-1_2960_24#show mac address-table
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
 All    0100.0ccc.cccc    STATIC      CPU
 All    0100.0ccc.cccd    STATIC      CPU
 All    0180.c200.0000    STATIC      CPU
 All    0180.c200.0001    STATIC      CPU
 All    0180.c200.0002    STATIC      CPU
 All    0180.c200.000d    STATIC      CPU
 All    0180.c200.000e    STATIC      CPU
 All    0180.c200.000f    STATIC      CPU
 All    0180.c200.0010    STATIC      CPU
 All    ffff.ffff.ffff    STATIC      CPU
 100    0000.7d30.b3b7    DYNAMIC     Gi0/1
 100    0000.7d30.b3c2    DYNAMIC     Fa0/23
 101    0002.6510.92d3    DYNAMIC     Fa0/23
 101    0002.6510.b148    DYNAMIC     Fa0/23
 101    0002.6510.befe    DYNAMIC     Fa0/23
 101    0002.6512.8a34    DYNAMIC     Fa0/23
 102    0002.6513.c157    DYNAMIC     Fa0/23
 102    0002.6513.fd5f    DYNAMIC     Fa0/23
 102    0002.6513.fd62    DYNAMIC     Fa0/23
 102    0002.6513.fdbd    DYNAMIC     Fa0/23
 103    0002.6513.fe26    DYNAMIC     Fa0/23
 103    0002.6514.5de5    DYNAMIC     Fa0/23
 108    0002.6516.793e    DYNAMIC     Fa0/23
 103    0016.e637.f51f    DYNAMIC     Gi0/1
 104    001d.9291.71cb    DYNAMIC     Fa0/23
 113    accb.51d5.2d3d    DYNAMIC     Gi0/1
 113    accb.51f5.4e4e    DYNAMIC     Gi0/1
 115    b4a3.82c4.374a    DYNAMIC     Gi0/1
 109    c051.7ef3.c089    DYNAMIC     Gi0/1
 109    c051.7ef3.c214    DYNAMIC     Gi0/1
 108    001e.8ccd.f971    DYNAMIC     Gi0/1
 100    0024.1db9.ab37    DYNAMIC     Gi0/1
 101    006c.bcb2.5e9d    DYNAMIC     Gi0/1
 101    d027.88bd.4b80    DYNAMIC     Gi0/1
 102    e0d5.5e17.5c5c    DYNAMIC     Gi0/1
 100    eca8.6b77.808a    DYNAMIC     Gi0/1
 101    0000.7d30.b3ba    DYNAMIC     Gi0/1
 104    001b.fc9f.af1c    DYNAMIC     Gi0/1
 101    001f.d018.26e1    DYNAMIC     Gi0/1
 101    001f.d0c1.71f8    DYNAMIC     Gi0/1
 102    bc5f.f47d.cad6    DYNAMIC     Gi0/1
 110    f003.8c8e.b2cd    DYNAMIC     Gi0/1
 110    f003.8c8e.b2d1    DYNAMIC     Gi0/1
 110    f003.8c8e.b2f3    DYNAMIC     Gi0/1
 112    00d7.8f0d.b83f    DYNAMIC     Gi0/1
 112    04b4.290a.2ad1    DYNAMIC     Gi0/1
 105    04d6.aad0.3772    DYNAMIC     Gi0/1
 112    0c2f.b065.e65c    DYNAMIC     Fa0/1
 112    1881.0e21.f5ff    DYNAMIC     Gi0/1
   1    1887.407b.444d    DYNAMIC     Gi0/1
 112    2047.da27.a341    DYNAMIC     Gi0/1
 112    20a2.e416.c350    DYNAMIC     Gi0/1
 113    e0c3.7709.5c28    DYNAMIC     Gi0/1
 113    e493.6a45.0717    DYNAMIC     Gi0/1
 113    ec51.bc56.cced    DYNAMIC     Gi0/1
   1    f0db.e2ba.c6c6    DYNAMIC     Gi0/1
 113    f8da.0c82.844f    DYNAMIC     Gi0/1
 107    f8e6.1a10.79f6    DYNAMIC     Gi0/1
 107    286f.7ff2.34e0    DYNAMIC     Gi0/1
 106    0017.c498.c864    DYNAMIC     Gi0/1
 106    0095.697f.49e8    DYNAMIC     Gi0/1
 116    00d7.8f0d.b83f    DYNAMIC     Gi0/1
   1    04d6.aa5b.9e4c    DYNAMIC     Gi0/1
   1    04d6.aade.dd3b    DYNAMIC     Gi0/1
   1    08e6.89ab.13a5    DYNAMIC     Gi0/1
'''

with open('show_mac_address.template') as template: # Mở file show_mac_address.template vừa định nghĩa
    fsm = textfsm.TextFSM(template)
    show_mac_address = fsm.ParseText(show_mac_address)

#print(fsm.header)
#pprint(show_mac_address)

df = pd.DataFrame(show_mac_address) # convert dữ liệu sang kiểu DataFrame
df.to_csv("show_mac_address.csv", header = fsm.header, index = False) # Ghi dữ liệu vừa trích lọc vào file với header tương ứng và không cần điền thêm cột index
  
Kết quả file show_mac_address.csv có dạng

Xong!


Học Python Qua Ví Dụ #024 - Get Difference Between Two List - Lấy Ra Phần Khác Nhau Giữa Hai List

Yêu Cầu: Tìm các IP ở HoChiMinh_ips mà không có trong danh sách ở HaNoi_ips

1. Dùng for lồng 

2. Dùng List Kết Hợp For và IF

3. Covert List Sang Set Và Thực Hiện Toán Tử Difference

4. Covert List Sang Set Và Thực Hiện Thuộc Tính Difference


Code:

'''
Tìm các IP ở HoChiMinh_ips mà không có trong danh sách ở hà nội HaNoi_ips
''' HaNoi_ips = [ "10.10.10.1", "10.10.20.1", "10.10.30.1", "10.10.40.1", "10.10.50.1", "10.10.60.1", "10.10.70.1", "10.10.80.1", "10.10.10.1", "10.10.70.1", ] HoChiMinh_ips = [ "10.10.10.1", "10.10.30.1", "10.10.40.1", "10.10.50.1", "10.10.60.1", "10.10.210.1", "10.10.220.1", "10.10.230.1", "10.10.240.1", ] HCM_NOT_in_HaNoi = [] for item in HoChiMinh_ips: if item not in HaNoi_ips: HCM_NOT_in_HaNoi.append(item) print(HCM_NOT_in_HaNoi)


Kết quả:
['10.10.240.1', '10.10.230.1', '10.10.220.1', '10.10.210.1']
[Finished in 0.1s]


2. Dùng List Kết Hợp For và IF

HCM_NOT_in_HaNoi = [item for item in HoChiMinh_ips if item not in HaNoi_ips]
print (HCM_NOT_in_HaNoi)


3. Covert List Sang Set Và Thực Hiện Toán Tử Difference

set_HCM_NOT_in_HaNoi = set(HoChiMinh_ips) - set(HaNoi_ips)
HCM_NOT_in_HaNoi = list(set_HCM_NOT_in_HaNoi)
print(HCM_NOT_in_HaNoi)


4. Covert List Sang Set Và Thực Hiện Thuộc Tính Difference

set_HCM_NOT_in_HaNoi = set(HoChiMinh_ips).difference(set(HaNoi_ips))
HCM_NOT_in_HaNoi = list(set_HCM_NOT_in_HaNoi)
print(HCM_NOT_in_HaNoi)


Tham khảo bài các hành động của Set trong python tại đây

Xong!

Library, Share Tài Liệu Cisco


  1. CCNA TTG Training Center - Download
  2. CCNA networklession - Download
  3. CCNP Switch networklession - Download
  4. CCNP Route networklession - Download
  5. CCNP Tshoot networklession - Download
  6. 101 Lab CCNA - Download


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!

/*header slide*/