Python & Netmiko: Giải cứu kỹ sư mạng khỏi 3 giờ cấu hình Switch thủ công

Python tutorial - IT technology blog
Python tutorial - IT technology blog

Cú điện thoại lúc 2 giờ sáng và ác mộng mang tên “SSH thủ công”

Màn hình điện thoại sáng rực, rung bần bật trên bàn. 2 giờ sáng. Đầu dây bên kia, sếp gằn giọng: “VLAN chi nhánh phía Nam lỗi trắng rồi, anh em vào fix gấp, khách đang kêu cháy máy!”. Mình bật dậy, mắt nhắm mắt mở đăng nhập VPN. Trước mắt là 50 con Switch Cisco và 10 con Router Juniper đang đợi thay đổi cấu hình ngay lập tức.

Làm thủ công nghĩa là SSH từng con, gõ conf t, dán lệnh rồi write mem. Mỗi thiết bị mất tầm 3 phút. Với 60 con, mình sẽ tốn 180 phút gõ phím liên tục như một cái máy. Trong khi đó, dịch vụ đang tê liệt. Lúc này mình mới thấm thía: Nếu không biết dùng Python để tự động hóa, mình sẽ kiệt sức trước khi kịp thăng tiến.

Script đầu tay của mình chỉ vỏn vẹn 200 dòng chạy tạm bợ. Sau vài lần “vỡ mật” như đêm ấy, nó đã phình lên hơn 2000 dòng với đầy đủ module xử lý lỗi. Hôm nay, mình sẽ chia sẻ cách giúp anh em thoát cảnh thức trắng đêm làm những việc lặp đi lặp lại.

Tại sao chọn Netmiko thay vì Paramiko?

Kỹ sư mới học Python thường bắt đầu với Paramiko. Tuy nhiên, Paramiko chỉ là thư viện SSH thuần túy. Nó hoàn toàn không hiểu các đặc thù của thiết bị mạng. Ví dụ: dấu nhắc --More-- khi xem log dài, hay việc phải nhập mật khẩu lần hai khi gõ enable trên Cisco.

Netmiko là trợ thủ đắc lực được xây dựng dựa trên Paramiko. Nó đóng gói sẵn cơ chế xử lý prompt và hỗ trợ hơn 100 vendor từ Cisco IOS, Arista EOS đến Juniper Junos. Với Netmiko, bạn chỉ cần định nghĩa thiết bị và gửi lệnh. Mọi việc còn lại thư viện sẽ tự lo liệu.

Cài đặt môi trường trong 30 giây

Anh em chỉ cần một môi trường Python sạch và chạy lệnh cài đặt qua pip:

pip install netmiko

Thực hành: Script cấu hình hàng loạt đầu tiên

Giả sử bạn cần đổi mật khẩu enable hoặc tạo VLAN mới cho danh sách thiết bị. Thay vì gõ tay, chúng ta sẽ dùng file devices.txt chứa IP và để Python xử lý.

1. Khai báo thông số thiết bị

Bạn hãy bắt đầu bằng việc khai báo thông số dưới dạng Python Dictionary. Đây là cấu trúc cơ bản nhất giúp code mạch lạc:

from netmiko import ConnectHandler

cisco_device = {
    'device_type': 'cisco_ios',
    'host': '192.168.1.10',
    'username': 'admin',
    'password': 'your_password',
    'secret': 'enable_password', # Mật khẩu enable
    'port': 22,
}

2. Kết nối và thực thi lệnh

Điểm cộng lớn nhất của Netmiko là phương thức send_config_set(). Nó tự động vào chế độ configure terminal, thực thi danh sách lệnh rồi thoát ra. Rất nhàn nhã!

def deploy_config(device_info, config_commands):
    try:
        # Khởi tạo kết nối SSH
        net_connect = ConnectHandler(**device_info)
        
        # Vào chế độ enable
        net_connect.enable()
        
        # Gửi danh sách cấu hình
        output = net_connect.send_config_set(config_commands)
        
        # Lưu cấu hình vào NVRAM
        net_connect.send_command("write memory")
        
        print(f"[OK] Đã cấu hình xong {device_info['host']}")
        
        # Ngắt kết nối
        net_connect.disconnect()
        
    except Exception as e:
        print(f"[Error] Lỗi tại {device_info['host']}: {str(e)}")

# Lệnh thực tế: Thêm VLAN 100 và gán vào port 1
commands = [
    'vlan 100',
    'name ITFROMZERO_NETWORK',
    'interface FastEthernet0/1',
    'switchport access vlan 100'
]

deploy_config(cisco_device, commands)

Bài học xương máu: Đừng mang code “ngây thơ” vào Production

Khi scale script từ 200 lên 2000 dòng, mình nhận ra code chạy được chỉ chiếm 30%. 70% còn lại dùng để xử lý lỗi. Thực tế, thiết bị mạng rất hay “dở chứng”. Con thì treo SSH, con thì sai pass, con lại đang có người khác chiếm quyền cấu hình.

Dưới đây là 3 thứ anh em bắt buộc phải thêm vào script để tránh “ăn hành”:

  • Timeout: Giới hạn thời gian chờ (ví dụ 10 giây). Đừng để script đứng im vĩnh viễn khi một con Switch không phản hồi.
  • Logging: Luôn ghi nhật ký vào file. Nếu sáng mai sếp hỏi “Hồi đêm chạy lệnh gì mà sập mạng?”, bạn sẽ có bằng chứng đối soát.
  • Try-Except: Bọc mọi kết nối trong khối xử lý ngoại lệ. Việc này giúp script tiếp tục chạy sang thiết bị thứ 2 nếu con thứ 1 bị lỗi.

Cách quản lý danh sách thiết bị lớn

Thay vì viết cứng IP vào code, hãy đọc từ file bên ngoài. Sử dụng thư viện getpass sẽ giúp bảo mật mật khẩu tốt hơn:

import getpass

# Nhập mật khẩu từ terminal, tránh lộ thông tin trong file code
password = getpass.getpass("Nhập mật khẩu SSH: ")

with open('switch_list.txt') as f:
    for ip in f:
        current_device = {
            'device_type': 'cisco_ios',
            'host': ip.strip(),
            'username': 'admin',
            'password': password,
        }
        deploy_config(current_device, commands)

Lời kết cho anh em Network Engineer

Học Python ban đầu có thể gây nản với dân thuần cấu hình thiết bị. Nhưng tin mình đi, cảm giác nhấn Enter và nhìn 50 con Switch tự chạy lệnh trong lúc nhâm nhi cà phê rất tuyệt vời. Automation không chỉ giúp bạn nhàn hơn, nó còn giúp chuẩn hóa (standardization) toàn bộ hệ thống mạng.

Đừng đợi đến lúc xảy ra sự cố vào 2 giờ sáng mới bắt đầu vác sách đi học. Hãy thử cài đặt Netmiko ngay hôm nay trên các môi trường giả lập như Eve-NG hay GNS3 để thấy sự khác biệt nhé!

Share: