Nornir 네트워크 자동화 – 3 (활용편)

Nornir 네트워크 자동화 – 3 (활용편)

이전 글(Nornir 네트워크 자동화 -2 (활용편))에서 nornir-netmiko 를 통해 시스코스위치에 명령을 내리고 결과를 가져오는 파이썬 스크립트를 작성했다.

이제, 남은것은 가져온 결과에서 원하는 부분을 추출하여 excel 에 저장하는 것이다.
만약, 결과를 눈으로 확인하기만 하면 된다고하면 print_result 사용만으로 충분할 수도 있겠지만, 장비의 시리얼 번호 추출이나 os 버전을 업그레이드 하기 위해 현재 os 버전을 확인하고자 한다면 결과를 파싱하여 정리하는 것이 보기에 좋을 것이다.

파싱의 원래 개념은 문자열을 토큰으로 분해하여 parse tree를 만드는 과정을 말하므로 엄격한 의미의 파싱이라 할 수 없을지도 모르겠지만, 넓은 의미로 원하는 데이타를 추출하는 행위도 의미한다.

어떤 문자열에서 원하는 문자열을 추출하기 위한 방법으로는 여러 가지가 있겠지만 정규표현식을 이용하는것이 좋다.

* 결과 파싱

아래는, 다른 프로젝트에서 사용하던 스크립트로 문자열을 입력받아 hostname, model number, os version, uptime, cpu(%idle), mem(%idle), fan, temperature, power supply 관련 내용을 추출하는 파이썬 스크립트다.

parsing.py 로 아래 내용을 작성한다.

nornir 태스크 실행결과는 문자열이 아니므로, 위 스크립트를 곧바로 적용할 수 없다. 이것을 해결하려면 task 결과를 하나의 문자열로 만들거나, 각 항목의 결과(data[name][i].result)를 위의 스크립트에 넣는 방법도 있다.
여기에서는, 단순하게 모든 결과를 하나의 문자열로 만들도록 스크립트를 작성하도록 한다.

코드를 아래처럼 수정한다.

이것은 data 오브젝트(nornir result)에서 result만 추출하는 코드로 각 결과들이 tmp_str 변수에 문자열로 저장된다. 일단 코드는 동작하지만 뭔가 좀 복잡해보이며, data의 구조를 파악하기도 쉽지 않다. 이 오브젝트의 구조를 쉽게 보려면 직렬화하면 된다.

* 결과 직렬화

직렬화(serialize)는 오브젝트를 문자열과같은 연속적인 데이타로 변환하는 것을 의미한다.

nornir-salt 플러그인에서 제공되는 ResultSerializer는 task 결과를 딕셔너리로 만들어준다.

ResultSerializer를 사용하기 위해 nornir-salt 패키지를 설치한다.

이제, 위의 코드를 다시 작성한다.

위 코드의 결과는 아래와 같으며, 딕셔너리데이타이므로 nornir Result 타입의 데이타보다 읽기가 매우 쉽다.

이제, ios_pm 함수는 아래와 같다.

결과에서 원하는 문자를 추출하는 result_parsing 함수를 만든다.

이 스크립트의 실행결과는 아래같은 딕셔너리를 가지는 리스트가 된다.

* 보고서 작성

이제 거의 다 왔다.
마지막 단계는 이 리스트 데이타를 엑셀에 보기좋게(?) 저장하기만 하면 되는 것이다.

먼저, 오늘 날자로 워크시트를 만들고 제목과, 점검 항목을 만드는 함수를 만든다.

마지막으로 리스트로부터 각 항목을 엑셀의 셀에 적고 저장하는 report 함수를 작성한다.

지금까지 만든 함수들을 바탕으로 main.py 파일을 작성한다.

실행하면, (인벤토리에 118개의 장비가 등록)

지금까지 Nornir를 사용하여 시스코 스위치를 점검하는 스크립트를 작성해보았다. 사실 지금까지는 기능 위주로 코드를 작성했으므로 개선의 여지가 많다.

몇 가지 개선할 사항을 적어보면서 글을 마무리한다.

* 에러처리
* 특정 장치만 점검하도록하는 필터(이것은 hosts.yaml의 data 부분을 활용할 수 있다).
* 엑셀파일이름 지정
* SimpleInventory 대신 DictInventory 사용(hosts.yaml 파일 만들 필요 없음)

* 마치며…

몇가지 사항을 수정한 전체 코드는 github에 있다.

시스코 iOS 스위치 점검 스크립트: https://github.com/snowffoxx/CiscoPM
익스트림 Exos 스위치 점검 스크립트: https://github.com/snowffoxx/ExosPM

기타사항:
아래처럼 netmiko timeout 오류 발생시 처리 방법.

hosts.yaml에 아래와같이 타임아웃값을 주었으나 해결되지 않음.

파이썬 가상환경에 설치된 netmiko 패키지 중에서 base_connection.py ((venv) CiscoPM_new\venv\Lib\site-packages\netmiko>base_connection.py) 파일에 타임아웃값이 기본 5초로 설정된것 확인.

이 값을 20초로 변경후 오류 발생하지 않는다.

참고문서: https://nornir-salt.readthedocs.io/en/latest/index.html

답글 남기기

Your email address will not be published.

%d bloggers like this: