Network Engineering

Network Automation Với Python: Netmiko, NAPALM Và Ansible Cho Cisco/Mikrotik

Cấu hình thủ công từng switch qua SSH không scale được khi hạ tầng có hàng chục thiết bị. So sánh 3 công cụ phổ biến nhất để tự động hóa mạng — và khi nào nên dùng công cụ nào.

13/07/2026 18 phút đọc Võ Đào Huy Hoàng

1. Giới Hạn Của Thao Tác CLI Thủ Công

SSH thủ công vào từng thiết bị để backup config, kiểm tra VLAN, hoặc đẩy một thay đổi ACL là quy trình quen thuộc với hầu hết network engineer — và cũng là quy trình dễ sai sót nhất khi số lượng thiết bị tăng lên. Với hạ tầng chỉ 5-10 thiết bị, thao tác thủ công vẫn ổn. Nhưng khi con số đó tăng lên hàng chục switch/router across nhiều site, ba vấn đề xuất hiện rõ rệt:

  • Không nhất quán: Cùng một thay đổi được gõ tay trên từng thiết bị dễ bị lệch cú pháp, gõ thiếu một dòng — dẫn đến cấu hình không đồng nhất giữa các thiết bị lẽ ra phải giống hệt nhau
  • Không có audit trail: Ai đã đổi gì, khi nào, trên thiết bị nào — nếu không dùng version control, câu trả lời thường chỉ có trong trí nhớ của người đã làm
  • Không scale theo thời gian: Backup config thủ công cho 30 thiết bị mỗi tuần là công việc tốn hàng giờ mà không tạo ra giá trị tương xứng với thời gian bỏ ra

Network automation với Python không nhằm thay thế network engineer — nó loại bỏ phần việc lặp lại, máy móc, để dành thời gian cho thiết kế và troubleshooting thực sự cần tư duy.

2. Ba Công Cụ Chính: Netmiko, NAPALM, Ansible

Ba công cụ này không cạnh tranh trực tiếp — chúng phù hợp với các lớp bài toán khác nhau và thường được dùng kết hợp trong cùng một hệ thống automation.

Công cụCách tiếp cậnPhù hợp nhất cho
NetmikoSSH wrapper, gửi lệnh CLI thô qua PythonScript tùy biến cao, lệnh show/backup, thao tác không chuẩn hoá được
NAPALMAbstraction layer — cùng 1 API cho nhiều vendorLấy dữ liệu có cấu trúc (facts, interfaces) đồng nhất giữa Cisco/Juniper/Arista
AnsibleKhai báo trạng thái mong muốn (declarative), idempotentChuẩn hoá cấu hình hàng loạt, quản lý bằng playbook có version control

Netmiko — SSH Thuần Cho Thiết Bị Mạng

Netmiko là thư viện Python đóng gói SSH client (dựa trên Paramiko) chuyên biệt cho thiết bị mạng — xử lý sẵn các vấn đề đặc thù như prompt detection, paging (--More--), và enable mode cho hàng chục loại thiết bị Cisco, Mikrotik, Juniper, HP.

from netmiko import ConnectHandler

device = {
    "device_type": "cisco_ios",
    "host": "192.168.1.1",
    "username": "admin",
    "password": "changeme",
}

with ConnectHandler(**device) as conn:
    output = conn.send_command("show ip interface brief")
    print(output)

    # Gửi nhiều lệnh cấu hình liên tiếp
    conn.send_config_set([
        "interface vlan 10",
        "description Servers-VLAN",
        "ip address 10.10.10.1 255.255.255.0",
    ])
    conn.save_config()

NAPALM — Abstraction Layer Đa Vendor

Khi hạ tầng có nhiều loại thiết bị khác nhau, viết script Netmiko riêng cho từng vendor (khác cú pháp lệnh show) nhanh chóng trở nên cồng kềnh. NAPALM giải quyết vấn đề này bằng cách chuẩn hoá output thành cùng một cấu trúc dữ liệu Python, bất kể thiết bị là Cisco IOS hay Juniper JunOS.

import napalm

driver = napalm.get_network_driver("ios")
device = driver(hostname="192.168.1.1", username="admin", password="changeme")
device.open()

facts = device.get_facts()
interfaces = device.get_interfaces()
print(f"Model: {facts['model']}, Uptime: {facts['uptime']}s")

device.close()

Cùng đoạn code trên chạy được với driver "junos" hoặc "eos" mà không cần sửa logic xử lý dữ liệu — đây là giá trị cốt lõi của NAPALM trong môi trường đa vendor.

3. Ví Dụ 1: Backup Config Hàng Loạt

Một trong những use case đầu tiên và giá trị nhất của network automation: backup config tự động cho toàn bộ thiết bị, lưu vào Git để có version history đầy đủ.

from netmiko import ConnectHandler
from datetime import datetime
import os

devices = [
    {"device_type": "cisco_ios", "host": "10.0.1.1", "username": "admin", "password": "changeme"},
    {"device_type": "cisco_ios", "host": "10.0.1.2", "username": "admin", "password": "changeme"},
    {"device_type": "mikrotik_routeros", "host": "10.0.1.3", "username": "admin", "password": "changeme"},
]

