netmiko 및 ipywidget으로 Jupyter Notebook에서 Cisco 장비 조작

netmiko를 사용하면 파이썬을 통해 Cisco IOS와 같은 네트워크 장비를 조작 할 수 있습니다. perl로 말하는 곳의 Net::Telnet::Cisco에 상당하는 것입니다.

이번에는 ipywidget에서 Jupyter Notebook에 목록 상자를 만들고 목록 상자에서 선택한 호스트 (Cisco 라우터)에 대해 "show ip int brief | exc unass"와 "show int status | exc disa"를 실행하는 스크립트 만들기.

우선, conda나 pip로 「netmiko」와 「ipywidget」를 인스톨 합니다. 내 환경에서 다음과 같이 설치했습니다.

bash
$ pip install netmiko
$ conda install -c conda-forge ipywidgets

그런 다음 Cisco 라우터의 호스트 이름과 IP 주소를 연결하기 위해 sqlite로 데이터베이스를 만듭니다. 여기서는 "detwork_database"라는 데이터베이스 이름으로 다음 형식으로 "router_hosts"테이블을 만듭니다.


호스트 이름
IP 주소


Rtokyo001
192.168.1.110

Rosaka001
192.168.1.111

Rnagoya001
192.168.1.112



bash
$ sqlite3 network_database.sqlite3

SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.

sqlite> create table router_hosts(hostname text primary key, ip_address text);
sqlite> insert into router_hosts values('Rtokyo001', '192.168.1.110');
sqlite> insert into router_hosts values('Rosaka001', '192.168.1.111');
sqlite> insert into router_hosts values('Rnagoya001', '192.168.1.112');

sqlite> select * from router_hosts;
Rtokyo001|192.168.1.110
Rosaka001|192.168.1.111
Rnagoya001|192.168.1.112

주소를 해결할 수 있으면 좋기 때문에 sqlite가 아닌 CSV 나 hosts를 사용해도 괜찮습니다.

그런 다음 Jupyter Notebook에서 다음과 같은 스크립트를 입력합니다 (라우터의 사용자 이름, 로그인 암호 및 사용 가능한 암호는 모두 "cisco"입니다).

파이썬
from IPython.display import display
from IPython.display import clear_output
from netmiko import ConnectHandler
import ipywidgets
import sqlite3

# sqliteに接続
sql_connection = sqlite3.connect('/home/${your_dir}/jupyter_workdir/network_database.sqlite3')
sql_cursor = sql_connection.cursor()

# router_hostsテーブルに登録されているホスト名を読み込む
sql_cursor.execute("""select hostname from router_hosts order by hostname asc;""")

# 読み込んだホスト名をドロップダウンリストに登録する
dropdown_lists=['-']

for sql_fetch_result in sql_cursor.fetchall():
    dropdown_lists.append(sql_fetch_result[0])

dropdown_item = ipywidgets.Dropdown(options=dropdown_lists, value='-')

# ドロップダウンリストの選択肢が変更されるたびに以下の処理を行う
def on_value_change(change):
    # 出力画面をクリアする
    clear_output()

    # router_hostsテーブルから選択されたホストのIPアドレスを取得する
    sql_hostname = (change['new'],)
    sql_cursor.execute('select ip_address from router_hosts where hostname=?', sql_hostname)
    ip_address = sql_cursor.fetchone()[0]

    # ciscoルータにアクセスするためのパラメータを設定する
    dev_definition = {
        "device_type": "cisco_ios",
        "ip": ip_address,
        "username": "cisco",
        "password": "cisco",
        "secret": "cisco"
    }

    # ciscoルータにアクセスし、"sh ip int brief | exc unass", "show int status | exc disa"を実行する
    connection = ConnectHandler(**dev_definition)
    connection.enable()

    output1 = "\n-----\nshow ip int brief | exc unass\n-----\n"
    output1 += connection.send_command("show ip int brief | exc unass")
    print(output1)

    output2 = "\n-----\nshow int status | exc disa\n-----\n"
    output2 += connection.send_command("show int status | exc disa")
    print(output2)

    connection.disconnect()

# ドロップダウンリストを観測し、選択肢が変わった時にon_value_change関数を実行する
dropdown_item.observe(on_value_change, names='value')

# ドロップダウンリストを出力する
display(dropdown_item)

실행하면 다음과 같은 드롭다운 목록이 표시되고 "router_hosts"테이블에 등록한 호스트가 선택 항목으로 나타납니다.



드롭다운 목록에서 호스트를 선택하면 route_hosts 테이블에서 해당 장비의 IP 주소를 묻습니다. 요청한 IP 주소의 Cisco 라우터에 netmiko를 통해 로그인하고,
  • show ip int brief | exc unass
  • show int status | exc disa

  • 의 결과를 출력합니다.

    좋은 웹페이지 즐겨찾기