Trong bài Lab trước, chúng ta đã sử dụng thư viện Netmiko để tự động cấu hình thiết bị mạng bằng Python.
Tiếp nối nội dung đó, bài Lab này sẽ hướng dẫn cách sử dụng Netmiko kết hợp với NTC Templates để tự động kiểm tra VLAN và Access Port trên Switch Cisco, từ đó xây dựng nền tảng cho các bài toán Network Automation trong thực tế.
1. Mục tiêu của bài Lab
Chương trình Python sau khi hoàn thành sẽ có khả năng:
Nếu chỉ sử dụng Netmiko, khi thực hiện lệnh:
show vlan
Switch sẽ trả về dữ liệu dưới dạng text:
1 default active Et0/1,Et0/2
10 SALES active
20 SERVER active
Việc xử lý dữ liệu dạng text trong Python khá phức tạp và dễ phát sinh lỗi khi Cisco thay đổi định dạng hiển thị giữa các phiên bản IOS.
Đây là lúc thư viện NTC Templates phát huy tác dụng.
NTC Templates sẽ chuyển dữ liệu CLI sang dữ liệu có cấu trúc:
[
{
'vlan_id': '1',
'interfaces': ['Et0/1','Et0/2']
},
{
'vlan_id': '10',
'interfaces': []
}
]
Khi dữ liệu đã được chuyển đổi sang Dictionary hoặc JSON, việc kiểm tra VLAN hay Access Port chỉ còn là các thao tác xử lý dữ liệu thông thường của Python. 3. Chuẩn bị môi trường
Cài đặt thư viện
Trên máy Linux hoặc WSL thực hiện:
pip3 install netmiko ntc_templates
Kiểm tra cài đặt thành công:
pip3 list | grep netmiko
pip3 list | grep ntc
4. Chuẩn bị thiết bị mạng
Trước khi viết code cần đảm bảo Switch đã hỗ trợ SSH.
Cấu hình địa chỉ IP quản trị
interface e0/0
no switchport
ip address 192.168.1.1 255.255.255.0
no shutdown
Cấu hình SSH
username admin password 123
ip domain-name vnpro.local
crypto key generate rsa
1024
ip ssh version 2
line vty 0 4
login local
transport input ssh
Kiểm tra lại bằng lệnh:
show ip ssh
show run | section vty
Nếu SSH bằng PuTTY hoặc Terminal chưa thành công thì Netmiko cũng sẽ không thể kết nối được.
5. Tách riêng thông tin thiết bị
File device_list.py
from getpass import getpass
passwd = getpass("Nhap mat khau SSH: ")
sw1 = {
"device_type": "cisco_ios",
"ip": "192.168.1.1",
"username": "admin",
"password": passwd,
"secret": "321"
}
device_list = [sw1]
Việc tách riêng thông tin thiết bị giúp chương trình dễ mở rộng lên nhiều Switch trong tương lai mà không cần sửa code chính.
6. Kết nối SSH bằng Netmiko
ssh = ConnectHandler(**device)
ssh.enable()
Sau khi kết nối thành công, Python có thể thực hiện bất kỳ lệnh CLI nào trên Switch.
Ví dụ:
data = ssh.send_command("show vlan")
7. Chuyển đổi dữ liệu bằng NTC Templates
data_parse = parse_output(
platform="cisco_ios",
command="show vlan",
data=data
)
Kết quả nhận được:
[
{'vlan_id': '1', 'interfaces': ['Et0/1','Et0/2']},
{'vlan_id': '10', 'interfaces': []}
]
Đây chính là bước quan trọng nhất của bài Lab vì từ thời điểm này chương trình sẽ xử lý dữ liệu có cấu trúc thay vì xử lý chuỗi text.
8. Xây dựng Dictionary VLAN
vlan = {}
for i in data_parse:
vlan[i["vlan_id"]] = i["interfaces"]
Kết quả:
{
'1': ['Et0/1', 'Et0/2'],
'10': []
}
Việc chuyển sang Dictionary giúp tốc độ tìm kiếm và kiểm tra trạng thái nhanh hơn rất nhiều.
9. Kiểm tra VLAN tồn tại
if "10" in vlan:
print("VLAN 10 da ton tai")
else:
print("Dang tao VLAN 10")
Đây được gọi là kiểm tra trạng thái hiện tại trước khi thực hiện thay đổi.
Trong tự động hóa hạ tầng, nguyên tắc này được gọi là Idempotent Configuration. 10. Kiểm tra Access Port
required_ports = ["Et0/1", "Et0/2"]
for port in required_ports:
if port in vlan["10"]:
print(f"{port} da thuoc VLAN 10")
else:
print(f"{port} chua thuoc VLAN 10")
Đây là mô hình thường được sử dụng trong các hệ thống kiểm tra cấu hình và audit hệ thống mạng.
11. Tự động cấu hình nếu phát hiện sai lệch
Nếu VLAN chưa tồn tại:
ssh.send_config_set([
"vlan 10",
"name USERS"
])
Nếu Access Port chưa được cấu hình:
ssh.send_config_set([
"interface e0/1",
"switchport mode access",
"switchport access vlan 10"
])
Như vậy chương trình không chỉ dừng lại ở việc giám sát mà đã bắt đầu chuyển sang hướng tự động khắc phục cấu hình.
Kết luận
Giá trị lớn nhất của bài Lab không nằm ở việc tạo VLAN hay gán Access Port.
Điều quan trọng hơn là giúp kỹ sư mạng thay đổi tư duy vận hành:
Tiếp nối nội dung đó, bài Lab này sẽ hướng dẫn cách sử dụng Netmiko kết hợp với NTC Templates để tự động kiểm tra VLAN và Access Port trên Switch Cisco, từ đó xây dựng nền tảng cho các bài toán Network Automation trong thực tế.
1. Mục tiêu của bài Lab
Chương trình Python sau khi hoàn thành sẽ có khả năng:
- Kết nối SSH tới Switch Cisco.
- Thu thập thông tin VLAN hiện có trên thiết bị.
- Kiểm tra VLAN 10 đã tồn tại hay chưa.
- Kiểm tra các Access Port e0/1 và e0/2 đã được gán vào VLAN 10 hay chưa.
- Tự động thực hiện cấu hình nếu phát hiện thiếu VLAN hoặc thiếu cấu hình Access Port.
- Hiển thị kết quả kiểm tra để phục vụ công tác vận hành và kiểm tra hệ thống.
Nếu chỉ sử dụng Netmiko, khi thực hiện lệnh:
show vlan
Switch sẽ trả về dữ liệu dưới dạng text:
1 default active Et0/1,Et0/2
10 SALES active
20 SERVER active
Việc xử lý dữ liệu dạng text trong Python khá phức tạp và dễ phát sinh lỗi khi Cisco thay đổi định dạng hiển thị giữa các phiên bản IOS.
Đây là lúc thư viện NTC Templates phát huy tác dụng.
NTC Templates sẽ chuyển dữ liệu CLI sang dữ liệu có cấu trúc:
[
{
'vlan_id': '1',
'interfaces': ['Et0/1','Et0/2']
},
{
'vlan_id': '10',
'interfaces': []
}
]
Khi dữ liệu đã được chuyển đổi sang Dictionary hoặc JSON, việc kiểm tra VLAN hay Access Port chỉ còn là các thao tác xử lý dữ liệu thông thường của Python. 3. Chuẩn bị môi trường
Cài đặt thư viện
Trên máy Linux hoặc WSL thực hiện:
pip3 install netmiko ntc_templates
Kiểm tra cài đặt thành công:
pip3 list | grep netmiko
pip3 list | grep ntc
4. Chuẩn bị thiết bị mạng
Trước khi viết code cần đảm bảo Switch đã hỗ trợ SSH.
Cấu hình địa chỉ IP quản trị
interface e0/0
no switchport
ip address 192.168.1.1 255.255.255.0
no shutdown
Cấu hình SSH
username admin password 123
ip domain-name vnpro.local
crypto key generate rsa
1024
ip ssh version 2
line vty 0 4
login local
transport input ssh
Kiểm tra lại bằng lệnh:
show ip ssh
show run | section vty
Nếu SSH bằng PuTTY hoặc Terminal chưa thành công thì Netmiko cũng sẽ không thể kết nối được.
5. Tách riêng thông tin thiết bị
File device_list.py
from getpass import getpass
passwd = getpass("Nhap mat khau SSH: ")
sw1 = {
"device_type": "cisco_ios",
"ip": "192.168.1.1",
"username": "admin",
"password": passwd,
"secret": "321"
}
device_list = [sw1]
Việc tách riêng thông tin thiết bị giúp chương trình dễ mở rộng lên nhiều Switch trong tương lai mà không cần sửa code chính.
6. Kết nối SSH bằng Netmiko
ssh = ConnectHandler(**device)
ssh.enable()
Sau khi kết nối thành công, Python có thể thực hiện bất kỳ lệnh CLI nào trên Switch.
Ví dụ:
data = ssh.send_command("show vlan")
7. Chuyển đổi dữ liệu bằng NTC Templates
data_parse = parse_output(
platform="cisco_ios",
command="show vlan",
data=data
)
Kết quả nhận được:
[
{'vlan_id': '1', 'interfaces': ['Et0/1','Et0/2']},
{'vlan_id': '10', 'interfaces': []}
]
Đây chính là bước quan trọng nhất của bài Lab vì từ thời điểm này chương trình sẽ xử lý dữ liệu có cấu trúc thay vì xử lý chuỗi text.
8. Xây dựng Dictionary VLAN
vlan = {}
for i in data_parse:
vlan[i["vlan_id"]] = i["interfaces"]
Kết quả:
{
'1': ['Et0/1', 'Et0/2'],
'10': []
}
Việc chuyển sang Dictionary giúp tốc độ tìm kiếm và kiểm tra trạng thái nhanh hơn rất nhiều.
9. Kiểm tra VLAN tồn tại
if "10" in vlan:
print("VLAN 10 da ton tai")
else:
print("Dang tao VLAN 10")
Đây được gọi là kiểm tra trạng thái hiện tại trước khi thực hiện thay đổi.
Trong tự động hóa hạ tầng, nguyên tắc này được gọi là Idempotent Configuration. 10. Kiểm tra Access Port
required_ports = ["Et0/1", "Et0/2"]
for port in required_ports:
if port in vlan["10"]:
print(f"{port} da thuoc VLAN 10")
else:
print(f"{port} chua thuoc VLAN 10")
Đây là mô hình thường được sử dụng trong các hệ thống kiểm tra cấu hình và audit hệ thống mạng.
11. Tự động cấu hình nếu phát hiện sai lệch
Nếu VLAN chưa tồn tại:
ssh.send_config_set([
"vlan 10",
"name USERS"
])
Nếu Access Port chưa được cấu hình:
ssh.send_config_set([
"interface e0/1",
"switchport mode access",
"switchport access vlan 10"
])
Như vậy chương trình không chỉ dừng lại ở việc giám sát mà đã bắt đầu chuyển sang hướng tự động khắc phục cấu hình.
Kết luận
Giá trị lớn nhất của bài Lab không nằm ở việc tạo VLAN hay gán Access Port.
Điều quan trọng hơn là giúp kỹ sư mạng thay đổi tư duy vận hành:
- Không cấu hình trước rồi mới kiểm tra.
- Hãy kiểm tra trạng thái hiện tại của hệ thống trước, phát hiện sai lệch và chỉ thực hiện thay đổi khi thật sự cần thiết.