netmiko#
テンプレートフォルダの配置#
- 補足:テンプレートのダウンロード
git clone git@github.com:networktocode/ntc-templates.git
Templatesフォルダの配置は、環境変数を設定する方法と、ホームディレクトリにフォルダを配置する方法があります。
環境変数を利用する場合は、環境変数NET_TEXTFSM
を作成し、任意の場所に置いたtemplates
フォルダのパスを指定します。以下例はCドライブ直下に配置する例。
- システム変数の編集
- 変数名: NET_TEXTFSM
- 変数値: C:\templates
コマンド出力結果のパース#
from netmiko import ConnectHandler
device = {
'device_type':'cisco_ios',
'ip':'IPアドレス',
'username':'USER 名',
'password':'ログインパスワード',
# 'secret':'enableパスワード',
}
with netmiko.ConnectHandler(**device) as con:
con.enable()
output = con.send_command('sh ip route', use_textfsm=True)
print(output)
Info
textFSMを利用するには、send_command()の引数としてuse_textfsmをTrueに設定するだけで 最適なテンプレートが自動で選択される。
任意のテンプレート指定
from netmiko import ConnectHandler
# TextFSM テンプレート読み込み
with open(r'cisco_xr_show_inventory.textfsm') as f:
fsm = textfsm.TextFSM(f)
with open(r'C:\Users\omron\info\hosts.csv', 'r') as f:
r = csv.DictReader(f)
hosts = list(r)
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':'enableパスワード',
}
# Login Router
conn = netmiko.ConnectHandler(**params)
conn.enable
fsm.Reset() # キャッシュを削除し常に取得結果が更新されるように
result = fsm.ParseText(output)
pprint(result)
telnet#
"device_type"
に_telnet
を指定します。
device = {
"device_type": "cisco_ios_telnet",
"host": "192.168.1.1",
"username": "cisco",
"password": "cisco",
"secret": "cisco",
}
multiprocess#
予めdevices.csv
ファイルを用意しておく。
devices.csv
hostname,ip,device_type,username,password
R1,192.168.11.28,cisco_xr,cisco,cisco
R2,192.168.11.12,cisco_xr,cisco,cisco
R3,192.168.11.13,cisco_xr,cisco,cisco
Warning
修正予定
inventory を取得
from netmiko import ConnectHandler
import multiprocessing as mp
import textfsm
import time
import logging
import csv
logger = logging.getLogger(__name__)
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
)
# TODO: 取得した情報の保存方法
def run_devices(device, cmd, result_list):
ip = device['ip']
logger.info(f'Connecting to device: {ip}')
connection = ConnectHandler(**device)
connection.enable()
logger.info(f'Executing command: {cmd}')
output = connection.send_command(cmd)
logger.info(output)
with open('./ntc_templates/templates/cisco_xr_show_inventory.textfsm') as f:
fsm = textfsm.TextFSM(f)
fsm.Reset()
result = fsm.ParseText(output)
inventory = [[ip] + row for row in result]
result_list += inventory
def write_csv(inventories):
with open("inventory.csv", 'w') as f:
w = csv.writer(f, lineterminator='\n')
w.writerow(['HOSTNAME', 'NAME', 'DESCR', 'PID', 'VID', 'SN'])
w.writerows(inventories)
if __name__ == '__main__':
with open('devices.csv', 'r', encoding='utf-8') as f:
info = csv.DictReader(f)
devices = list(info)
device_list = []
for device in devices:
params = {
'device_type': device['device_type'],
'ip': device['ip'],
'username': device['username'],
'password': device['password'],
# 'secret': devie['secret'],
}
device_list.append(params)
start = time.time()
CMD= 'show inventory'
inventories = []
processes = []
for device in device_list:
processes.append(mp.Process(
target=run_devices, args=(device, CMD, inventories)))
for p in processes:
p.start()
for p in processes:
p.join()
# csv 書き込み
write_csv(inventories)
# script ending time
end = time.time()
logger.info(f'Script execution time: {end - start}')