TextFSMでシスコルータの型名とシリアルを抽出する方法
ネットワークエンジニアならシスコルータの型名やシリアルを収集することが多々あると思います。
Telnet/シリアルコンソールなどからshow inventory
コマンドを実行して、コマンド実行結果から手作業でExcelに転記するのは辛い作業です。
今回はPythonライブラリのTextFSMとTextFSMの抽出テンプレートntc-templatesと14行のPythonスクリプトで、いとも簡単に抽出することができますのでご紹介します。
環境
今回は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
を生成します。
入力ファイル
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
出力ファイル
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で読み込むだけで、幸せになります。