안녕하세요.
이번 포스팅은 현재 제가 운영진으로 활동 중인 [네트워크 전문가 따라잡기] 커뮤니티의
'제 24회 네트워크 전문가 따라잡기 "N.EX.T" (정기기술세미나)' 에서 제가 진행한 세션과 관련된 내용입니다.
이번 행사에서는 [예제로 보는 '네트워크 엔지니어를 위한 Python 101'] 이라는 주제로 세션을 하였고
세션 시간에 사용된 간단한 예제에 대해서 코드를 공유합니다.
코드에 대한 내용은 세션 시간에 다루었기 때문에 자세한 설명은 생략합니다.
그리고 본 예제에 사용된 코드는 완성형 코드는 아닙니다.
우선 대표적인 예가 예외처리가 전혀 없습니다. (기본 라이브러리에서 제공되는 부분 제외)
아래의 코드들은 처음 접근을 어렵게 생각하시는 분들을 위해서 최대한 쉽게 접근할 수 있을 정도로 짧게 짧게 만들었으며
이후에 아래의 코드들을 조금씩 변형해가면서 본인만의 코드를 만들어보면 좋을 것 같습니다.
예제 1) 장비 접속 및 기본 명령어 수행 및 실행 |
from netmiko import ConnectHandler
arista= { 'device_type': 'arista_eos', 'ip': 'device', 'username': 'admin', 'password': 'admin', 'port' : 2222, # 기본 값이 22포트를 사용할 경우에는 사용하지 않아도 무방
net_connect = ConnectHandler(**arista)
output = net_connect.send_command('show int desc') print(output) |
○ 세션 시에 IP를 숨기기 위해서 'device'라는 이름으로 사용을 하였으며, 실제로는 해당 위치에 IP가 들어가면 됩니다
단,IP 값은 문자열이기 때문에 ' ' 혹은 " "를 사용해야 합니다.
문자열이기 때문에 도메인 값으로 대체해도 무방합니다
예제 2-1) 장비 접속 및 기본 명령어 수행 및 실행 |
from netmiko import ConnectHandler import device
print("Connecting....") nwnode = ConnectHandler(**device.ARI) shver = nwnode.send_command("show ver") print(shver) |
예제 2-2) 장비 접속 및 기본 명령어 수행 및 실행 (device.py) |
ariuser='admin' aripwd='admin' dv='arista_eos'
ARI={'device_type':dv,'verbose':False,'username':ariuser,'password':aripwd,'ip':'device','port':2222} |
○ 장비 인벤토리 정보를 기능을 수행할 코드와 별도로 분리한 예제입니다.
예제 1과 동일하지만, 단순히 인벤토리를 분리한 내용입니다
인벤토리 정보는 py코드를 사용할 수도 있지만, 별도의 파일로 관리해서 관리도 가능할 수 있습니다.
예제 3-1) 장비 인터페이스 상태 출력 |
shstatus =''' Port Name Status Vlan Duplex Speed Type Fa1/0 ZIGI-SVR0 notconnect 1 auto auto 10/100BaseTX Fa1/1 ZIGI-SVR1 notconnect 1 auto auto 10/100BaseTX Fa1/2 ZIGI-SVR2 notconnect 1 auto auto 10/100BaseTX Fa1/3 ZIGI-SVR3 connected 1 auto auto 10/100BaseTX Fa1/4 ZIGI-SVR4 notconnect 1 auto auto 10/100BaseTX Fa1/5 ZIGI-SVR5 notconnect 1 auto auto 10/100BaseTX Fa1/6 ZIGI-SVR6 connected 1 auto auto 10/100BaseTX Fa1/7 ZIGI-SVR7 notconnect 1 auto auto 10/100BaseTX Fa1/8 ZIGI-SVR8 notconnect 1 auto auto 10/100BaseTX Fa1/9 ZIGI-SVR9 notconnect 1 auto auto 10/100BaseTX Fa1/10 ZIGI-SVR10 connected 1 auto auto 10/100BaseTX Fa1/11 ZIGI-SVR11 notconnect 1 auto auto 10/100BaseTX Fa1/12 ZIGI-SVR12 notconnect 1 auto auto 10/100BaseTX Fa1/13 ZIGI-SVR13 notconnect 1 auto auto 10/100BaseTX Fa1/14 ZIGI-SVR14 notconnect 1 auto auto 10/100BaseTX Fa1/15 ZIGI-SVR15 notconnect 1 auto auto 10/100BaseTX
'''
status = shstatus.split('\n')
for op in status: print(op) |
○ 장비 인터페이스 정보를 출력하는 예제입니다.
이번 예제는 실제 장비를 접속한 것이 아니라, 장비에 접속하여 인터페이스 정보 가져온 내용을 출력하는 부분입니다.
장비 정보를 가져오게 되면, 하나의 길 문자열로 되어 있는 데 이를 가공하는 방법에 대한 예제이며
이 예제에서는 결과 값을 각 Line 단위로 쪼개는 함수(split)를 사용하여 정보 Line 단위로 저장하고
저장된 값을 하나씩 가져와서 출력합니다.
예제 3-2) 장비 인터페이스 상태 출력 |
shstatus =''' Port Name Status Vlan Duplex Speed Type Fa1/0 ZIGI-SVR0 notconnect 1 auto auto 10/100BaseTX Fa1/1 ZIGI-SVR1 notconnect 1 auto auto 10/100BaseTX Fa1/2 ZIGI-SVR2 notconnect 1 auto auto 10/100BaseTX Fa1/3 ZIGI-SVR3 connected 1 auto auto 10/100BaseTX Fa1/4 ZIGI-SVR4 notconnect 1 auto auto 10/100BaseTX Fa1/5 ZIGI-SVR5 notconnect 1 auto auto 10/100BaseTX Fa1/6 ZIGI-SVR6 connected 1 auto auto 10/100BaseTX Fa1/7 ZIGI-SVR7 notconnect 1 auto auto 10/100BaseTX Fa1/8 ZIGI-SVR8 notconnect 1 auto auto 10/100BaseTX Fa1/9 ZIGI-SVR9 notconnect 1 auto auto 10/100BaseTX Fa1/10 ZIGI-SVR10 connected 1 auto auto 10/100BaseTX Fa1/11 ZIGI-SVR11 notconnect 1 auto auto 10/100BaseTX Fa1/12 ZIGI-SVR12 notconnect 1 auto auto 10/100BaseTX Fa1/13 ZIGI-SVR13 notconnect 1 auto auto 10/100BaseTX Fa1/14 ZIGI-SVR14 notconnect 1 auto auto 10/100BaseTX Fa1/15 ZIGI-SVR15 notconnect 1 auto auto 10/100BaseTX
'''
status = shstatus.split('\n')
for op in status: if(op.find('connected') > 0): print(op.split()[0]) |
○ 장비 인터페이스 정보를 출력하는 예제의 변형입니다.
각 Line별로 가져온 값에서 현재 연결된 인터페이스 정보만을 출력하기 위해서 'connected'라는 값을 찾아서
'connected'된 인터페이스만을 출력합니다.
예제 4-1) 장비 Uptime 출력 |
shverinc = "zigi-r1 uptime is 2 hours, 27 minutes" uptime = shverinc.split(" uptime is ") print(uptime) |
예제 4-2) 장비 Uptime 출력 |
shverinc = "zigi-r1 uptime is 2 hours, 27 minutes"
uptime = shverinc.split(" uptime is ") print("Device Host : {0}\t\tUptime : {1}".format(uptime[0],uptime[1])) |
○ 장비 Uptime을 출력하는 예제입니다.
출력된 값은 기본적으로 가져온 값을 어느 정도 수준까지 가공해서 사용할 것인지에 대한 부분입니다.
예제 5) 장비 Mac-address 정보 출력 |
shmac = '''VDX# show mac-address-table VlanId Mac-address Type State Ports 41 0000.0000.fe00 Dynamic Active Te 1/5/1 41 0000.0000.fe01 Dynamic Remote Te 2/5/1 41 001c.7f63.950f Dynamic Active Te 1/5/1 41 02e0.52b2.f50d System Active XX 1/X/X 41 c4f5.7c18.3962 System Remote XX 2/X/X 43 0000.0000.fe00 Dynamic Active Po 3 43 0000.0000.fe01 Dynamic Active Po 4 43 001c.7f63.7efc Dynamic Active Po 4 43 001c.7f69.7b76 Dynamic Active Po 3 43 02e0.52c3.940e System Active XX 1/X/X 43 c4f5.7c18.3962 System Remote XX 2/X/X 701 0050.5686.049e Dynamic Remote Te 15/0/14 701 0050.5686.09d9 Dynamic Remote Te 15/0/19 701 0050.5686.123f Dynamic Remote Te 15/0/4 701 0050.5686.1384 Dynamic Remote Te 15/0/15 701 0050.5686.1647 Dynamic Remote Te 15/0/18 701 0050.5686.44ff Dynamic Remote Te 15/0/6 701 0050.5686.4614 Dynamic Remote Te 15/0/9 701 0050.5686.6265 Dynamic Remote Te 15/0/8 701 0050.5686.7078 Dynamic Remote Te 15/0/3'''
mactables = shmac.split('\n') macinfos = [] for mactb in mactables: if((mactb.lower().find(' te'))>0): macinfos.append(mactb)
for macinfo in macinfos: macinfo=macinfo.split() print("MAC : {0} \t Interface : Te {1}".format(macinfo[1],macinfo[5])) |
○ 장비의 Local Mac Address 정보를 출력하는 내용입니다.
예제 6) 파일 입출력해보기 |
zigifile = open("zigi.txt",'w') zigifile.write("zigispace.net") zigifile.close()
zigifile2 = open('zigi.txt','r') zigi = zigifile2.read() zigifile2.close() print (zigi) |
○ 초간단 파일 입출력 예제입니다.
예제 7) 장비 정보 가져온 후, 파일로 만들기 |
from netmiko import ConnectHandler import device
print("Connecting....") nwnode = ConnectHandler(**device.ARI) shver = nwnode.send_command("show ver")
zigifile = open('zigi.txt','w') zigifile.write(shver) zigifile.close() |
○ 장비의 정보를 가져와서, 해당 값을 파일로 만드는 예제입니다.