Cisco 스위치 간단 점검 보고서 생성 스크립트 [python script]

Cisco 스위치 간단 점검 보고서 생성 스크립트 [python script]

1. 지원 스위치 및 테스트
지원 스위치: C3560, C3550, C2960, C2950
테스트 : IOS 12.2(55)SE1 (C3550, C2950)

2. python 버전 및 필요 패키지.
테스트: Python 3.5.6 에서 테스트 진행.
필요패키지: paramiko, openpyxl
라이센스: GPL

3. 사용법 및 점검결과

* 점검대상 스위치리스트를 화일 이름 switch.txt 로 작성한다. 아래 형식으로 작성하되, 필드 구분은 space 또는 tab으로 구분한다.

스위치 접속은, ssh 또는 telnet 프로토콜을 사용한다.

* genreport.py 스크립트를 실행한다.

* 결과는 엑셀화일 report.xlsx 에 저장되며, report.xlsx를 삭제하면 안된다.
1대의 장비당 결과는 1행에 저장이된다.
점검 항목은, CPU 사용율, 메모리 사용율, 팬 상태, 온도, 파워 상태이다.

4. 스크린샷.

5. 만든 이유.
네트워크 스위치 300여대를 사용하는 곳에서 Cisco L2 스위치를 100여대 사용하고 있다. NMS를 사용하고 있지만, FAN 이나 장비 온도는 사용중인 NMS상에 보이지 않는다. 이에, 주기적으로 간단히 점검할 수 있도록 파이썬 스크립트를 작성했고, 스위치 100여대 정도 점검을 5분 이내에 끝낼 수 있게 되었다.

6. 배포
배포 및 재사용시 출처를 표시해 주시기 바랍니다.

다운로드: Report4CiscoL2

7. 버그 및 제약사항(2019/3/19 추가)

