오늘은 네트워크 엔지니어링과 자동화에 많이 사용되는 강력한 텍스트 파싱 도구인 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는 매칭된 데이터를 결과 리스트에 추가
참고 링크:
'<개인공부> - IT > [Network&Security]' 카테고리의 다른 글
TextFSM을 사용한 네트워크 장비 출력 파싱 #2 (0) | 2024.05.27 |
---|---|
#4. Global Unicast Address 설정방법 (0) | 2022.12.01 |
#3. IPv6 주소 표현방법과 종류 (0) | 2022.11.23 |
#2. IPv6의 개념과 필수용어 (0) | 2022.11.16 |
#1. IPv6이란? (0) | 2022.11.11 |