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ận | Phù hợp nhất cho |
|---|---|---|
| Netmiko | SSH wrapper, gửi lệnh CLI thô qua Python | Script tùy biến cao, lệnh show/backup, thao tác không chuẩn hoá được |
| NAPALM | Abstraction layer — cùng 1 API cho nhiều vendor | Lấy dữ liệu có cấu trúc (facts, interfaces) đồng nhất giữa Cisco/Juniper/Arista |
| Ansible | Khai báo trạng thái mong muốn (declarative), idempotent | Chuẩ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:
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.
- 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