/*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===*/

LAB OSPF Multiple Areas

Sơ đồ lab:



Yêu Cầu:

1. Thực hiện đấu nối dây và đặt ip như sơ đồ

2. Cấu hình OSPF đảm bảo tất cả các IP có thể ping thấy nhau

3. Hiệu chỉnh Router - ID cho các router là:

  • R1: 1.1.1.1
  • R2: 2.2.2.2
  • R3: 3.3.3.3
  • R4: 4.4.4.4

4. Hiệu chỉnh quá trình bình bầu DR/BDR kết nối giữa:

  • R1-R2-R3:  đảm bảo R1 là DR; R2 là BDR
  • R1-R4: đảm bảo R1 luôn là DR

5. Hiệu chỉnh metric để R3 đi đến Loopback0 của R4 hay R3 đến ip 8.8.8.8 phải đi qua cổng E0/3 của R1


Thực Hiện:

1. Thực hiện đấu nối dây và đặt ip như sơ đồ

R1:

enable
conf t
hostname R1
ip domain name OSPF.lab

username admin privilege 15 password admin1234

line vty 0 4
login local
transport input ssh
crypto key generate rsa general-keys modulus 1024
ip ssh version 2

interface e0/2
ip address 192.168.14.1 255.255.255.0
no shutdown
exit
interface e0/3
ip address 192.168.13.1 255.255.255.0
no shutdown
exit
interface e0/1
ip address 192.168.123.1 255.255.255.0
no shutdown
exit
interface Lo0
ip address 172.16.1.1 255.255.255.0
no shutdown
exit
do wri

R2:
enable
conf t
hostname R2
ip domain name OSPF.lab

username admin privilege 15 password admin1234

line vty 0 4
login local
transport input ssh
crypto key generate rsa general-keys modulus 1024
ip ssh version 2

interface e0/1
ip address 192.168.123.2 255.255.255.0
no shutdown
exit
interface Lo0
ip address 172.16.2.1 255.255.255.0
no shutdown
exit
do wri

R3:

enable
conf t
hostname R3
ip domain name OSPF.lab

username admin privilege 15 password admin1234

line vty 0 4
login local
transport input ssh
crypto key generate rsa general-keys modulus 1024
ip ssh version 2

interface e0/3
ip address 192.168.13.3 255.255.255.0
no shutdown
exit
interface e0/1
ip address 192.168.123.3 255.255.255.0
no shutdown
exit
interface Lo0
ip address 172.16.3.1 255.255.255.0
no shutdown
exit
do wri

R4:

enable
conf t
hostname R4
ip domain name OSPF.lab

username admin privilege 15 password admin1234

line vty 0 4
login local
transport input ssh
crypto key generate rsa general-keys modulus 1024
ip ssh version 2

interface e0/2
ip address 192.168.14.4 255.255.255.0
no shutdown
exit
interface Lo0
ip address 8.8.8.8 255.255.255.0
no shutdown
exit
do wri



2. Cấu hình OSPF đảm bảo tất cả các IP có thể ping thấy nhau

R1:

ena
conf t
router ospf 1
exit
!
int rang e0/1 ,e0/3, lo 0
ip ospf 1 are 0
exit
int rang e0/2
ip ospf 1 are 1
exit
end
wri

R2:
ena
conf t
router ospf 1
exit
!
int rang e0/1 
ip ospf 1 are 0
exit
int lo 0
ip ospf 1 are 2
exit
end
wri

R3:
ena
conf t
router ospf 1
exit
!
int rang e0/1 ,e0/3, lo 0
ip ospf 1 are 0
exit
end
wri

R4:
ena
conf t
router ospf 1
exit
!
int rang e0/2
ip ospf 1 are 1
exit
int lo 0
ip ospf 1 are 1
exit
end
wri


Kiểm tra:

  • Bảng neighbor của các router

R1:

R1#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface
172.16.2.1        1   FULL/BDR        00:00:38    192.168.123.2   Ethernet0/1
172.16.3.1        1   FULL/DR         00:00:39    192.168.123.3   Ethernet0/1
172.16.3.1        1   FULL/DR         00:00:36    192.168.13.3    Ethernet0/3
8.8.8.8           1   FULL/DR         00:00:30    192.168.14.4    Ethernet0/2
R1#
R2:
R2#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface
172.16.1.1        1   FULL/DROTHER    00:00:32    192.168.123.1   Ethernet0/1
172.16.3.1        1   FULL/DR         00:00:32    192.168.123.3   Ethernet0/1
R2#
R3:
R3#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface
172.16.1.1        1   FULL/DROTHER    00:00:31    192.168.123.1   Ethernet0/1
172.16.2.1        1   FULL/BDR        00:00:30    192.168.123.2   Ethernet0/1
172.16.1.1        1   FULL/BDR        00:00:36    192.168.13.1    Ethernet0/3
R3#
R4:
R4#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface
172.16.1.1        1   FULL/BDR        00:00:36    192.168.14.1    Ethernet0/2
R4#

Tất cả các router đã thiết lập được quan hệ láng giềng

  • Bảng định tuyến của các router
R1:
R1#show ip route ospf
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override

Gateway of last resort is not set

      8.0.0.0/32 is subnetted, 1 subnets
O        8.8.8.8 [110/11] via 192.168.14.4, 00:36:36, Ethernet0/2
      172.16.0.0/16 is variably subnetted, 4 subnets, 2 masks
O IA     172.16.2.1/32 [110/11] via 192.168.123.2, 00:35:15, Ethernet0/1
O        172.16.3.1/32 [110/11] via 192.168.123.3, 00:35:15, Ethernet0/1
                       [110/11] via 192.168.13.3, 00:35:15, Ethernet0/3
R1#
R2:
R2#show ip route ospf
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override

Gateway of last resort is not set

      8.0.0.0/32 is subnetted, 1 subnets
O IA     8.8.8.8 [110/21] via 192.168.123.1, 00:35:24, Ethernet0/1
      172.16.0.0/16 is variably subnetted, 4 subnets, 2 masks
