Bắt đầu nhanh: Vận hành chỉ trong 5 phút
Việc thay đổi VLAN thủ công trên 50 switch không chỉ nhàm chán mà còn là nguyên nhân dẫn đến sự cố lúc 2 giờ sáng. Dù Ansible là tiêu chuẩn ngành, nhưng DSL dựa trên YAML của nó có thể giống như một chiếc “áo bó” khi bạn cần logic phức tạp. Nornir thay đổi cuộc chơi, giúp việc tự động hóa mạng trở nên linh hoạt hơn. Đây là một framework gọn nhẹ, có tính cắm lắp (pluggable) cho phép bạn coi mạng của mình như một tập hợp các đối tượng Python, thực thi tác vụ đồng thời trên hàng nghìn node.
Đầu tiên, hãy thiết lập một môi trường ảo sạch. Bạn sẽ cần Nornir và plugin Netmiko để xử lý các công việc nặng nhọc trong giao tiếp SSH.
pip install nornir nornir_utils nornir_netmiko
Nornir tổ chức dữ liệu bằng ba tệp YAML đơn giản: config.yaml, hosts.yaml, và groups.yaml. Hãy thử lấy chuỗi phiên bản từ một router thử nghiệm để xem nó hoạt động như thế nào.
hosts.yaml
---
router-01:
hostname: 192.168.1.10
groups:
- cisco_ios
groups.yaml
---
cisco_ios:
platform: cisco_ios
username: admin
password: cisco123
Bây giờ, hãy viết script thực thi trong main.py:
from nornir import InitNornir
from nornir_netmiko.tasks import netmiko_send_command
from nornir_utils.plugins.functions import print_result
nr = InitNornir(config_file="config.yaml")
def get_info(task):
task.run(task=netmiko_send_command, command_string="show version")
results = nr.run(task=get_info)
print_result(results)
Chạy python main.py. Chỉ trong vài giây, bạn sẽ thấy chi tiết phần cứng của thiết bị. Bạn vừa thay thế quy trình đăng nhập thủ công mất 10 phút bằng một script có thể mở rộng quy mô cho toàn bộ trung tâm dữ liệu.
Kiến trúc: Tại sao Nornir chiến thắng ở quy mô lớn
Nornir không phải là một ứng dụng độc lập với CLI cồng kềnh. Nó là một thư viện hướng tới quản trị mạng chuyên nghiệp. Bằng cách import trực tiếp vào code Python, bạn có quyền truy cập vào các công cụ debug tiêu chuẩn như pdb và hỗ trợ IDE đầy đủ. Không còn phải đoán xem tại sao lỗi thụt đầu dòng YAML lại làm hỏng toàn bộ quá trình triển khai.
Phân cấp Inventory
Dữ liệu luôn sạch sẽ thông qua hệ thống ba tầng: Hosts, Groups, và Defaults. Triển khai phpIPAM trên Linux: Quản lý IP, VLAN và Subnet chuyên nghiệp là một cách tuyệt vời để bổ trợ cho việc quản lý inventory này. Điều này giúp cấu hình của bạn tuân thủ nguyên tắc DRY (Don’t Repeat Yourself). Bạn định nghĩa các IP duy nhất trong hosts.yaml, nhưng lưu trữ thông tin đăng nhập dùng chung trong groups.yaml. Nếu cần cập nhật chuỗi SNMP toàn cục cho 500 thiết bị, bạn chỉ cần thay đổi đúng một dòng trong defaults.yaml.
Trong thực tế, cấu hình này là một “cứu cánh”. Khi tôi quản lý một đội ngũ gồm 1.200 switch, cách tiếp cận phân cấp này đã cắt giảm sai lệch cấu hình (configuration drift) gần 40% vì chúng tôi đã ngừng việc fix cứng các biến ở cấp độ thiết bị.
Bộ lọc nhanh như chớp
Việc nhắm mục tiêu vào phần cứng cụ thể rất dễ dàng. Cần nâng cấp chỉ các router core tại văn phòng London? Sử dụng phương thức filter để phân tách inventory trong bộ nhớ ngay lập tức.
# Nhắm mục tiêu các site và role cụ thể
london_routers = nr.filter(site="LON", role="router")
# Hoặc lọc theo phiên bản phần mềm để vá lỗi
legacy_switches = nr.filter(version="15.2(E)")
Nornir sử dụng ThreadedRunner theo mặc định. Trong khi mô hình dựa trên fork của Ansible có thể gặp khó khăn với overhead cao, Nornir xử lý hơn 100 kết nối đồng thời với tác động CPU tối thiểu. Nó nhanh hơn từ 5 đến 10 lần một cách nhất quán cho các tác vụ lấy dữ liệu (polling) quy mô lớn.
Làm chủ các đợt triển khai phức tạp
Chạy một lệnh duy nhất chỉ là bắt đầu, nhưng hạ tầng mạng thực tế yêu cầu quản lý trạng thái và xử lý lỗi. Nornir sử dụng hệ thống dựa trên tác vụ, trong đó mỗi ‘task’ chỉ là một hàm Python tiêu chuẩn.
Jinja2: Sử dụng Template như chuyên gia
Fix cứng cấu hình là công thức dẫn đến thảm họa. Hãy sử dụng các template Jinja2 để tạo cấu hình động dựa trên dữ liệu riêng của từng thiết bị.
from nornir_jinja2.tasks import template_file
from nornir_netmiko.tasks import netmiko_send_config
def deploy_vlan(task):
# Xây dựng cấu hình từ một template
config_data = task.run(task=template_file,
template="vlan_config.j2",
path="templates")
# Đẩy nó xuống thiết bị phần cứng
task.run(task=netmiko_send_config,
config_commands=config_data.result.splitlines())
Xử lý điều tất yếu: Lỗi trong môi trường thực tế
Trong một môi trường lớn, một chiếc switch sớm muộn gì cũng sẽ ngoại tuyến hoặc từ chối mật khẩu. Nornir không chỉ đơn giản là bị crash. Nó ghi lại những thất bại này trong một đối tượng TaskResults, cho phép bạn xây dựng logic thử lại (retry) tùy chỉnh hoặc log các lỗi cụ thể vào cơ sở dữ liệu.
if results.failed:
for host, result in results.items():
if result.failed:
print(f"NGUY CẤP: {host} đã quá thời gian chờ (timeout). Ngoại lệ: {result.exception}")
Sự chi tiết này là lý do tại sao các lập trình viên chọn Nornir. Bạn không phải vật lộn với một công cụ thực thi hộp đen; bạn đang viết code Python tiêu chuẩn và dễ đọc.
Kinh nghiệm thực chiến từ thực địa
Chuyển từ CLI sang Nornir đòi hỏi một sự thay đổi về chiến thuật. Đây là những gì tôi đã học được từ việc triển khai xây dựng mạng lập trình được trong các môi trường yêu cầu thời gian hoạt động cao.
- Ngừng fix cứng mật khẩu: Sử dụng các biến môi trường hoặc tệp
.env. Để bảo mật tốt hơn, hãy tích hợp với Vault hoặc sử dụng modulegetpasscủa Python để chèn thông tin đăng nhập khi chạy. - Chiến lược “Chim báo bão” (Canary): Đừng bao giờ đẩy cấu hình lên 500 thiết bị cùng lúc. Sử dụng
filterđể kiểm tra script trên một switch không quan trọng trước. Nếu kề cận OSPF vẫn ổn định, hãy triển khai cho các thiết bị còn lại. - Chọn đúng công cụ cho công việc: Sử dụng
nornir_netmikođể có khả năng tương thích chung, nhưng hãy xem xétScraplinếu bạn cần tốc độ thô. Đối với các môi trường đa nhà cung cấp như khi triển khai FRRouting và Open vSwitch, NAPALM là người bạn tốt nhất của bạn. - Ghi log hoặc sẽ hối hận: Sử dụng module
loggingcủa Python. Khi sự cố xảy ra lúc 3 giờ chiều, bạn cần một bản ghi có mốc thời gian của mọi lệnh đã gửi đến core. “Cái gì đã thay đổi?” là câu hỏi bạn nên trả lời được trong vài giây.
Nornir biến các kỹ sư mạng thành những lập trình viên. Nó loại bỏ các lớp trừu tượng làm chậm bạn và mang lại hiệu suất cần thiết cho hạ tầng được định nghĩa bằng phần mềm hiện đại. Một khi bạn trải nghiệm việc thực thi song song ở tốc độ này, việc quay lại các script tuần tự sẽ giống như sử dụng modem quay số trong thế giới cáp quang.

