pyATS/Genie: シリアルコンソール経由でネットワーク機器へ接続

ネットワーク機器の導入時などで ZTP などを使う機会が増えているのかもしれませんが、いまだに最初はシリアルコンソールで接続して初期設定という場合があるかと思います。

pyATS/Genie のコネクションライブラリ Unicon ではシリアルコンソール経由でのアクセスも可能であり、シリアル接続から telnet/SSH まで幅広く機器を操作できます。

今回は MacOS から USB シリアル変換ケーブルを使って、コンソールポート経由でシスコルータへ接続する方法を紹介します。

1. USBシリアル変換ケーブルのドライバーをインストール

私が購入した USBシリアル変換ケーブルはチップが Prolific 社製の PL203 というやつだったので、下記からMacOS 用のものをダウンロードしてインストール。

Drivers for the Plugable USB serial adapter using an authentic Prolific chipset, model PL2303-DB9.

インストール後に再起動が行われた後には、/dev 配下に下記が見えるようになりました。

$ls -la /dev/*usb*
crw-rw-rw-  1 root  wheel   18,   1  8 Oct 21:11 /dev/cu.usbserial
crw-rw-rw-  1 root  wheel   18,   0  8 Oct 20:57 /dev/tty.usbserial

2. Jerminal のインストール

ターミナルアプリケーションとしては Jerminal にしてみました。homebrew でインストールします。

$ brew install jerm

jerm コマンドを使って下記のようにシリアル接続できるのを確認します。ちなみにルータのプロンプトを表示するのにリターンキーを押してます。

$ jerm -b 9600 /dev/cu.usbserial
Jerminal v0.8096  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007 candy
Type "Ctrl-M ~ ." to exit.
 ispeed 9600 ospeed 9600
 +IGNBRK -BRKINT -IGNPAR -PARMRK -INPCK -ISTRIP -INLCR -IGNCR -ICRNL -IXON -IXOFF -IXANY -IMAXBEL
 -OPOST -ONLCR -OXTABS -ONOEOT
 cs8 -CSTOPB +CREAD -PARENB -PARODD +HUPCL +CLOCAL -CCTS_OFLOW -CRTSCTS -CRTS_IFLOW -MDMBUF -ECHOKE -ECHOE -ECHO -ECHONL -ECHOPRT -ECHOCTL -ISIG -ICANON -ALTWERASE -IEXTEN
 -EXTPROC -TOSTOP -FLUSHO -NOKERNINFO -PENDIN -NOFLSH

ASR1002>

3. pyATS/Genie の testbed.yaml 作成

USBシリアル変換ケーブルが使えることを確認したら、pyATS/Genie の testbed.yaml を作成します。基本的にはほぼ telnet/SSH と似た感じですが、jerm コマンドを書いているのが見えるかと思います。

testbed:
  name: serial_test

devices:
  ASR1002:
    alias: uut
    os: iosxe
    type: ASR1002
    credentials:
      default:
        password: cisco
        username: cisco
    connections:
      defaults:
        via: usbcon
      usbcon:
        command: jerm -b 9600 /dev/cu.usbserial

人によっては cu コマンドを使っている場合もあるかと思います。その場合は下記がサンプルです。

      usbcon:
        command: cu -l /dev/ttyS0 -s 19200

4. Genie Shell で接続確認

Genie CLI の genie shell に testbed yaml を指定して実行し、デバイスの指定、デバイスの接続を行ないます。上でも書いたようにシリアル接続しただけではプロンプトが表示されないため、device.connect() に prompt_recovery=True を設定しています。これを設定するとプロンプトが表示されない場合にリターン等を送ってプロンプトが表示されるように試みます。

$ genie shell --testbed-file serial_test_tb.yaml
Welcome to Genie Interactive Shell
==================================
Python 3.7.3 (default, Jun  5 2019, 11:26:12)
[Clang 10.0.1 (clang-1001.0.46.4)]

>>> from genie.testbed import load
>>> testbed = load('serial_test_tb.yaml')
-------------------------------------------------------------------------------
In [1]: dev = testbed.devices['ASR1002']

In [2]: dev.connect(prompt_recovery=True)
[2019-10-08 21:30:49,320] +++ ASR1002 logfile /tmp/ASR1002-cli-20191008T213049318.log +++
[2019-10-08 21:30:49,320] +++ Unicon plugin iosxe +++
Jerminal v0.8096  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007 candy
Type "Ctrl-M ~ ." to exit.

[2019-10-08 21:30:49,340] +++ connection to spawn: jerm -b 9600 /dev/cu.usbserial, id: 4627504768 +++
[2019-10-08 21:30:49,340] connection to ASR1002
 ispeed 9600 ospeed 9600
 +IGNBRK -BRKINT -IGNPAR -PARMRK -INPCK -ISTRIP -INLCR -IGNCR -ICRNL -IXON -IXOFF -IXANY -IMAXBEL
 -OPOST -ONLCR -OXTABS -ONOEOT
 cs8 -CSTOPB +CREAD -PARENB -PARODD +HUPCL +CLOCAL -CCTS_OFLOW -CRTSCTS -CRTS_IFLOW -MDMBUF -ECHOKE -ECHOE -ECHO -ECHONL -ECHOPRT -ECHOCTL -ISIG -ICANON -ALTWERASE -IEXTEN
 -EXTPROC -TOSTOP -FLUSHO -NOKERNINFO -PENDIN -NOFLSH

[2019-10-08 21:31:49,367] Prompt Recovery has commenced. Total timeout occurs in 100 seconds.
[2019-10-08 21:31:49,450] Sending prompt recovery command: b'\r'

ASR1002#
[2019-10-08 21:31:49,457] +++ initializing handle +++
[2019-10-08 21:31:49,458] +++ ASR1002: executing command 'term length 0' +++
term length 0
(snip)
ASR1002#
Out[2]: 'Jerminal v0.8096  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007 candy\r\nType "Ctrl-M ~ ." to exit.\r\n ispeed 9600 ospeed 9600\r\n +IGNBRK -BRKINT -IGNPAR -PARMRK -INPCK -ISTRIP -INLCR -IGNCR -ICRNL -IXON -IXOFF -IXANY -IMAXBEL\r\n -OPOST -ONLCR -OXTABS -ONOEOT\r\n cs8 -CSTOPB +CREAD -PARENB -PARODD +HUPCL +CLOCAL -CCTS_OFLOW -CRTSCTS -CRTS_IFLOW -MDMBUF -ECHOKE -ECHOE -ECHO -ECHONL -ECHOPRT -ECHOCTL -ISIG -ICANON -ALTWERASE -IEXTEN\r\n -EXTPROC -TOSTOP -FLUSHO -NOKERNINFO -PENDIN -NOFLSH\r\n\r\nASR1002#'

In [3]:

以上が pyATS/Genie を使ったUSBシリアル変換ケーブルを使ってシスコルータへコンソール接続する方法です。簡単ですよね?これを使えば pyATS/Genie を使って機器の初期設定の自動化というのも可能になります。

以上

スポンサーリンク