O        172.16.1.1/32 [110/11] via 192.168.123.1, 00:35:24, Ethernet0/1
O        172.16.3.1/32 [110/11] via 192.168.123.3, 00:35:34, Ethernet0/1
O     192.168.13.0/24 [110/20] via 192.168.123.3, 00:35:34, Ethernet0/1
                      [110/20] via 192.168.123.1, 00:35:24, Ethernet0/1
O IA  192.168.14.0/24 [110/20] via 192.168.123.1, 00:35:24, Ethernet0/1
R2#
R3:
R3#show ip route ospf
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override

Gateway of last resort is not set

      8.0.0.0/32 is subnetted, 1 subnets
O IA     8.8.8.8 [110/21] via 192.168.123.1, 00:36:00, Ethernet0/1
                 [110/21] via 192.168.13.1, 00:36:00, Ethernet0/3
      172.16.0.0/16 is variably subnetted, 4 subnets, 2 masks
O        172.16.1.1/32 [110/11] via 192.168.123.1, 00:36:00, Ethernet0/1
                       [110/11] via 192.168.13.1, 00:36:00, Ethernet0/3
O IA     172.16.2.1/32 [110/11] via 192.168.123.2, 00:36:00, Ethernet0/1
O IA  192.168.14.0/24 [110/20] via 192.168.123.1, 00:36:00, Ethernet0/1
                      [110/20] via 192.168.13.1, 00:36:00, Ethernet0/3
R3#
R4:
R4#show ip route ospf
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override

Gateway of last resort is not set

      172.16.0.0/32 is subnetted, 3 subnets
O IA     172.16.1.1 [110/11] via 192.168.14.1, 00:37:41, Ethernet0/2
O IA     172.16.2.1 [110/21] via 192.168.14.1, 00:36:31, Ethernet0/2
O IA     172.16.3.1 [110/21] via 192.168.14.1, 00:36:31, Ethernet0/2
O IA  192.168.13.0/24 [110/20] via 192.168.14.1, 00:37:41, Ethernet0/2
O IA  192.168.123.0/24 [110/20] via 192.168.14.1, 00:37:41, Ethernet0/2
R4#


Các route đã được học đầy đủ. Các ký hiệu O IA là route học được OSPF của các area khác


3. Hiệu chỉnh Router - ID cho các router là:

  • R1: 1.1.1.1
  • R2: 2.2.2.2
  • R3: 3.3.3.3
  • R4: 4.4.4.4


R1:

ena
conf t
router ospf 1
router-id 1.1.1.1
end
!
wri

R2:

ena
conf t
router ospf 1
router-id 2.2.2.2
end
!
wri


R3:

ena
conf t
router ospf 1
router-id 3.3.3.3
end
!
wri

R4:
ena
conf t
router ospf 1
router-id 4.4.4.4
end
!
wri


Kiểm tra:

Noted: Chúng ta phải thực hiện xóa process của ospf trên các router sau khi hiệu chỉnh router-id bằng lệnh clear ip ospf process

R1, R2, R3, R4:

clear ip ospf process

Reset ALL OSPF processes? [no]: yes

Thực hiện lại lênh show ip ospf neighbor

R1#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface
2.2.2.2           1   FULL/DR         00:00:31    192.168.123.2   Ethernet0/1
3.3.3.3           1   FULL/BDR        00:00:33    192.168.123.3   Ethernet0/1
3.3.3.3           1   FULL/DR         00:00:39    192.168.13.3    Ethernet0/3
4.4.4.4           1   FULL/BDR        00:00:31    192.168.14.4    Ethernet0/2
R1#


4. Hiệu chỉnh quá trình bình bầu DR/BDR kết nối giữa:

  • R1-R2-R3:  đảm bảo R1 là DR; R2 là BDR


Kiểm tra trước khi cấu hình:

R3#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface

1.1.1.1               1   FULL/DROTHER    00:00:32    192.168.123.1   Ethernet0/1

2.2.2.2               1   FULL/DR         00:00:34    192.168.123.2   Ethernet0/1

1.1.1.1               1   FULL/BDR        00:00:32    192.168.13.1    Ethernet0/3

R3#


Chúng ta thấy hiện tại việc bình bầu chưa đúng với yêu cầu, bây giờ chúng ta tiến hành hiệu chỉnh prority của ospf trên các cổng kết nối trên các router này. 


Hiệu chỉnh xong, NHỚ XÓA process của ospf bằng lệnh: clear ip ospf process và show ip ospf neighbor kiểm tra lại


R1:
interface  Ethernet0/1
ip  ospf  priority  10

R2:
interface  Ethernet0/1
ip  ospf  priority 5

Kiểm tra trên R3:

R3#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface

1.1.1.1              10   FULL/DR         00:00:38    192.168.123.1   Ethernet0/1

2.2.2.2              5   FULL/BDR        00:00:37    192.168.123.2   Ethernet0/1

1.1.1.1              1   FULL/BDR        00:00:36    192.168.13.1    Ethernet0/3

R3#


R1-R2-R3: đã đáp ứng yêu cầu đặt ra.


  • R1-R4: đảm bảo R1 luôn là DR

Trong trường hợp này R1 luôn luôn là DR nên chúng ta cấu hình priory trên cổng Et0/2 của R4 = 0 để R4 không tham gia bình bầu DR

R4:
interface  Ethernet0/2
ip  ospf  priority 0

 

R4#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface

1.1.1.1           1   FULL/DR         00:00:32    192.168.14.1    Ethernet0/2

R4#


Đáp ứng yêu cầu đặt ra

5. Hiệu chỉnh metric để R3 đi đến Loopback0 của R4 hay R3 đến ip 8.8.8.8 phải đi qua cổng E0/3 của R1

Kiểm tra trước khi cấu hình:

R3#show ip route 8.8.8.8

