TextFSM 및 itertools를 사용하여 NEC IX2105 일반 판정에 필요한 값을 가져옴

개시하다


며칠 전에 참가한 인터넷 프로그래밍 학습회에서
Ansible과 TextFSM 조합이 show 명령의 값을 얻었다는 말을 들은 계기.
수많은 NW 기기를 한 명씩 확인하는 Operation log
기계의 이상을 발견하는 것은 매우 어려운 일이다
Pythhon3에서 TextFSM과itertools를 사용하면 NEC IX2105 정상 판정에 필요한 값만 좋은 느낌으로 얻을 수 있습니다.

참고 자료


참고TextFSM을 사용하여 시스템 라우터의 모델 및 시퀀스를 추출하는 방법
http://kooshin.hateblo.jp/entry/2017/11/28/000800
참고Show 명령 결과를 지우는 다양한 방법#npsstudy
https://www.slideshare.net/akira6592/npstudy18-command-parser

IX2105용 템플릿을 만들어 봤어요.


시스코의 템플릿을 참고해 IX용 템플릿을 만들어 시행해보니 쉽게 가치를 얻었다.
템플릿은 다음과 같습니다.
IX2105_tmp.txt
Value VERSION (.+?)
Value SYSTEM_START_TIME (.*)
Value VERSION_FILE (.*)
Value VERSION_FILE2 (.*)
Value SN (.*)
Value LINK_STATUS0 (\w+)
Value LINK_STATUS1 (\w+)
Value PORT_STATUS1 (\w+)
Value PORT_STATUS2 (\w+)
Value PORT_STATUS3 (\w+)
Value PORT_STATUS4 (\w+)
Value STATUS_1V (.*)
Value STATUS_1_8V (.*)
Value STATUS_2_5V (.*)
Value STATUS_3_3V (.*)
Value STATUS_5V (.*)
Value TEMPERTURE_STATUS (.*)

Start
  ^.*Software,\s+Version\s+${VERSION},\s+MAINTENANCE\s+RELEASE\s+SOFTWARE
  ^.*System\s+started\s+at\s+${SYSTEM_START_TIME}
  ^.*System\s+image\s+file\s+is\s+"+${VERSION_FILE}"
  ^.*S/N:\s+${SN}
  ^.*1.0\s+volt\s+line\s+${STATUS_1V}
  ^.*1.8\s+volt\s+line\s+${STATUS_1_8V}
  ^.*2.5\s+volt\s+line\s+${STATUS_2_5V}
  ^.*3.3\s+volt\s+line\s+${STATUS_3_3V}
  ^.*5.0\s+volt\s+line\s+${STATUS_5V}
  ^.*Internal\s+temperature\s+measured\s+${TEMPERTURE_STATUS}
  ^.*Interface\s+GigaEthernet0.0\s+is\s+${LINK_STATUS0}
  ^.*Interface\s+GigaEthernet1.0\s+is\s+${LINK_STATUS1}
  ^.*Port\s+1\s+status\s+is\s+${PORT_STATUS1}
  ^.*Port\s+2\s+status\s+is\s+${PORT_STATUS2}
  ^.*Port\s+3\s+status\s+is\s+${PORT_STATUS3}
  ^.*Port\s+4\s+status\s+is\s+${PORT_STATUS4}
  ^.*\s+\s+\s+\s+${VERSION_FILE2}\s+\s+\s+\s+\s+\s+\s+\s+MA
외관 모방을 통해 템플릿을 만들 수 있어 실제 가치를 얻을 수 있다면 기쁘다.
실제 얻은 값은 다음과 같다.

①기계의 uptime
② Version
③ Serial Number
④ IF의 링크 상태
⑤ show env의 값
당분간 ③에 대한 S/N 값은 빼지 않은 것처럼 보이지만 일부러 마스크를 착용하고 있다.

TextFSM 및 itertools 조합 사용


지정된 디렉토리에 여러 Operation log가 있는 경우 연속적으로 값을 가져올 수 있습니다.
다음 파이썬 코드의 내용은 이런 느낌입니다.
- 장서 itertools 사용, Operation log
"show tech"명령의 값만,test.txt에 저장
-2. test.TextFSM의 IX를 템플릿(IX2105 tmp.txt)으로 txt 읽기
- 가져온 값을 CSV에 저장
import textfsm,pprint,itertools,os,csv
datafolder = directory         ### opelogがあるDirectoryを指定
textfms = "IX2105_tmp.txt"      ### 上記のテンプレートを指定
testfile = "test.txt"        ### opelogから”show tech”の値を貼り付けるテキストファイル名
csvfile = "inventory.csv"       ### 取得した値を貼り付けるcsvファイル名

files=os.listdir(datafolder)    ### 指定したDirectoryのopelog情報を取得
count=0

if files != []:
    while count < len(files):
         data=datafolder+files[count]
         with open(data) as f_in:
              lines = [line for line in f_in]
         for i in lines:
              if "show tech-support" in i:
                   startpoint=lines.index(i)
         for i2 in lines:
              if "(config)#  " in i2:
                   if lines.index(i2) > startpoint:
                           endpoint=lines.index(i2)
         if startpoint != [] and endpoint != []:
              with open(data) as f:
                   user_list=[line for line in itertools.islice(f, startpoint, endpoint)]
              p=open(testfile, 'w')
              p.write(pprint.pformat(user_list))
              p.close()
              with open(testfile) as f:
                   inventory_text=f.read()
              with open(textfms) as f:
                   table=textfsm.TextFSM(f)
                   result=table.ParseText(inventory_text)
              pprint.pprint(result)
              with open(csvfile, 'w', newline='') as f:
                   w=csv.writer(f)
                   w.writerow(table.header)
                   w.writerows(result)
              count=count+1
         else:
            count=count+1
else:
   print("done")
얻은 값은 CSV에 저장되어 장치의 직렬, Version, 정상(IF의 링크 상태, 전원 주위의 상태 등)을 증거로 남긴다.
그리고 함수 등의 구조를 통해 얻은 값이 이상 상태인지 아닌지를 판단할 수 있다.

좋은 웹페이지 즐겨찾기