시스코 스위치는 AAA인증을 사용하여 telnet 또는 ssh 접속시 enable 상태로 접속되어야한다.(AAA 설정은 https://blog.boxcorea.com/wp/archives/2529 를 참고)

openpyxl 버전은 2.5.1 을 사용하여야 하며, 상위버전 사용시 오류가 발생한다.
설치는 pip install openpyxl==2.5.1

22 comments

Skip to comment form

    • 김희성 on 2019년 3월 7일 at 9:59 오전
    • Reply

    switch.txt 마지막에 있는 cisco 문구는 뭘 의미하나요?

    1. 기존 코드를 재활용하다 보니, 장비 구별을 위해 필요하게 되었네요…

    • 네트워크 엔지니어 on 2019년 3월 15일 at 4:10 오후
    • Reply

    Traceback (most recent call last):
    File “genreport.py”, line 4, in
    from openpyxl import *
    ImportError: No module named openpyxl
    이런 에러가 뜨면서 실행이 안되네요 ㅠ !

    • 네트워크초보 on 2019년 3월 15일 at 4:11 오후
    • Reply

    Traceback (most recent call last):
    File “genreport.py”, line 4, in
    from openpyxl import *
    ImportError: No module named openpyxl
    이런 에러가 뜨면서 실행이 안되네요 ㅠ

    1. openpyxl 모듈이 없어서 그런듯 합니다.
      pip install openpyxl==2.5.1 명령으로 필요한 패키지를 설치해 주면 될겁니다.

        • LEE on 2019년 4월 19일 at 11:39 오전
        • Reply

        저도 같은 openpyxl에러 가 나네요 ㅠ
        우분투설
        pip install openpyxl==2.5.1 로 설치해서
        두번하니까 already satifi~~ openpyxl2.5.1 나오네요
        그래도 안돼는데 혹시 찾으신거 있으실까요 ㅜ

        1. pip freeze 결과좀 알려주실 수 있나요?

    • 초보자 on 2020년 5월 11일 at 10:37 오전
    • Reply

    만약에 enable 모드로 바로 들어갈 수 없어서 enable 커맨드 후 비밀번호를 재입력 후 들어가야 하는 경우에는 어떻게 처리할 수 있나요?

    1. 명령어에 enable , enable비밀번호를 추가해 주면 됩니다.
      물론 비밀번호를 파일에서 읽어오는 것 처럼 파일에서 읽어와도 되고요.
      비밀번호 입력할 때는 로그인 id 하고 비밀번호 입력하는 부분을 참고하시면 될것 같네요.

    • 초보자22 on 2020년 5월 15일 at 11:56 오전
    • Reply

    genreport.py를 실행하면 maintenance tool … ~~ 이 출력되고 아무런 동작이 없습니다
    혹시 뭐가 문제일까요?

    • 네크워크_초보 on 2020년 5월 15일 at 4:40 오후
    • Reply

    해당 파일을 실행하면 배너 출력 후 종료됩니다

    무엇이 원인인지 알수 있을까요?

    1. 음, 살펴보니 맨 아래줄이 주석처리 되었세요. 다시 업로드 했습니다.
      genreport.py 의 맨 아랫줄에 # 을 제거하시거나 다시 다운로드 받으시면 될겁니다.

    • 네트워크_초보 on 2020년 5월 18일 at 4:28 오후
    • Reply

    Something is wrong…
    ‘ascii’ codec can’t decode byte 0xb0 in position 120: ordinal not in range(128)
    이런 메세지를 출력합니다 어디서 해결방법을 찾아야 할까요?

    1. 혹시 switch.txt 파일의 인코딩 확인 가능할까요?
      윈도우면 인코딩을 ANSI로 바꿔 저장하고 실행해 보시고요.
      혹시 접속방식이 telnet 이면 c35xx 디렉토리 아래 getrawdata.py 파일에서 tn.setdebuglevel(1) 부분의 #을 제거하고 실행하면 좀 더 자세한 내용을 볼 수 있습니다.

    • 초보 on 2020년 5월 21일 at 6:16 오후
    • Reply

    ===================== RESTART: C:\Users\Admin\Desktop\Report4CiscoL2 (2)\C35xx\getrawdata.py =====================
    Telnet(192.168.2.246,23): recv b’\xff\xfb\x01\xff\xfb\x03\xff\xfd\x18\xff\xfd\x1f\r\n\r\nUser Access Verification\r\n\r\nUserna’
    Telnet(192.168.2.246,23): IAC WILL 1
    Telnet(192.168.2.246,23): IAC WILL 3
    Telnet(192.168.2.246,23): IAC DO 24
    Telnet(192.168.2.246,23): IAC DO 31
    Telnet(192.168.2.246,23): recv b’me: \xff\xfc\x01\xff\xfc\x03\xff\xfe\x18′
    Telnet(192.168.2.246,23): IAC WONT 1
    Telnet(192.168.2.246,23): IAC WONT 3
    Telnet(192.168.2.246,23): IAC DONT 24
    Telnet(192.168.2.246,23): send b’cisco\n’
    Telnet(192.168.2.246,23): recv b’\xff\xfe\x1f’
    Telnet(192.168.2.246,23): IAC DONT 31
    Telnet(192.168.2.246,23): recv b’cis’
    Telnet(192.168.2.246,23): recv b’co\r\nPassword: ‘
    Telnet(192.168.2.246,23): send b’ password\n’
    Telnet(192.168.2.246,23): send b’term length 0\nshow hardware\nshow env all\nshow process cpu\nshow process mem\nexit\n\n’
    Telnet(192.168.2.246,23): recv b’\r\n\r\n% Authentication failed.\r\n\r\nUsername: ‘
    Telnet(192.168.2.246,23): recv b’term length 0\r\nPassword: \r\n\r\n% Authentication fail’
    Telnet(192.168.2.246,23): recv b’ed.\r\n\r\nUsername: show env all\r\nPassword: \r\n\r\n% Aut’
    Telnet(192.168.2.246,23): recv b’hentication failed.\r\n’
    Telnet(192.168.2.246,23): recv b”
    192.168.2.246 23 cisco password telnet cisco
    [‘ipaddr: 192.168.2.246’, ‘\r’, ‘\r’, ‘% Authentication failed.\r’, ‘\r’, ‘Username: term length 0\r’, ‘Password: \r’, ‘\r’, ‘% Authentication failed.\r’, ‘\r’, ‘Username: show env all\r’, ‘Password: \r’, ‘\r’, ‘% Authentication failed.\r’, ”]
    Traceback (most recent call last):
    File “C:\Users\Admin\Desktop\Report4CiscoL2 (2)\C35xx\getrawdata.py”, line 82, in
    protocol=switch[4]
    IndexError: list index out of range

    이런 메시지를 출력하는데 혹시 어떤부부니 잘못되어을까요???

    1. 메시지를 보면 인증이 실패했다고 하네요.
      switch.txt  파일의 id 가 cisco 비밀번호가 password 가 맞나요? 맞다면, 각 줄의 정보를 탭키 나 공백으로 구분하신게 맞는지요?

    • 초보 on 2020년 5월 22일 at 1:12 오후
    • Reply

    아 password가 cisoc인데 말씀하신데로 수정하니 되었습니다. 감사합니다.

    • 초보 on 2020년 5월 22일 at 2:19 오후
    • Reply

    혹시 show ntp status , show clock 내용을 추가하고 싶은데 어디부분을 추가하면 될지 알수있을까요..

    엑셀부분이이랑 명령어 부분 추가하고 parse.py에 내용 추가만 하면 될련지요?

    1. getrawdata.py 의 self.cmd에 명령어 추가 하고, parse.py에 결과를 추출하는 메소드를 만들고, genreport.py에서 엑셀에 결과를 추가하는 코드를 작성하시면 될 겁니다.

    • 상균 on 2020년 6월 26일 at 1:33 오후
    • Reply

    안녕하세요. 혹시 enable password 가 있는 경우에 적용하려고 한다면 어떻게 해야할까요..

    self.cmd=[‘en’ , ‘cisco’, 에 해당 내용을 추가하는 방법 말고는 없을까요??

    enable password가 장비 마다 다른 경우가 있어서요???

      • snowffox on 2020년 6월 26일 at 5:06 오후
      • Reply

      스위치 정보를 기록하는 파일(switch.txt)의 마지막에 enable 비밀번호를 추가하고, C35xx/getrawdata.py의
      get_telnet, get_ssh 메소드에, 이것을 추가합니다.
      enpasswd = self.switch[-1] 요렇게(맨 마지막항목이 enable password)
      그리고, telnet 의 경우,
      tn.write(‘enable’.encode(‘ascii’)+b’\n’)
      tn.read_until(‘” ‘.encode(‘ascii’))
      tn.write(enpasswd.encode(‘ascii’)+b’\n’)
      요 부분을 추가하면 장비별로 설정된 enable passwodrd 입력이 가능하고, 이후 명령어를 실행하면 됩니다.

      또 다른 방법으로는, cmf에 [‘en’, enpasswd , ….]
      요렇게 비밀번호를 변수로 지정하는 방법도 있습니다.(이게 더 간단)
      이경우도, enable password를 파일에서 읽어와서, get_telnet, get_ssh에 넣어야 합니다.
      테스트는 안해봤어요;^^

    • 상균 on 2020년 6월 29일 at 5:16 오후
    • Reply

    회신 감사드립니다.

    테스트 한번 해보도록 하겠습니다.

댓글 남기기

Your email address will not be published.

%d 블로거가 이것을 좋아합니다: