Pythonを使ってターミナルサーバ経由でNW機器を操作する方法


はじめに

Cisco IOSなどのNW機器を初期設定する際、USBコンソールケーブル経由で行うのが一般的かと思います。
他の方法として、以下の通りターミナルサーバ経由でSSH/Telnet接続し、「オンライン」の機器とほぼ同じ要領で初期設定することも可能です。

 [ 作業PC ] - ( Ethernet ) - [ ターミナルサーバ ] - ( コンソール ) - [ NW機器 ]

ただし、オンライン接続といくつか異なる点があり、スクリプトがそのまま使えなかったりします。

  • ユーザ名/パスワードの入力方法の違い
    ターミナルサーバの設定で入力が省略できたり、プロンプトがターミナルサーバ側の仕様に依存するため、ユーザ名のプロンプトがlogin:になったりする。
    (IOSの場合はUsername:username:)
  • プロンプト表示の違い
    オンライン接続の場合、ログイン時、自動的にプロンプトが表示されますが、ターミナルサーバの場合、明示的にEnterキーを押す必要がある。

NW機器を操作するためのPythonライブラリであるnetmikoは、ターミナルサーバ経由のログインもサポートしており、今回はログインしてshowコマンド実行までの例をご紹介します。

事前準備

あらかじめ、以下コマンドでnetmikoをインストールします。

pip install netmiko

Pythonコード

補足はコード内に記載していますが、ポイントは以下の3点です。

  • device_typeterminal_serverに指定 (SSHでターミナルサーバへ接続)
  • 途中で改行コードを送信
  • ログイン後、Redispatchという処理を行う
terminal_server.py
from netmiko import ConnectHandler
from netmiko import redispatch
import time

# デバイス情報を指定
device = {
    'device_type': 'terminal_server',    # 'cisco_ios'ではなく必ずこの値に指定
    'ip': '192.168.100.200',   # terminal serverのIPアドレス
    'port': 3001,   # NW機器に割り当てられたTCPポート番号
    'username': 'admin',   # terminal serverのユーザ名
    'password': 'password',   # terminal serverのパスワード
    'secret': 'test',   # NW機器のenableパスワード
} 

# terminal server経由でNW機器に接続
net_connect = ConnectHandler(**device)

# 改行コードを送信し、後続処理のためにプロンプトを表示させる
net_connect.write_channel("\r")
time.sleep(1)
net_connect.write_channel("\r")
time.sleep(1)

# device_typeを`cisco_ios`に変更し、これ以降Cisco IOS用のクラスを使って処理を行う
redispatch(net_connect, device_type='cisco_ios')

# enableパスワードを入力
net_connect.enable()

# showコマンドを送信
output = net_connect.send_command('show run')
print(output)

# 切断
net_connect.disconnect()

実行結果

send_commandで指定した、show runの出力結果が表示されます。

'Building configuration...\n\nCurrent configuration : 2601 bytes\n!
(省略)