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)