Sự mong manh của CLI thủ công
Tôi đã từng dành sáu giờ đồng hồ vào một tối thứ Ba để cập nhật các thẻ VLAN trên 40 switch truy cập một cách thủ công. Đó là một công việc cực kỳ tẻ nhạt. Khi thực hiện được một nửa, tôi đã gõ nhầm một địa chỉ IP duy nhất trên một liên kết trunk cốt lõi, ngay lập tức khiến 200 người dùng mất kết nối mạng. Đây là rủi ro cố hữu của Giao diện dòng lệnh (CLI). Khi bạn quản lý 500 thiết bị, tỷ lệ lỗi 1% đồng nghĩa với năm sự cố lớn.
CLI được xây dựng cho mắt người, không phải cho các đoạn mã script. Nó tạo ra văn bản không cấu trúc, khác biệt giữa một thiết bị Cisco Catalyst chạy IOS-XE và một dòng Juniper MX. Để tự động hóa Giao diện dòng lệnh (CLI), bạn thường phải dựa vào Biểu thức chính quy (Regex) để “bóc tách” (scrape) dữ liệu. Cách tiếp cận này rất dễ lỗi; một bản cập nhật phần mềm đơn giản thay đổi một khoảng trắng trong đầu ra của lệnh có thể làm hỏng toàn bộ quy trình tự động hóa của bạn. Chúng ta cần một cách mạnh mẽ hơn để giao tiếp với phần cứng của mình.
YANG và NETCONF: Những Tiêu chuẩn Hiện đại
Để tiến tới Hạ tầng dưới dạng Mã nguồn (Infrastructure as Code – IaC) thực thụ, chúng ta cần một cách tiêu chuẩn hóa để mô hình hóa dữ liệu và một giao thức tin cậy để truyền tải dữ liệu đó. Đây là lúc sự kết hợp giữa YANG và NETCONF thay đổi cuộc chơi. Sự chuyển dịch này đưa chúng ta từ việc gửi các “câu lệnh” sang quản lý “trạng thái”.
YANG: Bản thiết kế Mô hình hóa Dữ liệu
YANG (Yet Another Next Generation) đóng vai trò là lược đồ (schema) cho bộ định tuyến của bạn. Nếu bạn đã từng làm việc với cơ sở dữ liệu, hãy coi YANG như định nghĩa bảng (table definition). Nó quy định chính xác dữ liệu nào là hợp lệ. Ví dụ, một mô hình YANG cho một interface đảm bảo rằng “MTU” phải là một số nguyên từ 64 đến 9216, thay vì chỉ là một chuỗi văn bản ngẫu nhiên.
Sử dụng các mô hình YANG như OpenConfig cho phép bạn viết một kịch bản hoạt động trên nhiều nhà cung cấp khác nhau. Bạn không còn cần quan tâm liệu lệnh cụ thể là ip address hay set address. Bạn chỉ cần cung cấp dữ liệu khớp với mô hình, và thiết bị sẽ xử lý phần còn lại. Việc tiêu chuẩn hóa này có thể giảm tới 70% thời gian viết logic cho từng nhà cung cấp cụ thể.
NETCONF: Đơn vị vận chuyển Tin cậy
Nếu YANG định nghĩa thông điệp, thì NETCONF (Network Configuration Protocol) là chiếc xe tải giao hàng an toàn. Được tiêu chuẩn hóa bởi IETF trong RFC 6241, nó thay thế cho SNMP cũ kỹ và CLI khó dự đoán. NETCONF chạy trên nền SSH và sử dụng XML để đảm bảo mọi trao đổi đều có cấu trúc và máy tính có thể đọc được.
Tính năng mạnh mẽ nhất ở đây là tính chất “giao dịch” (transactional) của các thay đổi. Không giống như một script CLI có thể thất bại giữa chừng và để lại bộ định tuyến trong trạng thái lỗi, NETCONF hỗ trợ cấu hình dự kiến (candidate configuration). Bạn có thể đẩy một thay đổi lớn, xác thực nó và cam kết (commit) nó như một hành động nguyên tử duy nhất. Nếu xác thực thất bại, bộ định tuyến sẽ từ chối toàn bộ khối cấu hình đó. Tính năng này có thể loại bỏ trạng thái “cấu hình dở dang” vốn là nguyên nhân gây ra rất nhiều sự cố mạng thực tế.
Chuẩn bị Lab
Hầu hết phần cứng cấp độ doanh nghiệp trong năm năm qua đều hỗ trợ NETCONF. Để thực hành theo, bạn có thể sử dụng thiết bị Cisco IOS-XE, chẳng hạn như CSR1000v hoặc switch dòng C9000. Đầu tiên, hãy bật subsystem NETCONF trên thiết bị của bạn:
conf t
netconf-yang
username admin privilege 15 password 0 cisco
line vty 0 4
login local
transport input ssh
Trên máy trạm quản lý của bạn, hãy cài đặt thư viện ncclient. Đây là thư viện Python phổ biến nhất để tương tác với các thiết bị NETCONF.
pip install ncclient
Lấy Dữ liệu không cần Regex
Hãy thử lấy cấu hình đang chạy (running configuration). Thay vì phân tích một bức tường văn bản, chúng ta sẽ nhận được dữ liệu XML có cấu trúc mà Python có thể đọc như một từ điển (dictionary).
from ncclient import manager
import xml.dom.minidom
device = {
"host": "10.1.1.5",
"port": 830,
"username": "admin",
"password": "cisco",
"hostkey_verify": False
}
with manager.connect(**device) as m:
# Yêu cầu cấu hình đang chạy
config = m.get_config(source='running')
# In định dạng XML đẹp mắt
parsed_xml = xml.dom.minidom.parseString(config.xml)
print(parsed_xml.toprettyxml())
Đầu ra là một cây XML có thể dự đoán được. Bạn có thể sử dụng ElementTree của Python để lấy IP của GigabitEthernet1 chỉ trong ba dòng mã. Không cần các mẫu Regex phức tạp, và script sẽ không bị lỗi nếu bộ định tuyến thêm một dòng mô tả mới vào đầu ra.
Đẩy Cấu hình một cách Tự tin
Cập nhật mô tả interface trở thành một hoạt động có cấu trúc thay vì một chuỗi các lệnh được gõ. Chúng ta gửi một đoạn mã XML nhắm mục tiêu vào mô-đun YANG cụ thể trên thiết bị.
config_data = """
<config>
<native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
<interface>
<GigabitEthernet>
<name>2</name>
<description>Uplink_den_Core_01</description>
</GigabitEthernet>
</interface>
</native>
</config>
"""
with manager.connect(**device) as m:
response = m.edit_config(target='running', config=config_data)
if response.ok:
print("Cấu hình đã được áp dụng thành công!")
Việc kiểm tra response.ok là cực kỳ quan trọng. Nó xác nhận bộ định tuyến đã chấp nhận dữ liệu và áp dụng nó. Nếu bạn gửi một thẻ XML sai định dạng, bộ định tuyến sẽ trả về một rpc-error. Điều này cho phép script của bạn bắt lỗi ngay lập tức trước khi chúng lan rộng ra toàn mạng.
Tại sao điều này quan trọng cho sự nghiệp của bạn
Sự chuyển dịch sang “Hạ tầng dưới dạng Mã nguồn” không còn là tùy chọn đối với các kỹ sư cấp cao. Các công ty đang dần từ bỏ việc cấu hình thủ công từng bước (hop-by-hop). Họ muốn các quy trình có thể lặp lại và được kiểm soát phiên bản (version-controlled). Các đội ngũ áp dụng NETCONF và YANG thường thấy thời gian triển khai giảm từ hàng giờ xuống còn vài phút.
Làm chủ các công cụ này cho phép bạn tích hợp mạng của mình vào các đường ống CI/CD. Bạn có thể thử nghiệm thay đổi cấu hình trong một lab ảo (như CML hoặc GNS3) và sau đó triển khai chính xác gói XML đó lên môi trường thực tế. Mức độ chính xác này là không thể đạt được với việc nhập lệnh CLI thủ công.
Kết luận
Chuyển từ CLI sang NETCONF và YANG đòi hỏi một cách tư duy khác. Bạn ngừng tập trung vào “làm thế nào” (gõ lệnh gì) và bắt đầu tập trung vào “cái gì” (trạng thái mong muốn của dữ liệu). Mặc dù XML có vẻ rườm rà so với một lệnh CLI nhanh, nhưng sự tin cậy mà nó mang lại ở quy mô lớn là vô song. Hãy bắt đầu từ những việc nhỏ bằng cách tự động hóa một tác vụ đơn giản như cập nhật NTP hoặc DNS trong lab của bạn. Một khi bạn trải nghiệm sự ổn định của dữ liệu có cấu trúc, CLI sẽ giống như một tàn tích của quá khứ.