Routing entry for 8.8.8.8/32

  Known via "ospf 1", distance 110, metric 21, type inter area

  Last update from 192.168.123.1 on Ethernet0/1, 00:11:51 ago

  Routing Descriptor Blocks:

    192.168.123.1, from 1.1.1.1, 00:11:51 ago, via Ethernet0/1

      Route metric is 21, traffic share count is 1

  * 192.168.13.1, from 1.1.1.1, 00:11:51 ago, via Ethernet0/3

      Route metric is 21, traffic share count is 1

R3#


Hiện có 2 hướng để đi đến ip 8.8.8.8 là đi ra khỏi cổng E0/1 và E0/3

R3:

interface Ethernet0/1

ip ospf cost 150


Kiểm tra

R3#show ip route 8.8.8.8

Routing entry for 8.8.8.8/32

  Known via "ospf 1", distance 110, metric 21, type inter area

  Last update from 192.168.13.1 on Ethernet0/3, 00:18:01 ago

  Routing Descriptor Blocks:

  * 192.168.13.1, from 1.1.1.1, 00:18:01 ago, via Ethernet0/3

      Route metric is 21, traffic share count is 1

R3#


Bây giờ chỉ còn lại 1 hướng đi là duy nhất, đáp ứng yêu cầu đặt ra.


Xong!

Học Python Qua Ví Dụ #008 - Python List POP, Del, Remove, Copy, Clear - Trong Python

Yêu Cầu:
1. List POP - Lấy ra
2. List Del - Xóa phần tử
3. List Remove - Xóa phần tử
4. List Copy
5. List Clear:

Thực hiện:
1. List POP: phương thức lấy ra và xóa phần tử trong list dựa vào index đưa vào
Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print(ip_list)
print()
ip_list.pop(2) # xóa phần tử có index là 2, xóa 192.168.1.12 
print("List sau khi xoa:", ip_list)

Kết quả:
C:\python>python Demo.py
['192.168.1.10', '192.168.1.11', '192.168.1.12']

List sau khi xoa: ['192.168.1.10', '192.168.1.11']

C:\python>

Chúng ta thấy 192.168.1.12 đã được xóa ra khỏi list

2. List Del: phương thức xóa phần tử trong list dựa vào index đưa vào

Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print(ip_list)
print()
del ip_list[1] # xóa phần tử có index là 1, xóa 192.168.1.11 
print("List sau khi xoa:", ip_list)

Kết quả:
C:\python>python Demo.py
['192.168.1.10', '192.168.1.11', '192.168.1.12']

List sau khi xoa: ['192.168.1.10', '192.168.1.12']

C:\python>

Sự khác nhau giữa pop là del: cùng là xóa phần tử trong list, tuy nhiên với POP chúng ta có lấy/tách phần tử đó ra có thể áp dụng trong một số trường hợp.

3. List Remove: phương thứ xóa phần tử dự vào giá trị đưa vào (del: dùng index, remote: dùn value)
Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print(ip_list)
print()
ip_list.remove("192.168.1.12") # xóa phần tử có giá trị 192.168.1.12 
print("List sau khi xoa:", ip_list)

Kết quả:
C:\python>python Demo.py
['192.168.1.10', '192.168.1.11', '192.168.1.12']

List sau khi xoa: ['192.168.1.10', '192.168.1.11']

C:\python>

 4. List Copy: phương thức trả về list mới tương list đã cho

Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print("IP List:",ip_list)
print()
new_list = ip_list.copy() # copy các phần tử của ip_list và gán vào list có tên new_list
print("New list:",new_list)

Kết quả:
C:\python>python Demo.py
IP List: ['192.168.1.10', '192.168.1.11', '192.168.1.12']

New list: ['192.168.1.10', '192.168.1.11', '192.168.1.12']

C:\python>

5. List Clear: phương thức xóa tất cả mọi phần tử trong list
Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
ip_list.clear() # xóa tất cả các phần tử trong list
print(ip_list)

Xong!

Word, Mail Merge/Trộn Mail Trong Ms Word 2013 Cho Kỹ Sư

Các bạn đã biết đến trộn mail/merge của Ms Word trong việc gửi thông báo, giấy mời, bảng lương, thư cám ơn,... Hôm nay chúng tôi giới thiệu các bạn cách sử dụng tính năng này trong việc tạo/định nghĩa host ứng dụng trong việc sửa file .XML

Yêu Cầu:
1. Chuẩn bị file mẫu "zbx_export_hosts.XML"
2. Tạo source mẫu, danh sách thiết bị
3. Thực hiện Merge trên Ms Word


Thực hiện
1. Chuẩn bị file mẫu "zbx_export_hosts.XML" -> download tại đây

2. Tạo source mẫu, danh sách thiết bị

Tạo MS Excel có tên ListDevices và nội dung là danh sách các thiết bị cần trộn, ví dụ như hình:


File mẫu (zbx_export_hosts.xml) export từ zabbix có nội dung như hình:

Ta thấy dữ liệu của host nằm trong tab <hosts> ...</hosts> dữ liệu từ dòng thứ 11 đến dòng thứ 32 cho phép được lặp lại .

Copy nội dung từ dòng 11 đến dòng 32 sang Ms Word và lưu lại với file là FormTemplates:
<host>
            <host>12</host>
            <name> 13</name>
            <description>14</description>
            <templates>
                <template>
                    <name>17</name>
                </template>
            </templates>
            <groups>
                <group>
                    <name>22</name>
                </group>
            </groups>
            <interfaces>
                <interface>
                    <ip>27</ip>
                    <interface_ref>if1</interface_ref>
                </interface>
            </interfaces>
            <inventory_mode>31</inventory_mode>
 </host>

Các số highlight màu vàng là dữ liệu cần thay đổi (các số đó chỉ là tên gợi nhớ), các chổ này sẽ được thay thế bằng nội trong file Excel. Sau khi thực hiện Merge thành công, mỗi dòng bên excel sẽ điền dữ liệu tương ứng chổ màu vàng này.

3. Thực hiện Merge trên Ms Word

Mở file FormTemplates lên -> Mailings -> Use an Existing List ..-> tìm đến file ListDevices đã tạo ở mục 1 -> Open -> chọn sheet có tên List Of Devices -> OK



Bôi chọn số 12 -> Insert Merger Field -> Host_12 (đây là trường tiêu đề của file ListDevices), tương tự chúng ta làm hết tất cả các trường cần insert vào


Bấm Preview Results để xem kết quả


Vào Maillings -> Finish & Merger -> Edit Individual Document... -> nhập from 1 to 7 (vì danh sách có 7 thiết bị nên chúng ta chỉ trộn đến 7 mẫu)

Ms Word sẽ tạo ra file mới với nội dung là các trường tương ứng bên excel đã trộn vào nội dung file mẫu FormTemplates


Mở file zbx_export_hosts.xml, thay thế từ dòng 11 đến dòng 32 bằng nội dung sau khi merge (copy dán đè) và lưu lại (ở đây chúng tôi lưu với tên zbx_export_hosts_merge.xml)

Đến đây chúng ta có thể dùng file zbx_export_hosts_merge.xml này để import vào Zabbix.

Xong!

Bài Viết Có Liên Quan









Word, Mail Merge/Trộn Mail Trong Ms Word 2013 Cho Kỹ Sư

Các bạn đã biết đến trộn mail/merge của Ms Word trong việc gửi thông báo, giấy mời, bảng lương, thư cám ơn,... Hôm nay chúng tôi giới thiệu các bạn cách sử dụng tính năng này trong việc tạo/định nghĩa host ứng dụng trong việc sửa file .XML

Yêu Cầu:
1. Chuẩn bị file mẫu "zbx_export_hosts.XML"
2. Tạo source mẫu, danh sách thiết bị
3. Thực hiện Merge trên Ms Word


Thực hiện
1. Chuẩn bị file mẫu "zbx_export_hosts.XML" -> download tại đây

2. Tạo source mẫu, danh sách thiết bị

Tạo MS Excel có tên ListDevices và nội dung là danh sách các thiết bị cần trộn, ví dụ như hình:


File mẫu (zbx_export_hosts.xml) export từ zabbix có nội dung như hình:

Ta thấy dữ liệu của host nằm trong tab <hosts> ...</hosts> dữ liệu từ dòng thứ 11 đến dòng thứ 32 cho phép được lặp lại .

Copy nội dung từ dòng 11 đến dòng 32 sang Ms Word và lưu lại với file là FormTemplates:
<host>
            <host>12</host>
            <name> 13</name>
            <description>14</description>
            <templates>
                <template>
                    <name>17</name>
                </template>
            </templates>
            <groups>
                <group>
                    <name>22</name>
                </group>
            </groups>
            <interfaces>
                <interface>
                    <ip>27</ip>
                    <interface_ref>if1</interface_ref>
                </interface>
            </interfaces>
            <inventory_mode>31</inventory_mode>
 </host>

Các số highlight màu vàng là dữ liệu cần thay đổi (các số đó chỉ là tên gợi nhớ), các chổ này sẽ được thay thế bằng nội trong file Excel. Sau khi thực hiện Merge thành công, mỗi dòng bên excel sẽ điền dữ liệu tương ứng chổ màu vàng này.

3. Thực hiện Merge trên Ms Word

Mở file FormTemplates lên -> Mailings -> Use an Existing List ..-> tìm đến file ListDevices đã tạo ở mục 1 -> Open -> chọn sheet có tên List Of Devices -> OK



Bôi chọn số 12 -> Insert Merger Field -> Host_12 (đây là trường tiêu đề của file ListDevices), tương tự chúng ta làm hết tất cả các trường cần insert vào


Bấm Preview Results để xem kết quả


Vào Maillings -> Finish & Merger -> Edit Individual Document... -> nhập from 1 to 7 (vì danh sách có 7 thiết bị nên chúng ta chỉ trộn đến 7 mẫu)

Ms Word sẽ tạo ra file mới với nội dung là các trường tương ứng bên excel đã trộn vào nội dung file mẫu FormTemplates


Mở file zbx_export_hosts.xml, thay thế từ dòng 11 đến dòng 32 bằng nội dung sau khi merge (copy dán đè) và lưu lại (ở đây chúng tôi lưu với tên zbx_export_hosts_merge.xml)

Đến đây chúng ta có thể dùng file zbx_export_hosts_merge.xml này để import vào Zabbix.

Xong!

Network Automation #004 - Netmiko How To Build Network Maps/Discover Network Topology Diagram Based on CDP/LLDP

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 và các câu lệnh show cdp để thực hiện, thông tin thiết bị như file device_listCDP.csv dưới:



Yêu cầu:
1. Ghi lại thông tin đấu nối các cổng của các thiết bị trong sơ đồ lab.
2. Cấu hình cdp run trên Sw_13 (dùng netmiko để cấu hình), thực hiện show cdp để lấy thông tin đấu nối và ghi tiếp vào kết quả của yêu cầu 1


Chuẩn bị:

Thực hiện:

1. Ghi lại thông tin đấu nối các cổng của các thiết bị trong sơ đồ lab.

  • Code
Hàm xử lý show cdp (1):
from netmiko import ConnectHandler 
import re
import os

file_cdp = "show_cdp_neighbors.txt"
file_cdp_not = "show_cdp_NOT_enable.csv"
path = os.getcwd()	# lấy đường dẫn hiện tại

