Jupyter Notebook에서 Cisco 라우터 구성 생성 도구 만들기
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보다 텍스트 베이스로 직접 파라미터 입력하는 편이 효율적입니다.
어느 쪽인가 하면, 프로젝트나 팀내에서 공용하는 등, 타인에게 사용해 받을 것을 상정하고 있습니다.
Reference
이 문제에 관하여(Jupyter Notebook에서 Cisco 라우터 구성 생성 도구 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/cafedrip/items/982f45a83e78985ba47c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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보다 텍스트 베이스로 직접 파라미터 입력하는 편이 효율적입니다.
어느 쪽인가 하면, 프로젝트나 팀내에서 공용하는 등, 타인에게 사용해 받을 것을 상정하고 있습니다.
Reference
이 문제에 관하여(Jupyter Notebook에서 Cisco 라우터 구성 생성 도구 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/cafedrip/items/982f45a83e78985ba47c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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)
tbox_interface_num.observe(on_value_change, names='value')
button.on_click(on_button_clicked)
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)
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)
솔직히 말해서, 자신이 사용하는 만큼은 ipywidget보다 텍스트 베이스로 직접 파라미터 입력하는 편이 효율적입니다.
어느 쪽인가 하면, 프로젝트나 팀내에서 공용하는 등, 타인에게 사용해 받을 것을 상정하고 있습니다.
Reference
이 문제에 관하여(Jupyter Notebook에서 Cisco 라우터 구성 생성 도구 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/cafedrip/items/982f45a83e78985ba47c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)