Skip to content

netmiko#

import csv
import textfsm
import netmiko
from pprint import pprint

# インベントリ保存用変数
inventories = []

# TextFSMのテンプレート読み込み
with open('ntc-templates/templates/cisco_ios_show_inventory.template') as f:
    fsm = textfsm.TextFSM(f)

# ルータリストを読み込み
with open('hosts.csv', 'r') as f:
    r = csv.DictReader(f)
    hosts = list(r)

# ルータ単位でインベントリ取得して、CSVに保存する
for host in hosts:
    print("collecting: %s" % host['hostname'])
    params = {
        'device_type':  host['device_type'],
        'ip':           host['ip'],
        'username':     host['username'],
        'password':     host['password'],
        'secret':       host['secret'],
        }
    # ルータにログイン
    conn = netmiko.ConnectHandler(**params)
    conn.enable()

    # IOS XRの場合、コマンドを変える
    if host['device_type'] == 'cisco_xr':
        # cisco_xr
        cmd = 'admin show inventory'
    else:
        # cisco_ios, cisco_xe, cisco_nxos
        cmd = 'show inventory'

    # インベントリ収集
    output = conn.send_command(cmd)

    # TextFSMで、コマンド実行結果を変換
    fsm.Reset()
    result = fsm.ParseText(output)
    pprint(result)

    # 各行の先頭にホスト名を付与
    inventory = [[host['hostname']] + row for row in result]

    # インベントリを追記
    inventories += inventory

# CSV形式で保存する
with open("inventory.csv", 'w') as f:
    w = csv.writer(f, lineterminator='\n')
    w.writerow(['HOSTNAME', 'NAME', 'DESCR', 'PID', 'VID', 'SN'])
    w.writerows(inventories)