Skip to content

netmiko#

テンプレートフォルダの配置#

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}')