Tự động hóa mạng với Nornir: Khi Python ‘vượt mặt’ Ansible về tốc độ

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Nornir là gì? Tại sao nên ‘chia tay’ Ansible để chọn Nornir?

Nếu bạn đã làm Network Automation, chắc hẳn đã từng dùng qua Ansible. Ansible rất tốt, nhưng khi scale hệ thống lên hàng nghìn thiết bị, nó bắt đầu bộc lộ điểm yếu. Tốc độ thực thi chậm và cú pháp YAML cứng nhắc thường khiến việc xử lý logic phức tạp trở thành cơn ác mộng. Đó là lúc Nornir tỏa sáng.

Về bản chất, Nornir không phải công cụ chạy độc lập mà là một framework Python thuần túy. Bạn có thể tận dụng toàn bộ hệ sinh thái Python như Pandas để xử lý dữ liệu hay Requests để gọi API ngay trong script. Việc debug cũng trở nên trực quan hơn vì bạn đang làm việc với code, không phải file cấu hình text đơn thuần.

Quick Start: Chạy script đầu tiên trong 5 phút

Đầu tiên, hãy cài đặt Nornir cùng plugin Netmiko để tương tác với thiết bị qua SSH.

pip install nornir nornir_utils nornir_netmiko

Inventory của Nornir thường gồm 3 file YAML để quản lý thiết bị. Hãy chuẩn bị các file sau trong thư mục dự án:

1. config.yaml (Cấu hình hệ thống)

inventory:
  plugin: SimpleInventory
  options:
    host_file: "hosts.yaml"
    group_file: "groups.yaml"
runner:
  plugin: threaded
  options:
    num_workers: 20

2. groups.yaml (Quản lý theo nhóm)

ios_devices:
  platform: cisco_ios
  username: admin
  password: YourPassword123

3. hosts.yaml (Danh sách thiết bị cụ thể)

sw-access-01:
  hostname: 192.168.1.10
  groups:
    - ios_devices
sw-access-02:
  hostname: 192.168.1.11
  groups:
    - ios_devices

4. Script Python thực thi (main.py)

Script dưới đây sẽ kết nối đồng thời vào các thiết bị để lấy thông tin phiên bản phần mềm.

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 | inc Software")

results = nr.run(task=get_info)
print_result(results)

Điểm ăn tiền nhất của Nornir

Khả năng xử lý đa luồng (multi-threading) chính là vũ khí lợi hại nhất. Với thiết lập num_workers: 20, Nornir mở cùng lúc 20 kết nối SSH. Thử tưởng tượng bạn có 100 cái switch. Thay vì chờ 20 phút nếu chạy vòng lặp for thông thường, Nornir xử lý xong chỉ trong chưa đầy 2 phút.

Inventory linh hoạt, không gò bó

Nornir cho phép bạn viết plugin để lấy danh sách thiết bị từ bất kỳ đâu. Bạn có thể kéo dữ liệu từ NetBox, SolarWinds hoặc một file Excel cũ kỹ. Ở các doanh nghiệp lớn, danh sách thiết bị biến động liên tục. Lúc này, tính năng tự động cập nhật Inventory của Nornir thực sự là cứu cánh.

Lọc thiết bị thông minh với Filter

Nếu chỉ muốn tác động lên các Core Switch tại chi nhánh Hà Nội, bạn chỉ cần một dòng code:

core_switches = nr.filter(site="Hanoi", role="core")
results = core_switches.run(task=your_config_task)

Cấu hình hàng loạt (Configuration Management)

Để đẩy cấu hình xuống thiết bị, task netmiko_send_config là lựa chọn hàng đầu. Ví dụ, cập nhật Banner cảnh báo cho toàn hệ thống:

from nornir_netmiko.tasks import netmiko_send_config

def update_banner(task):
    commands = [
        "banner motd #",
        "CANH BAO: Chi nhung nguoi co tham quyen moi duoc phep truy cap!",
        "#"
    ]
    task.run(task=netmiko_send_config, config_commands=commands)

nr.run(task=update_banner)

Kinh nghiệm thực chiến: Xử lý sự cố trong 30 giây

Tôi từng gặp ca khó khi hệ thống tại một chi nhánh lớn bị mất gói tin chập chờn vào giờ cao điểm. Nghi vấn dồn vào lỗi vật lý trên hơn 40 switch access. Tuy nhiên, việc kiểm tra thủ công từng port sẽ ngốn cả buổi tối.

Tôi viết nhanh một script Nornir để quét lệnh show interfaces | inc CRC|Input errors trên toàn bộ 40 switch. Kết quả trả về sau đúng 30 giây. Tôi phát hiện ngay 2 port uplink bị tăng chỉ số CRC liên tục do dây cáp quang bị gập. Sự cố được cô lập và xử lý ngay lập tức nhờ tốc độ của automation.

Lời khuyên: Đừng đợi đến khi có sự cố mới viết code. Hãy xây dựng sẵn bộ thư viện task để kiểm tra sức khỏe thiết bị hoặc backup cấu hình định kỳ.

Nên chọn Nornir hay tiếp tục dùng Ansible?

Câu trả lời phụ thuộc vào bài toán cụ thể của bạn:

  • Chọn Ansible khi: Bạn cần sự đơn giản, ngại viết code Python và team đã quen với YAML. Ansible rất mạnh trong việc duy trì trạng thái thiết bị (State management).
  • Chọn Nornir khi: Ưu tiên tốc độ thực thi (nhanh gấp 5-10 lần Ansible). Phù hợp khi cần xử lý logic phức tạp như tính toán chia IP, kiểm tra điều kiện if/else lồng nhau hoặc tích hợp vào App Web.

Mẹo nhỏ để triển khai an toàn

  1. Cô lập môi trường: Luôn dùng Virtual Environment (venv) để tránh xung đột thư viện giữa các dự án.
  2. Nguyên tắc ‘Backup First’: Luôn chạy task lưu running-config ra file trước khi thực hiện bất kỳ thay đổi nào.
  3. Mô phỏng Dry-run: Tận dụng logic Python để in ra các lệnh dự kiến trước khi đẩy xuống thiết bị thật.
  4. Bảo mật là trên hết: Tuyệt đối không lưu mật khẩu dạng text. Hãy dùng biến môi trường hoặc các giải pháp như HashiCorp Vault.

Tự động hóa mạng không hề xa vời. Bắt đầu với Nornir sẽ giúp bạn tư duy như một lập trình viên thực thụ. Đây là bước đệm quan trọng để nâng tầm giá trị của một Network Engineer trong thời đại mới.

Share: