Jupyter Notebook에서 Cisco 라우터 구성 생성 도구 만들기

Jupyter Notebook에서 ipywidget과 jinja2를 사용하여 Cisco 라우터 (IOS)의 구성 생성 도구를 만듭니다.

ipywidget은 Jupyter Notebook에 텍스트 상자와 버튼을 배치할 수 있는 UI 라이브러리입니다. jinja2는 파이썬 템플릿 엔진 라이브러리입니다. 이번에는 구성 생성에 필요한 매개 변수를 텍스트 상자에 입력하고 버튼을 누르면 Cisco 라우터의 구성을 만드는 도구를 만들어 보겠습니다.

빠르지만 파이썬 코드와 실행 결과에서 확인할 것입니다.

파이썬 코드



파이썬
from IPython.display import display, clear_output
from jinja2 import Template
from ipywidgets import Text, BoundedIntText, Button

global_template_txt = '''
hostname {{t_hostname}}
no ip domain-lookup
'''

recursive_template_txt = '''
int giga {{t_int_num}}
 no switchport
 ip address {{t_ip_address}} {{t_mask}}
 no shutdown
'''

global_template = Template(global_template_txt)
recursive_template = Template(recursive_template_txt)

tbox_hostname = Text (value='L3-SW1', description='hostname')
tbox_interface_num = BoundedIntText(value=0, min=0, max=5, step=1, description='Interface数:')
button = Button(description='generate config')

display(tbox_hostname)
display(tbox_interface_num)
display(button)

interface_boxes = []

def on_button_clicked(b) :
    global interface_boxes
    global_config = global_template.render(t_hostname = tbox_hostname.value)
    print(global_config)

    for i in range(tbox_interface_num.value) :
        recursive_config = recursive_template.render(t_int_num=interface_boxes[i].children[0].value,
                                                     t_ip_address=interface_boxes[i].children[1].value, 
                                                     t_mask=interface_boxes[i].children[2].value)
        print(recursive_config)

def on_value_change(change) :  
    global interface_boxes
    clear_output()
    display(tbox_hostname)
    display(tbox_interface_num)

    interface_boxes = []
    for i in range(change['new']) :
        interface_elements = [
            Text(value='1/0/1', description='I/F num'),
            Text(value='10.10.10.1',  description='I/F ip add'), 
            Text(value='255.255.255.0',  description='I/F mask')]
        interface_boxes.append(ipywidgets.Box(children = interface_elements))
        display(interface_boxes[i])

    display(button)
    button.on_click(on_button_clicked)

tbox_interface_num.observe(on_value_change, names='value')
button.on_click(on_button_clicked)

실행 결과



초기 화면





인터페이스 수 변경 시





generate config 버튼을 누르면





구성 설명



실행 순서로 살펴 보겠습니다.

템플릿 정의



파이썬
global_template_txt = '''
hostname {{t_hostname}}
no ip domain-lookup
'''

recursive_template_txt = '''
int giga {{t_int_num}}
 no switchport
 ip address {{t_ip_address}} {{t_mask}}
 no shutdown
'''

global_template = Template(global_template_txt)
recursive_template = Template(recursive_template_txt)

여기서 Cisco 구성 템플릿을 정의합니다. 글로벌 구성은 global_template에 해당하고 인터페이스 구성은 recursive_template에 해당합니다. {{}} 로 둘러싸인 부분이 변수가 되어 있어 나중에 값을 묻는 개소입니다.

초기 화면 출력



파이썬
tbox_hostname = Text (value='L3-SW1', description='hostname')
tbox_interface_num = BoundedIntText(value=0, min=0, max=5, step=1, description='Interface数:')
button = Button(description='generate config')

display(tbox_hostname)
display(tbox_interface_num)
display(button)

여기서 호스트명과 Interface수를 입력하는 텍스트 박스 및 컨피그레이션 버튼을 묘화하고 있습니다.

ipywidget 이벤트 감지



파이썬
tbox_interface_num.observe(on_value_change, names='value')
button.on_click(on_button_clicked)

가장 마지막 두 줄은 인터페이스 수가 변경되고 버튼이 눌려진 경우 각각 on_value_change 함수, on_button_clicked 함수를 호출하는 설명입니다.

on_value_cange 함수



파이썬
def on_value_change(change) :  
    global interface_boxes
    clear_output()
    display(tbox_hostname)
    display(tbox_interface_num)

    interface_boxes = []
    for i in range(change['new']) :
        interface_elements = [
            Text(value='1/0/1', description='I/F num'),
            Text(value='10.10.10.1',  description='I/F ip add'), 
            Text(value='255.255.255.0',  description='I/F mask')]
        interface_boxes.append(ipywidgets.Box(children = interface_elements))
        display(interface_boxes[i])

    display(button)
    button.on_click(on_button_clicked)

on_value_change 함수는 인터페이스 수의 변경에 따라 화면에 표시되는 인터페이스 구성의 텍스트 상자 수를 변경합니다. 사용하는 Interface가 1개이면 텍스트 박스도 1행분, 사용하는 Interface가 2개이면 텍스트 박스도 2행분 출력시킵니다.

on_button_clicked 함수



파이썬
def on_button_clicked(b) :
    global interface_boxes
    global_config = global_template.render(t_hostname = tbox_hostname.value)
    print(global_config)

    for i in range(tbox_interface_num.value) :
        recursive_config = recursive_template.render(t_int_num=interface_boxes[i].children[0].value,
                                                     t_ip_address=interface_boxes[i].children[1].value, 
                                                     t_mask=interface_boxes[i].children[2].value)
        print(recursive_config)

on_button_clicked 함수는 구성 작성 및 출력을 수행합니다. 구성 작성 버튼을 누를 때 global_template은 한 번만, recursive_template은 Interface 수분만큼 반복 처리를 수행하고 각 텍스트 상자의 값을 템플릿의 변수 부분에 포함시킨 다음 작성된 구성을 화면 출력합니다. 합니다.

사이고에게



솔직히 말해서, 자신이 사용하는 만큼은 ipywidget보다 텍스트 베이스로 직접 파라미터 입력하는 편이 효율적입니다.
어느 쪽인가 하면, 프로젝트나 팀내에서 공용하는 등, 타인에게 사용해 받을 것을 상정하고 있습니다.

좋은 웹페이지 즐겨찾기