본문 바로가기
<개인공부> - IT/[Network&Security]

TextFSM을 사용한 네트워크 장비 출력 파싱 #1

by Aggies '19 2024. 5. 27.
반응형

  오늘은 네트워크 엔지니어링과 자동화에 많이 사용되는 강력한 텍스트 파싱 도구인 TextFSM에 대해 소개해 보고자한다. TextFSM은 텍스트 데이터를 구조화된 데이터로 변환할 때 유용한 도구로, 특히 네트워크 장비의 명령어 출력 결과를 파싱할 때 많이 사용됩니다.

 

TextFSM이란?

  TextFSM은 Google에서 개발한 Python 라이브러리로, 텍스트 데이터를 구조화된 형식으로 변환하는 데 사용된다. 주로 네트워크 장비의 CLI (Command Line Interface) 출력 결과를 파싱하는 데 사용되며, 텍스트 템플릿을 사용하여 정규식을 통해 텍스트 데이터를 구조화된 형태로 추출한다.

 

설치방법

 

pip install textfsm

 

Cisco 라우터/스위치의 Interface parsing

  우선 3가지 정보가 필요하다.

 

1) Parsing을 하고자 하는 텍스트. 다시 말해 CLI 상 반환된 텍스트

Interface              Status         Protocol
GigabitEthernet0/0     up             up
GigabitEthernet0/1     down           down
GigabitEthernet0/2     administratively down down

 

2) textfsm 템플릿

  TextFSM 템플릿 파일을 작성하여 파싱할 텍스트의 형식을 정의한다. 템플릿 파일은 .textfsm 확장자를 사용합니다. 예시를 통해서 처리해 볼 cisco_interface.textfsm 파일 내용은 다음과 같다.

Value INTERFACE (\S+)
Value STATUS (\S+)
Value PROTOCOL (\S+)

Start
  ^Interface\s+Status\s+Protocol -> InterfaceLines

InterfaceLines
  ^${INTERFACE}\s+${STATUS}\s+${PROTOCOL} -> Record

 

이 템플릿에 대해 간단히 설명하면: 

  • INTERFACE: 인터페이스 이름
  • STATUS: 인터페이스 상태
  • PROTOCOL: 프로토콜 상태

Start 상태에서 "Interface Status Protocol" 줄을 찾으면 InterfaceLines 상태로 이동한다. InterfaceLines 상태에서는 각 인터페이스 정보를 Record라는 action을 통해 추출한다.

 

3) Parsing Script 작성

import textfsm

# 파싱할 텍스트 데이터
raw_text_data = """
Interface              Status         Protocol
GigabitEthernet0/0     up             up
GigabitEthernet0/1     down           down
GigabitEthernet0/2     administratively down down
"""

# 템플릿 파일 경로
template_file = 'cisco_interface.textfsm'

# 템플릿 로드
with open(template_file) as template:
    fsm = textfsm.TextFSM(template)

# 텍스트 파싱
parsed_results = fsm.ParseText(raw_text_data)

# 결과 출력
for row in parsed_results:
    print(f"Interface: {row[0]}, Status: {row[1]}, Protocol: {row[2]}")

 

위의 스크립트를 수행해서 마지막 print 구문을 통해 나타나는 결과는 아래처럼 테이블 형태로 나타난다.

Interface: GigabitEthernet0/0, Status: up, Protocol: up
Interface: GigabitEthernet0/1, Status: down, Protocol: down
Interface: GigabitEthernet0/2, Status: administratively down, Protocol: down

 

상세설명

  앞선 부분에서 2번째 스텝. textFSM 템플릿을 보다 자세히 보면 아래와 같다.

 

Value 라인

  Value 키워드는 템플릿에서 추출할 데이터를 정의하게 된다. 예를 들어, Value INTERFACE (\S+)는 인터페이스 이름을 추출할 때 사용됩니다. (\S+)는 공백이 아닌 문자 하나 이상을 매칭하는 정규식입니다.

 

Start 상태

  템플릿은 항상 Start 상태에서 시작한다. 해당 템플릿은 첫 라인이 "Interface Status Protocol"인지 확인하고 맞다면, InterfaceLines 상태로 이동한다.

  • ^는 문자열의 시작
  • \s+는 하나 이상의 공백을 의미하는 정규식 표현
  • -> InterfaceLines는 매칭되었을 때 이동할 다음 상태

InterfaceLines 상태

  각 인터페이스의 정보를 추출한다.

  • ${INTERFACE}, ${STATUS}, ${PROTOCOL}는 각각 Value 라인에서 정의한 변수를 사용
  • \s+는 각 필드가 공백으로 구분되어 있음을 나타내는 정규식 표현
  • -> Record는 매칭된 데이터를 결과 리스트에 추가

 

참고 링크:

반응형