cdp_device = {} 
def show_cdp(txt):
	cmd = "show cdp neighbors"
	cmd2 = "show cdp entry"
	filename = txt
	
	print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	net_connect = ConnectHandler(**cdp_device)

	output = net_connect.send_command(cmd)
	
	if "CDP is not enabled" in  output:							# nếu cdp không được enable
		with open (file_cdp_not,"a") as afile:					# mở file ghi log và sẽ xử lý sau
			afile.write(values[1] + "," + values[2] + "," + values[3] + "," + values[4] + "," + output + "\n") 		# nội dung là IP, dấu 2 chấm, lỗi trả về, xuống hàng
	else:		
		
		with open (file_cdp, "a") as afile:
			afile.write("\n\n" + "*" * 40 + values[1] + "*" * 40 +"\n")
			afile.write(output)
		
		'''
		output của lệnh: "show cdp neighbors" trả về có dạng:
		---------------------------------------------------------------------------
		Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone, 
                  D - Remote, C - CVTA, M - Two-port Mac Relay 

		Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
		Sw_12.netmiko.lab
		                 Eth 0/2           137             R S I  Linux Uni Eth 0/0
		Sw_11.netmiko.lab
		                 Eth 0/1           135             R S I  Linux Uni Eth 0/0

		Total cdp entries displayed : 2
		---------------------------------------------------------------------------
		bỏ 5 dòng đầu tiên là header, 
		lấy từ dòng số 6 đến cuối kết quả và bỏ 2 dòng cuối cùng
		mỗi dòng chuyển thành list
		'''
		lines = output.splitlines()[5:-2]
		
		''' 
		xử lý và trích lọc trong lệnh show cdp neighbors, show cdp entry *
		- 
		-
		'''
		hostname = None
		for line in lines:
			fields = line.split()					# chuyển mỗi dòng sang list
			if len(fields) == 1:					# đối với những hostname dài kết quả của neighbors sẽ trả về 2 dòng cho mỗi neighbors
				hostname = fields[0]

			elif hostname == None:					# kết quả của neighbors sẽ trả về là 1 dòng thì thực hiện trong elif này
				hostname = fields[0]				# lấy ra hostname của láng giềng
				localint = "".join(fields[1:3])		# lấy ra local interface (lấy trường số 1 đến số 2)
				remoteint = "".join(fields[-2:])	# lấy ra remote interface


				outputentry = net_connect.send_command(cmd2 + " " + hostname) 
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'  	# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)    # trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))			# remove duplicate IP và convert to string
				
				with open ("show_cdp_neighbors.txt", "a") as afile:
					
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)
					afile.write("\nIP address: " + ips)
					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)
				
			else:
				outputentry = net_connect.send_command(cmd2 + " " + hostname)
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'			# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)		# trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))				# remove duplicate IP và convert to string	
				localint = "".join(fields[:2])				# lấy 2 trường đầu tiên
				remoteint = "".join(fields[-2:])			# lấy 2 trường cuối cùng

				with open ("show_cdp_neighbors.txt", "a") as afile:
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)

					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)	




Mở file và gọi hàm xử lý (2)
with open ("device_listCDP.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): 
		cdp_device[keys[i]] = values[i]  
	
	#print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	show_cdp(values[1])
print("Thong tin neighbors da luu vao file: '{}' tai duong dan '{}'".format(file_cdp,path))

Nối 2 đoạn code trên thành code chạy (1) + (2) = (3):
from netmiko import ConnectHandler 
import re
import os

file_cdp = "show_cdp_neighbors.txt"
file_cdp_not = "show_cdp_NOT_enable.csv"
path = os.getcwd()	# lấy đường dẫn hiện tại

cdp_device = {} 
def show_cdp(txt):
	cmd = "show cdp neighbors"
	cmd2 = "show cdp entry"
	filename = txt
	
	print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	net_connect = ConnectHandler(**cdp_device)

	output = net_connect.send_command(cmd)
	
	if "CDP is not enabled" in  output:							# nếu cdp không được enable
		with open (file_cdp_not,"a") as afile:					# mở file ghi log và sẽ xử lý sau
			afile.write(values[1] + "," + values[2] + "," + values[3] + "," + values[4] + "," + output + "\n") 		# nội dung là IP, dấu 2 chấm, lỗi trả về, xuống hàng
	else:		
		
		with open (file_cdp, "a") as afile:
			afile.write("\n\n" + "*" * 40 + values[1] + "*" * 40 +"\n")
			afile.write(output)
		
		'''
		output của lệnh: "show cdp neighbors" trả về có dạng:
		---------------------------------------------------------------------------
		Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone, 
                  D - Remote, C - CVTA, M - Two-port Mac Relay 

		Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
		Sw_12.netmiko.lab
		                 Eth 0/2           137             R S I  Linux Uni Eth 0/0
		Sw_11.netmiko.lab
		                 Eth 0/1           135             R S I  Linux Uni Eth 0/0

		Total cdp entries displayed : 2
		---------------------------------------------------------------------------
		bỏ 5 dòng đầu tiên là header, 
		lấy từ dòng số 6 đến cuối kết quả và bỏ 2 dòng cuối cùng
		mỗi dòng chuyển thành list
		'''
		lines = output.splitlines()[5:-2]
		
		''' 
		xử lý và trích lọc trong lệnh show cdp neighbors, show cdp entry *
		- 
		-
		'''
		hostname = None
		for line in lines:
			fields = line.split()					# chuyển mỗi dòng sang list
			if len(fields) == 1:					# đối với những hostname dài kết quả của neighbors sẽ trả về 2 dòng cho mỗi neighbors
				hostname = fields[0]

			elif hostname == None:					# kết quả của neighbors sẽ trả về là 1 dòng thì thực hiện trong elif này
				hostname = fields[0]				# lấy ra hostname của láng giềng
				localint = "".join(fields[1:3])		# lấy ra local interface (lấy trường số 1 đến số 2)
				remoteint = "".join(fields[-2:])	# lấy ra remote interface


				outputentry = net_connect.send_command(cmd2 + " " + hostname) 
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'  	# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)    # trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))			# remove duplicate IP và convert to string
				
				with open ("show_cdp_neighbors.txt", "a") as afile:
					
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)
					afile.write("\nIP address: " + ips)
					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)
				
			else:
				outputentry = net_connect.send_command(cmd2 + " " + hostname)
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'			# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)		# trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))				# remove duplicate IP và convert to string	
				localint = "".join(fields[:2])				# lấy 2 trường đầu tiên
				remoteint = "".join(fields[-2:])			# lấy 2 trường cuối cùng

				with open ("show_cdp_neighbors.txt", "a") as afile:
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)

					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)					


