kooshinlab / コーシンラボ

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

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)を利用しています。

f:id:KOOSHIN:20171216233436p:plain
show ip routeのCSV変換結果

はじめに

ネットワークエンジニアの皆様、ルータのshow ip routeの結果をExcelにコピペする作業をよくやってないでしょうか? 私は経路差分のチェックやお客様に経路の一覧を提出するために、よくやってます。

100経路程度なら、なんとか手作業でもできると思います。 しかし、100経路を超えてくるとどうでしょうか? 非常に退屈な作業で、非常に時間がかかると思います。 さらに、コピペミスもしてしまうかもしれません。 ミスの対策として、ダブルチェックしないといけないかもしれません。

そんな退屈で面倒な作業をツールを使って解決します。 ツールで、show ip routeの結果を、Excel/CSVに変換します。

今回は、PythonライブラリのNetmikoを使います。 2017/12/15にリリースされたv2.0.0で、TextFSMを組み込まれたので使ってみます。

仕組み

show ip routeExcel/CSVに変換する仕組みは下記のとおりです。

  1. Netmikoで、シスコルータにTelnet/SSHでログイン
  2. show ip routeコマンド実行
  3. TextFSM+NTC-Templatesで実行結果から抽出
  4. 抽出したデータをExcel/CSV形式で保存

f:id:KOOSHIN:20171216233906p:plain
仕組み

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アドレスは表示されません。

f:id:KOOSHIN:20171216232111p:plain
Excel/CSV出力結果

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

おわりに

簡単なコードを書くことで、面倒な作業から解放されます。 ぜひ、ネットワークエンジニアの皆様はコードを書いて、作業の自動化、省力化しましょう!