kooshinlab / コーシンラボ

現役ネットワークエンジニアが、ネットワーク運用で必要になった技術の記事を書くブログです。

TextFSMでシスコルータの型名とシリアルを抽出する方法

ネットワークエンジニアならシスコルータの型名やシリアルを収集することが多々あると思います。 Telnet/シリアルコンソールなどからshow inventoryコマンドを実行して、コマンド実行結果から手作業でExcelに転記するのは辛い作業です。

今回はPythonライブラリのTextFSMとTextFSMの抽出テンプレートntc-templatesと14行のPythonスクリプトで、いとも簡単に抽出することができますのでご紹介します。

f:id:KOOSHIN:20171128072835p:plain
inventory.csv

環境

今回はWin10にWSLでUbuntu上で試してみました。 事前にPython3をオールインワンパッケージのAnacondaでインストールしています。

実行環境
$ python --version
Python 3.6.3 :: Anaconda, Inc.

$ pip install textfsm
Collecting textfsm
  Downloading textfsm-0.3.2.tar.gz
Building wheels for collected packages: textfsm
  Running setup.py bdist_wheel for textfsm ... done
  Stored in directory: /home/kooshin/.cache/pip/wheels/92/7f/36/3dc4b8c2606a92d479b4f986c9deef9c0b293718dd83ace07c
Successfully built textfsm
Installing collected packages: textfsm
Successfully installed textfsm-0.3.2

$ pip show textfsm
Name: textfsm
Version: 0.3.2
Summary: UNKNOWN
Home-page: https://github.com/google/textfsm
Author: Google
Author-email: textfsm-dev@googlegroups.com
License: Apache License, Version 2.0
Location: /home/kooshin/anaconda3/lib/python3.6/site-packages
Requires:

処理方法

show inventoryの実行結果を入力ファイルとして、 TextFSMを用いたスクリプトファイルinventory2csv.pyで、 CSV形式の出力ファイルinventory.csvを生成します。

f:id:KOOSHIN:20171128073845p:plain
変換方法

入力ファイル

show inventoryコマンドの実行結果をshow_inventory.txtとして保存します。

c1812j2#show inventory
NAME: "chassis", DESCR: "1812-J chassis"
PID: CISCO1812-J/K9    , VID: V03, SN: FHK000000AA

NAME: "motherboard", DESCR: "1800 Motherboard"
PID: CISCO1812-J/K9    , VID: V03, SN: FOC000000A


c1812j2#
変換スクリプト

inventory2csv.pyとして、保存します。 スクリプトの内容は入力ファイルshow_inventory.txtを、 抽出テンプレートファイルcisco_ios_show_inventory.templateで抽出し、 出力ファイルinventory.csvに保存します。

import textfsm
import csv

with open('show_inventory.txt') as f:
    inventory_text = f.read()

with open('cisco_ios_show_inventory.template') as f:
    table = textfsm.TextFSM(f)
    result = table.ParseText(inventory_text)

with open('inventory.csv', 'w', newline='') as f: # Windowsの場合、newline=''が必要
    w = csv.writer(f)
    w.writerow(table.header)
    w.writerows(result)

Windowsで、CSVファイルを生成する場合、newline=''がないと、1行ごとに空行があるため、修正しました。 ※2017/12/16

抽出テンプレートファイル

ntc-templatesに、TextFSMの抽出テンプレート集があります。 今回はこの抽出テンプレートからcisco_ios_show_inventory.templateを利用します。

下記からダウンロードしてcisco_ios_show_inventory.templateというファイル名で保存します。 ntc-templates/cisco_ios_show_inventory.template at master · networktocode/ntc-templates · GitHub

Value NAME (.*)
Value DESCR (.*)
Value PID (([\S+]+|.*))
Value VID (.*)
Value SN ([\w+\d+]+)

Start
  ^NAME:\s+"${NAME}",\s+DESCR:\s+"${DESCR}"
  ^PID:\s+${PID}.*,.*VID:\s+${VID},.*SN:\s+${SN} -> Record
  ^PID:\s+,.*VID:\s+${VID},.*SN: -> Record
  ^PID:\s+${PID}.*,.*VID:\s+${VID},.*SN: -> Record
  ^PID:\s+,.*VID:\s+${VID},.*SN:\s+${SN} -> Record
  ^PID:\s+${PID}.*,.*VID:\s+${VID}.*
  ^PID:\s+,.*VID:\s+${VID}.*
  ^.*SN:\s+${SN} -> Record
  ^.*SN: -> Record
実行結果

スクリプトを実行すると、出力ファイルinventory.csvが生成されます。

$ python inventory2csv.py

f:id:KOOSHIN:20171128072032p:plain
実行結果

出力ファイル

inventory.csvというファイル名のCSV形式で、show inventoryコマンドの実行結果と同じ5つのフィールドが出力されます。

  • NAME:パーツ名
  • DESCR:パーツの名前
  • PID:型名
  • VID:バージョン番号
  • SN:シリアル番号
NAME,DESCR,PID,VID,SN
chassis,1812-J chassis,CISCO1812-J/K9,V03,FHK000000AA
motherboard,1800 Motherboard,CISCO1812-J/K9,V03,FOC000000A

あとは、CSVファイルをExcelで読み込むだけで、幸せになります。

f:id:KOOSHIN:20171128072835p:plain
inventory.csv

参考文献