Python/Netmiko/TextFSM/NTC-Templatesでシスコルータのshow ip routeをExcel/CSVに変換してみた
Python/Netmiko/TextFSM/NTC-Templatesを利用して、シスコルータのshow ip routeの結果をExcel/CSVに変換してみました。 Netmiko v2.0.0(2017/12/15にリリース)の新機能(Integrate TextFSM to send_command and send_command_timing)を利用しています。
はじめに
ネットワークエンジニアの皆様、ルータのshow ip routeの結果をExcelにコピペする作業をよくやってないでしょうか? 私は経路差分のチェックやお客様に経路の一覧を提出するために、よくやってます。
100経路程度なら、なんとか手作業でもできると思います。 しかし、100経路を超えてくるとどうでしょうか? 非常に退屈な作業で、非常に時間がかかると思います。 さらに、コピペミスもしてしまうかもしれません。 ミスの対策として、ダブルチェックしないといけないかもしれません。
そんな退屈で面倒な作業をツールを使って解決します。 ツールで、show ip routeの結果を、Excel/CSVに変換します。
今回は、PythonライブラリのNetmikoを使います。 2017/12/15にリリースされたv2.0.0で、TextFSMを組み込まれたので使ってみます。
仕組み
show ip route
をExcel/CSVに変換する仕組みは下記のとおりです。
- Netmikoで、シスコルータにTelnet/SSHでログイン
show ip route
コマンド実行- TextFSM+NTC-Templatesで実行結果から抽出
- 抽出したデータをExcel/CSV形式で保存
TextFSM + NTC-Templates=最強
シスコルータのshow ip route
と、TextFSM+NTC-Templatesの相性は抜群です。
少なくとも、サブネットマスク長を補完してくれる機能は非常にありがたい機能です。
サブネットマスク長が同じサブネットがある場合、サブネットマスク長が省略されます。
show ip route
は、同じサブネットマスク長の経路があった場合、自動的にグループ化され、省略されます。
下記のように192.168.0.1/30
は、192.168.0.1
で、サブネットマスク長/30
は省略されています。
NTC-Templatesの場合、省略されたサブネットマスク長を補完してくれます。
csr1000v-1#show ip route ~略~ 192.168.0.0/32 is subnetted, 8 subnets O 192.168.0.1 [110/4] via 10.0.0.34, 1w1d, GigabitEthernet3 O 192.168.0.2 [110/2] via 10.0.0.34, 1w4d, GigabitEthernet3 〜略〜
CSV出力内容
取得できるフィールドは下記のとおりです。
フィールド名 | 内容 |
---|---|
PROTOCOL | 経路情報を学習したプロトコル |
TYPE | プロトコルの付加情報。OSPFならIAやE2など |
NETWORK | ネットワークアドレス |
MASK | サブネットマスク長 |
DISTANCE | AD(アドミニストレーティブディスタンス) |
METRIC | 経路のメトリック |
NEXTHOP_IP | ネクストホップのIPアドレス |
NEXTHOP_IF | 出力インタフェース |
UPTIME | 経路の学習時間 |
環境
今回、試してみた環境は下記のとおりです。
項目 | 詳細 |
---|---|
Ubuntu 16.04 | Win10ProのWSLで、Ubuntu16.04をインストールしました |
Excel 2016 | ネットワークエンジニアの大好きな定番ソフト |
Python 3.6.3 | プログラミング言語と実行環境 |
Anaconda 5.0.1 | Pythonのオールインワンパッケージ |
pandas 0.20.3 | Pythonライブラリ。CSV操作用 |
Netmiko 2.0.0 | Pythonライブラリ。ルータへTelnet/SSH用 |
TextFSM 0.3.2 | Pythonライブラリ。コマンドの実行結果を解析し値を抽出 |
NTC-Templates | TextFSMの抽出テンプレート集 |
Cisco VIRL 1.3.296 | ルータのシミュレータ |
Pythonのインストールは、オールインワンパッケージのAnacondaを利用すると便利なので、お勧めします。
Netmikoの準備
もし、古いバージョンのNetmiko がインストールされている場合、下記のようにv2.0.0にアップグレードしてください。
$ pip install netmiko==2.0.0
現在のバージョンは下記のコマンドで確認できます。 Version: 2.0.0以上であればOKです。
$ pip show netmiko Name: netmiko Version: 2.0.0 Summary: Multi-vendor library to simplify Paramiko SSH connections to network devices Home-page: https://github.com/ktbyers/netmiko Author: Kirk Byers Author-email: ktbyers@twb-tech.com License: MIT Location: /home/kooshin/anaconda3/lib/python3.6/site-packages Requires: textfsm, paramiko, pyserial, scp, pyyaml
NTC-Templatesの準備
TextFSM用のテンプレートNTC-Templatesを事前にホームディレクトリに保存します。 下記のようにGitでクローンするか、ZIPファイルをダウンロードして、ホームディレクトリに展開してください。
$ cd ~ $ git clone https://github.com/networktocode/ntc-templates.git
コード:get_routes.py
シスコルータにSSHでログインして、show ip route
コマンドの実行結果をExcel/CSVに保存するコードは下記のとおりです。
Netmiko に、TextFSM+NTC-Templatesが組み込まれたことで、コードでは、ほとんど意識せずに利用することができます。
import netmiko import pandas as pd # シスコルータにログイン params = { 'device_type': 'cisco_ios', 'ip': '172.16.1.99', 'username': 'cisco', 'password': 'cisco', 'secret': 'cisco', } conn = netmiko.ConnectHandler(**params) conn.enable() # show ip routeの実行結果をTextFSMで抽出する routes = conn.send_command('show ip route', use_textfsm=True) # CSVで保存 df = pd.DataFrame(routes) df.to_csv('routes.csv', index=False)
動作結果
下記の通り、コマンドを実行すると、
ルータにSSHでログインし、
show ip route
コマンドを実行し、
実行結果をCSVで保存します。
$ python get_routes.py
show ip routeコマンドの実行結果
csr1000v-1#show ip route Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP a - application route + - replicated route, % - next hop override, p - overrides from PfR Gateway of last resort is not set 10.0.0.0/8 is variably subnetted, 12 subnets, 2 masks O 10.0.0.4/30 [110/2] via 10.0.0.34, 1w1d, GigabitEthernet3 O 10.0.0.8/30 [110/3] via 10.0.0.34, 1w1d, GigabitEthernet3 O 10.0.0.12/30 [110/2] via 10.0.0.34, 1w4d, GigabitEthernet3 O 10.0.0.16/30 [110/3] via 10.0.0.34, 1w1d, GigabitEthernet3 O 10.0.0.20/30 [110/43] via 10.0.0.34, 1w1d, GigabitEthernet3 O 10.0.0.24/30 [110/4] via 10.0.0.42, 1w4d, GigabitEthernet2 [110/4] via 10.0.0.34, 1w4d, GigabitEthernet3 O 10.0.0.28/30 [110/3] via 10.0.0.42, 1w4d, GigabitEthernet2 [110/3] via 10.0.0.34, 1w4d, GigabitEthernet3 C 10.0.0.32/30 is directly connected, GigabitEthernet3 L 10.0.0.33/32 is directly connected, GigabitEthernet3 O 10.0.0.36/30 [110/2] via 10.0.0.42, 1w4d, GigabitEthernet2 C 10.0.0.40/30 is directly connected, GigabitEthernet2 L 10.0.0.41/32 is directly connected, GigabitEthernet2 192.168.0.0/32 is subnetted, 8 subnets O 192.168.0.1 [110/4] via 10.0.0.34, 1w1d, GigabitEthernet3 O 192.168.0.2 [110/2] via 10.0.0.34, 1w4d, GigabitEthernet3 O 192.168.0.3 [110/3] via 10.0.0.34, 1w1d, GigabitEthernet3 O 192.168.0.4 [110/5] via 10.0.0.42, 1w4d, GigabitEthernet2 [110/5] via 10.0.0.34, 1w4d, GigabitEthernet3 O 192.168.0.5 [110/4] via 10.0.0.42, 1w4d, GigabitEthernet2 [110/4] via 10.0.0.34, 1w4d, GigabitEthernet3 O 192.168.0.6 [110/3] via 10.0.0.42, 1w4d, GigabitEthernet2 [110/3] via 10.0.0.34, 1w4d, GigabitEthernet3 C 192.168.0.7 is directly connected, Loopback0 O 192.168.0.8 [110/2] via 10.0.0.42, 1w4d, GigabitEthernet2
CSV出力結果:routes.csv
下記の通り、Excel/CSVに変換できました。
なお、show ip route
の結果に含まれないフィールドは表示されません。
プロトコルがLocal/Connectedの場合、ADやネクストホップのIPアドレスは表示されません。
protocol,type,network,mask,distance,metric,nexthop_ip,nexthop_if,uptime O,,10.0.0.4,30,110,2,10.0.0.34,GigabitEthernet3,1w1d O,,10.0.0.8,30,110,3,10.0.0.34,GigabitEthernet3,1w1d O,,10.0.0.12,30,110,2,10.0.0.34,GigabitEthernet3,1w4d O,,10.0.0.16,30,110,3,10.0.0.34,GigabitEthernet3,1w1d O,,10.0.0.20,30,110,43,10.0.0.34,GigabitEthernet3,1w1d O,,10.0.0.24,30,110,4,10.0.0.42,GigabitEthernet2,1w4d O,,10.0.0.24,30,110,4,10.0.0.34,GigabitEthernet3,1w4d O,,10.0.0.28,30,110,3,10.0.0.42,GigabitEthernet2,1w4d O,,10.0.0.28,30,110,3,10.0.0.34,GigabitEthernet3,1w4d C,,10.0.0.32,30,,,,GigabitEthernet3, L,,10.0.0.33,32,,,,GigabitEthernet3, O,,10.0.0.36,30,110,2,10.0.0.42,GigabitEthernet2,1w4d C,,10.0.0.40,30,,,,GigabitEthernet2, L,,10.0.0.41,32,,,,GigabitEthernet2, O,,192.168.0.1,32,110,4,10.0.0.34,GigabitEthernet3,1w1d O,,192.168.0.2,32,110,2,10.0.0.34,GigabitEthernet3,1w4d O,,192.168.0.3,32,110,3,10.0.0.34,GigabitEthernet3,1w1d O,,192.168.0.4,32,110,5,10.0.0.42,GigabitEthernet2,1w4d O,,192.168.0.4,32,110,5,10.0.0.34,GigabitEthernet3,1w4d O,,192.168.0.5,32,110,4,10.0.0.42,GigabitEthernet2,1w4d O,,192.168.0.5,32,110,4,10.0.0.34,GigabitEthernet3,1w4d O,,192.168.0.6,32,110,3,10.0.0.42,GigabitEthernet2,1w4d O,,192.168.0.6,32,110,3,10.0.0.34,GigabitEthernet3,1w4d C,,192.168.0.7,32,,,,Loopback0, O,,192.168.0.8,32,110,2,10.0.0.42,GigabitEthernet2,1w4d
おわりに
簡単なコードを書くことで、面倒な作業から解放されます。 ぜひ、ネットワークエンジニアの皆様はコードを書いて、作業の自動化、省力化しましょう!