backup_dir = f"backups/{datetime.now().strftime('%Y-%m-%d')}"
os.makedirs(backup_dir, exist_ok=True)

for dev in devices:
    with ConnectHandler(**dev) as conn:
        hostname = conn.send_command("show run | include hostname") or dev["host"]
        config = conn.send_command("show running-config")
        with open(f"{backup_dir}/{dev['host']}.cfg", "w") as f:
            f.write(config)
        print(f"Backed up {dev['host']}")

# Sau đó: git add . && git commit -m "Daily config backup" && git push

Chạy script này qua cron job hàng đêm, kết hợp commit tự động vào Git repo, cho phép git diff giữa hai ngày để phát hiện ngay thay đổi config không mong muốn — kể cả thay đổi thực hiện ngoài quy trình.

4. Ví Dụ 2: Audit VLAN Toàn Mạng

Dùng NAPALM để nhanh chóng kiểm tra tính nhất quán VLAN giữa các switch — một tác vụ audit tốn nhiều thời gian nếu làm thủ công từng switch.

import napalm

switches = ["10.0.1.10", "10.0.1.11", "10.0.1.12"]
driver = napalm.get_network_driver("ios")

vlan_report = {}
for host in switches:
    device = driver(hostname=host, username="admin", password="changeme")
    device.open()
    vlans = device.get_vlans()
    vlan_report[host] = set(vlans.keys())
    device.close()

# Tìm VLAN không nhất quán giữa các switch
all_vlans = set.union(*vlan_report.values())
for host, vlans in vlan_report.items():
    missing = all_vlans - vlans
    if missing:
        print(f"{host} thiếu VLAN: {missing}")

5. Ansible Cho Cấu Hình Khai Báo (Declarative)

Khác với Netmiko/NAPALM (viết logic từng bước — imperative), Ansible network module cho phép khai báo trạng thái mong muốn và để Ansible tự tính toán các bước cần thiết để đạt trạng thái đó — đồng thời đảm bảo idempotent (chạy lại nhiều lần không gây thay đổi ngoài ý muốn).

# playbook: configure_vlans.yml
- name: Đảm bảo VLAN 10 và 20 tồn tại trên tất cả switch
  hosts: switches
  connection: network_cli
  gather_facts: false

  tasks:
    - name: Cấu hình VLAN
      cisco.ios.ios_vlans:
        config:
          - vlan_id: 10
            name: Servers
          - vlan_id: 20
            name: Workstations
        state: merged

Chạy lại playbook này 100 lần liên tiếp sẽ cho cùng một kết quả — nếu VLAN đã tồn tại đúng như khai báo, Ansible không thực hiện thay đổi gì (idempotent), khác với script Netmiko thuần túy có thể lỗi nếu chạy lại lệnh tạo VLAN đã tồn tại.

6. Triển Khai An Toàn: Dry-run Và Rollback

Tự động hóa mạng có rủi ro riêng: một lỗi trong script có thể đẩy sai cấu hình tới hàng chục thiết bị cùng lúc, thay vì chỉ một thiết bị như khi làm thủ công. Vài nguyên tắc an toàn bắt buộc:

1Luôn chạy dry-run/check-mode trước khi apply thật
2Test trên 1 thiết bị lab trước khi rollout hàng loạt
3Backup config trước mỗi lần thay đổi tự động
4Giới hạn batch size, không đẩy tới toàn bộ site cùng lúc

Ansible hỗ trợ --check mode để mô phỏng thay đổi mà không thực sự áp dụng, và serial: trong playbook để giới hạn số thiết bị được xử lý đồng thời — cả hai đều nên là mặc định bắt buộc trong bất kỳ pipeline network automation nào chạm tới production.

7. Kết Luận — Chọn Công Cụ Nào

Không có công cụ nào "tốt nhất" tuyệt đối — lựa chọn phụ thuộc vào bài toán cụ thể:

  • Cần một script nhanh để chạy lệnh show/backup, không cần chuẩn hóa nhiều vendor → Netmiko
  • Cần lấy dữ liệu có cấu trúc đồng nhất từ hạ tầng đa vendor (Cisco + Juniper + Mikrotik) → NAPALM
  • Cần chuẩn hóa và duy trì cấu hình hàng loạt theo thời gian dài, có version control, cần idempotency → Ansible

Trong thực tế, một hệ thống network automation trưởng thành thường dùng cả ba: Ansible cho cấu hình định kỳ/chuẩn hoá, Netmiko cho script tùy biến một lần, và NAPALM cho các tác vụ audit/reporting cần dữ liệu chuẩn hoá đa vendor.

Bắt đầu ngay:
  • Thử Netmiko trên 1 switch lab: kết nối, chạy show version, backup config ra file
  • Viết script backup config hàng loạt, kết hợp Git để có audit trail đầy đủ
  • Khi quen thuộc với API cơ bản, chuyển các tác vụ lặp lại định kỳ sang Ansible playbook để tận dụng idempotency