with open ("device_listCDP.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): 
		cdp_device[keys[i]] = values[i]  
	
	#print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	show_cdp(values[1])
print("Thong tin neighbors da luu vao file: '{}' tai duong dan '{}'".format(file_cdp,path))



  • Kết quả:
C:\python>python Demo.py
Dang ket noi vao IP:'192.168.0.1' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.11' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.12' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.13' voi Username: 'admin'
Thong tin neighbors da luu vao file: 'show_cdp_neighbors.txt' tai duong dan 'C:\python'

C:\python>
Nội dung file 


Chúng ta thấy rằng thông tin neighbor của Sw_13 chưa được thể hiện trong file, vì thiết bị này cdp không được cài đặt. Thông tin các thiết bị đã cấu hình tắt cdp được lưu ở file show_cdp_NOT_enable.csv (file này sinh ra trong khi thực thi chương trình)

2. Cấu hình cdp run trên Sw_13 (dùng netmiko để cấu hình), thực hiện show cdp để lấy thông tin đấu nối và ghi tiếp vào kết quả của yêu cầu 1

  • Code
Định nghĩa hàm show_cdp_not_running (4):
from netmiko import ConnectHandler
import time
file_cdp_not = "show_cdp_NOT_enable.csv"
conf_t = "conf t"
cdp_run = "cdp run"
keys = "no., host, username, password, device_type, remark" # header cho file show_cdp_NOT_enable.csv
txt = file_cdp_not

cdp_device = {} 
def show_cdp_not_running(txt):

	cmd_run = "cdp run"
	net_connect = ConnectHandler(**cdp_device)
	#output = net_connect.send_command(cmd)
	output = net_connect.send_command_timing(conf_t) 			# vào mode config t
	output += net_connect.send_command_timing(cdp_run)			# cấu hình cdp run
	
	'''
	đợi 65s sau đó gọi hàm show_cdp(txt). 
	Mặc định cứ 60s/lần cdp sẽ gửi thông tin cdp cho láng giềng, để chắc ăn chúng ta thêm vài giây
	'''
	time.sleep(65)												
	show_cdp(txt)                                               # gọi hàm show_cdp như bình thường, vì đã cấu hình cdp run
	
	output += net_connect.send_command_timing("no " + cdp_run)  # trả lại cấu hình ban đầu

Mở file và gọi hàm xử lý (5)
try: 
	with open (file_cdp_not,"r") as rfile: 
		keys = key_csv.split(", ") #
		values = rfile.read()
		for values in values.splitlines(): 
			values = values.split(",") 
			for i in range(1,len(keys)-1,1): 
				cdp_device[keys[i]] = values[i]  
			
			show_cdp_not_running(file_cdp_not) # truyền chuỗi vào nhằm mục đích ghi chú
except NameError: 
	
	print("File'{}' khong ton tai!".format(file_cdp_not))
	pass

Vì file "show_cdp_NOT_enable.csv" có thể tồn tại hoặc không, chúng ta thực bắt lỗi để khi nếu có lỗi về việc này chương trình vẫn tiếp tục.

  • Code chính gộp các đoạn (3) + (4) + (5) = (6)
from netmiko import ConnectHandler 
import re
import os
import time

file_cdp = "show_cdp_neighbors.txt"
file_cdp_not = "show_cdp_NOT_enable.csv"
path = os.getcwd()	# lấy đường dẫn hiện tại

conf_t = "conf t"
cdp_run = "cdp run"
key_csv = "no., host, username, password, device_type, remark" # header cho file show_cdp_NOT_enable.csv
txt = file_cdp_not

cdp_device = {} 
def show_cdp(txt):
	cmd = "show cdp neighbors"
	cmd2 = "show cdp entry"
	
	if txt == file_cdp_not:
		print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}' '{txt}'")	# sau khi enable cdp sẽ thông báo dòng này
	else:	
		print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	
	net_connect = ConnectHandler(**cdp_device)

	output = net_connect.send_command(cmd)
	i = 0 # định nghĩa biến đếm chỉ dùng trong trường hợp CDP not enable
	
	if "CDP is not enabled" in  output:							# nếu cdp không được enable
		i += 1
		with open (file_cdp_not,"a") as afile:					# mở file ghi log và sẽ xử lý sau
			afile.write(str(i) + "," + values[1] + "," + values[2] + "," + values[3] + "," + values[4] + "," + output + "\n") 		# ghi thông tin ip, username, password.... vào file
	else:		
		with open (file_cdp, "a") as afile:
			if txt == file_cdp_not:
				afile.write("\n\n" + "=" * 40 + txt + "=" * 40) # chèn thêm dòng này file log nếu nếu cdp không được enable
			afile.write("\n\n" + "*" * 40 + values[1] + "*" * 40 +"\n")
			afile.write(output)
		
		'''
		output của lệnh: "show cdp neighbors" trả về có dạng:
		---------------------------------------------------------------------------
		Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone, 
                  D - Remote, C - CVTA, M - Two-port Mac Relay 

		Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
		Sw_12.netmiko.lab
		                 Eth 0/2           137             R S I  Linux Uni Eth 0/0
		Sw_11.netmiko.lab
		                 Eth 0/1           135             R S I  Linux Uni Eth 0/0

		Total cdp entries displayed : 2
		---------------------------------------------------------------------------
		bỏ 5 dòng đầu tiên là header, 
		lấy từ dòng số 6 đến cuối kết quả và bỏ 2 dòng cuối cùng
		mỗi dòng chuyển thành list
		'''
		lines = output.splitlines()[5:-2]
		
		''' 
		xử lý và trích lọc trong lệnh show cdp neighbors, show cdp entry *
		- 
		-
		'''
		hostname = None
		for line in lines:
			fields = line.split()					# chuyển mỗi dòng sang list
			if len(fields) == 1:					# đối với những hostname dài kết quả của neighbors sẽ trả về 2 dòng cho mỗi neighbors
				hostname = fields[0]

			elif hostname == None:					# kết quả của neighbors sẽ trả về là 1 dòng thì thực hiện trong elif này
				hostname = fields[0]				# lấy ra hostname của láng giềng
				localint = "".join(fields[1:3])		# lấy ra local interface (lấy trường số 1 đến số 2)
				remoteint = "".join(fields[-2:])	# lấy ra remote interface


				outputentry = net_connect.send_command(cmd2 + " " + hostname) 
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'  	# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)    # trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))			# remove duplicate IP và convert to string
				
				with open ("show_cdp_neighbors.txt", "a") as afile:
					
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)
					afile.write("\nIP address: " + ips)
					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)
				
			else:
				outputentry = net_connect.send_command(cmd2 + " " + hostname)
				regex = r'\d{1,3}(?:\.\d{1,3}){3}'			# định nghĩa regular expression của IPv4 có dạng
				ips = re.findall(regex, outputentry)		# trích lọc lấy IPv4 ra, IP trả về là dạng list
				ips = "".join(list(set(ips)))				# remove duplicate IP và convert to string	
				localint = "".join(fields[:2])				# lấy 2 trường đầu tiên
				remoteint = "".join(fields[-2:])			# lấy 2 trường cuối cùng

				with open ("show_cdp_neighbors.txt", "a") as afile:
					afile.write("{}{}".format("\n\n","-" * 80))
					afile.write("\nThe information of the neighbors:\n")
					afile.write("\nNeighbors hostname is: " + hostname)

					afile.write("\n\nLocal interface: " + localint + " of " + values[1] + " connect to interface: " + remoteint + " of IP(s) " + ips)					

def show_cdp_not_running(txt):

	cmd_run = "cdp run"
	net_connect = ConnectHandler(**cdp_device)
	#output = net_connect.send_command(cmd)
	output = net_connect.send_command_timing(conf_t) 			# vào mode config t
	output += net_connect.send_command_timing(cdp_run)			# cấu hình cdp run
	
	'''
	đợi 65s sau đó gọi hàm show_cdp(txt). 
	Mặc định cứ 60s/lần cdp sẽ gửi thông tin cdp cho láng giềng, để chắc ăn chúng ta thêm vài giây
	'''
	time.sleep(65)												
	show_cdp(txt)                                               # gọi hàm show_cdp như bình thường, vì đã cấu hình cdp run
	
	output += net_connect.send_command_timing("no " + cdp_run)  # trả lại cấu hình ban đầu




with open ("device_listCDP.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): 
		cdp_device[keys[i]] = values[i]  
	
	#print(f"Dang ket noi vao IP:'{values[1]}' voi Username: '{values[2]}'")	
	show_cdp(values[1]) # trong trường hợp này biến values[1] truyền vào nhưng không dùng đến

'''
dùng trong trường hợp cdp run đã được tắt
danh sách này có được khi ta thực hiện lệnh show cdp không thành lưu nó lại
bây giờ mở ra để xử lý
'''
try: 
	with open (file_cdp_not,"r") as rfile: 
		keys = key_csv.split(", ") #
		values = rfile.read()
		for values in values.splitlines(): 
			values = values.split(",") 
			for i in range(1,len(keys)-1,1): 
				cdp_device[keys[i]] = values[i]  
			
			show_cdp_not_running(file_cdp_not) # truyền chuỗi vào nhằm mục đích ghi chú
except NameError: 
	
	print("File'{}' khong ton tai!".format(file_cdp_not))
	pass

print("Thong tin neighbors da luu vao file: '{}' tai duong dan '{}'".format(file_cdp,path))


P/s: trong phần code của hàm show_cdp có chèn thêm các dòng 20 -> 22 và 36,37 như hình dưới:


  • Chạy code
C:\python>python Demo.py
Dang ket noi vao IP:'192.168.0.1' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.11' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.12' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.13' voi Username: 'admin'
Dang ket noi vao IP:'192.168.0.13' voi Username: 'admin' 'show_cdp_NOT_enable.csv'
Thong tin neighbors da luu vao file: 'show_cdp_neighbors.txt' tai duong dan 'C:\python'

    Chúng ta thấy ip 192.168.0.13 được kết nối vào 2 lần:
    - Lần 1: kiểm tra show cdp không thành công => đưa ip này vào danh sách thiết bị cdp không được cấu hình/hay tắt
    - Lần 2: kết nối vào cấu hinh cdp run rồi thực hiện show cdp như bình thường, xong trả lại cấu hình ban đầu cho thiết bị

    • Kết quả

    Đối với các thiết bị không cấu hình cdp run nó sẽ thêm vào log dòng show_cdp_NOT_enable như hình.


    Xong!

    Học Python Qua Ví Dụ #007 - Python List/List, Loop For Enumerate, Append, Extend, Insert-Vòng Lặp, Cách Thêm/Nối Phần Tử Trong Python

    Yêu cầu:
    1. Thực hiện in List trong python
    2. In list với Loop và enumerate
    3. List, String format, F-string
    4. Các cách thêm/nối list và Append, Extend, Insert

    Thực hiện:

    1. Thực hiện in List trong python

    • Ví dụ 1:
    Code:
    ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
    print()
    print("Chieu dai cua list: ", len(ip_list)) # in ra chiều dài của list
    print (ip_list[0]) # index 0: kết quả sẽ là "192.168.1.10"
    print (ip_list[1]) # index 1 kết quả sẽ là "192.168.1.11"
    print (ip_list[2]) # index 2 kết quả sẽ là "192.168.1.12"
    

    Noted: Trong list Index và value tạo nên Item, ở ví dụ trên ta có 3 item với các giá trị dương đương như bảng
    Bảng cấu trúc của list

      • Hoặc in tất cả các items của list kết hợp với Loop - For
    Code:
    ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
    print()
    print("Chieu dai cua list: ", len(ip_list)) # in ra chiều dài của list
    for items in ip_list: # đọc cho đến hết list
    	print (items) 
    


    Kết quả:
    C:\python>python Demo.py
    Chieu dai cua list:  3
    192.168.1.10
    192.168.1.11
    192.168.1.12

    C:\python>

     

    • Ví dụ 2:
    ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12", "10.12.1.1"]
    kq = [i for i in ip_list if "10." in i] # lấy ra vị trị thứ i của list, nếu "10." có trong vị trí đó
    print(kq)
    
    Kết quả:
    C:\python>python Demo.py
    ['10.12.1.1']

    • Ví dụ 3:
    string = "Hello 12345 World"
    numbers = [x for x in string if x.isdigit()] # trả về một list kết quả nếu ký tự trong chuỗi là số thì
    print (numbers)
    

    C:\python>python Demo.py
    ['1', '2', '3', '4', '5']

    • Ví dụ 4:
    '''
    vòng for y sẽ chạy trước
    có nghĩa chương trình sẽ chạy là:
    10 + 20
    10 + 40
    10 + 60
    30 + 20
    30 + 40
    ...
    ...
    '''
    a=[x+y for x in [10,30,50] for y in [20,40,60]] 
    print (a)
    

    C:\python>python Demo.py
    [30, 50, 70, 50, 70, 90, 70, 90, 110]

    2. In list với Loop và enumerate
      Code:
      ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
      print()
      
      for items in enumerate(ip_list): # đọc cho đến hết list
      	print (items)  # kết quả trả về bao gồm index và giá trị theo từng cặp.
      

      Kết quả:
      C:\python>python Demo.py

      (0, '192.168.1.10')
      (1, '192.168.1.11')
      (2, '192.168.1.12')

      C:\python>

      • Ví dụ khác:
      Code:
      ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
      print()
      
      var_index=[]
      var_value=[]
      for x, y in enumerate(ip_list):
      	var_index.append(x) # nối list index
      	var_value.append(y) # nối list value
      '''
      in ra thành list
      list thứ nhất là index
      list thứ hai là value
      '''
      print(var_index)
      print(var_value)
      

      Kết quả:
      C:\python>python Demo.py
      [0, 1, 2]
      ['192.168.1.10', '192.168.1.11', '192.168.1.12']

      C:\python>

      3. List, String format, F-string
        Ví dụ:

        Code:
        hostname = ["R_HaNoi", "R_DaNang", "R_HoChiMinh"]
        ip_addr = ["10.0.0.1", "172.16.1.2","192.168.1.3"]
        item =["Devices", "Management IP", "-"]
        
        #format
        print()
        print("{:^50}".format("=====USING FORMAT METHOD OF STRING CLASS====="))
        print("{:^20} {:^20}".format(item[0], item[1]))
        print("{:^20} {:^20}".format(item[2]*20,item[2]*20))
        print("{:>20} {}".format(hostname[0],ip_addr[0]))
        print("{:>20} {}".format(hostname[1],ip_addr[1]))
        print("{:>20} {}".format(hostname[2],ip_addr[2]))
        
        #f-string
        print()
        print(f"{'=====USING F-STRING=====':^50}")
        print(f"{item[0]:^20}  {item[1]:^20}")
        print(f"{item[2]*20:^20}  {item[2]*20:^20}")
        print(f"{hostname[0]:>20}  {ip_addr[0]}")
        print(f"{hostname[1]:>20}  {ip_addr[1]}")
        print(f"{hostname[2]:>20}  {ip_addr[2]}")
        

        Kết quả:


        4. Các cách thêm/nối list và Append, Extend, Insert
        • List-Extend: Thêm list mới vào list list đã có (thừa kế dữ liệu của list cũ)
        Code:
        ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
        print()
        print(ip_list)
        ip_list.extend(["8.8.8.8", "4.4.4.4"]) # thêm giá trị vào cuối list
        print(ip_list)
        

        Kết quả:
        C:\python>python Demo.py
        ['192.168.1.10', '192.168.1.11', '192.168.1.12']
        ['192.168.1.10', '192.168.1.11', '192.168.1.12', '8.8.8.8', '4.4.4.4']

        C:\python>

        • List-Append: Thêm phân tử vào cuối của list 
        Code:
        ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
        print()
        print(ip_list)
        ip_list.append("10.10.10.10") # thêm giá trị vào cuối list
        print(ip_list)
        

        Kết quả:
        C:\python>python Demo.py
        ['192.168.1.10', '192.168.1.11', '192.168.1.12']
        ['192.168.1.10', '192.168.1.11', '192.168.1.12', '10.10.10.10']

        C:\python>

        • List-Insert: Thêm phần tử vào một vị trí (index) của list, các phần từ vị trí được thêm vào sẽ được đẩy lùi về sau
        Code:
        ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
        print()
        print(ip_list)
        ip_list.insert(1,"20.20.20.20") # thêm vào vị trí thứ 2 của list với giá trị là: "20.20.20.20"
        print(ip_list)
        

        Kết quả:
        C:\python>python Demo.py
        ['192.168.1.10', '192.168.1.11', '192.168.1.12']
        ['192.168.1.10', '20.20.20.20', '192.168.1.11', '192.168.1.12']

        C:\python>

        • Cộng list
        Code:
        ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
        ip_netpub = ["8.8.8.8","8.8.4.4","203.113.131.1","1.1.1.1"]
        cong_list = ip_list + ip_netpub # thực hiện cộng 2 list
        print()
        print(cong_list)
        

        Kết quả:
        C:\python>python Demo.py
        ['192.168.1.10', '192.168.1.11', '192.168.1.12', '8.8.8.8', '8.8.4.4', '203.113.131.1', '1.1.1.1']

        C:\python>


        Xong!
        /*header slide*/