Nornir 네트워크 자동화 -2 (활용편)

Nornir 네트워크 자동화 – 2 활용편

목표: Nornir를 이용하여 시스코 스위치 점검하는 파이썬 스크립트를 작성

사람이 장비점검을 한다고 하면 보통 아래 과정을 거쳐야한다.

1. 스위치의 목록 확인(ID, 비밀번호, 접속방법 등등)
2. 장비 접속, 보통 순서대로 접속하지만, 터미널 프로그램에 등록해서 한번에 여러대 접속이 가능하다.
3. 장비별로 명령을 내린다. 이것 역시 순서대로 하거나 여러 장비에 동시 가능.
4. 명령의 실행 결과를 확인하고 체크리스트를 작성한다.(이부분에서 사람은 동시에 하기 어려움)

이것을 자동화한다면,
1. 장비 목록에서 hosts.yaml 작성. 또는 파이썬 딕셔너리 타입의 hosts 데이타를 작성.
2. Nornir netmiko_task로 장비에 명령을 내리고 실행 결과를 받음.
3. 실행결과에서 원하는 결과를 추출하고 체크리스트를 작성한다.

인벤토리는 기본적으로 hosts 정보만으로 Nornir를 초기화하고 실행할 수 있다. 따라서 이전 글에서 살펴본 hosts의 스키마를 기본으로 아래 항목으로 excel 파일을 작성하고, 명령을 실행한 후 결과를 excel 파일에 저장하도록 스크립트를 작성해 보도록 한다.

* 장비리스트

장비리스트는 위 그림과 같은 항목으로 엑셀 파일을 작성한다. 시트의 이름은 hosts 로 한다.
각 항목은, id, hostname, username, password, platform, port, vendors, role, site 로 구성되며, 다음 yaml 포맷처럼 변환할 것이다.

id는 중복되지 않도록 하면되는데, 여기서는 가장 단순하게 숫자를 사용한다.

엑셀파일을 다루기 위해서 openpyxl 패키지를 설치한다.

* 호스트 파일 읽기

cisco_pm.py 파일을 만들고, 엑셀 파일에서 데이타를 읽어 딕셔너리 데이타를 만드는 get_hosts_file 함수를 만든다.

이것을 실행하면 아래와 같은 딕셔너리 타입의 데이타를 볼 수 있다. pprint

이것을 yaml 포맷의 파일로 저장하여 SimpleInventory 플러그인을 사용하는 방법도 있고, 딕셔너리를 그대로 사용할 수 있는 DictInventory 플러그인을 사용해도 된다.

SimpleInventory를 사용하기 위해 위의 데이타를 yaml 파일로 저장하도록 한다. yaml 파일 작성을 위해서, PyYAML 패키지를 설치한다.

* hosts.yaml 파일 생성

딕셔너리 데이타를 yaml 파일로 저장하기 위한 hosts_to_yaml 함수를 작성한다. 이 함수가 실행되면 hosts 데이타가 hosts.yaml 파일로 저장된다.

현재 디렉토리에 hosts.yaml 파일이 만들어 졌으며, 이는 위에서 본 yaml 형식과 동일할 것이다.

* InitNornir

이제, nornir를 사용하기위해 패키지를 설치한다.

cisco 스위치를 점검하기위한 ios_pm 함수를 작성한다. 먼저 첫번째 단계로 위에서 만든 hosts.yaml 로 nornir를 초기화하는 코드를 작성한다.

task를 작성하기전에 초기화가 잘 되는지 확인해 본다. 결과가 아래처럼 나오면 코드가 잘 작성된 것이다.

* nornir-netmiko

Nornir를 이용해 네트워크 스위치를 점검하기위해서 필요한 명령을 실행하는데, 이것은 netmiko 플러그인을 사용하면 된다. netmiko 플러그인은 아래 명령으로 설치할 수 있다.

netmiko_send_command는 nornir task로 스위치에 하나의 명령을 내리고 결과를 받을 수 있다. 사용법은 매우 간단하다.

위에서 작성한 ios_pm 함수에 아래 코드를 추가한다.

이 코드는 초기화된 nornir 호스트들에 show hardware 명령을 실행하고 결과를 받아온다. 코드를 실행하면 아래와 같은 결과가 보인다.

결과는 딕셔너리와 유사한 object에 저장이 되는데, 이것을 단순히 화면으로 확인하려면, print_result를 이용하면된다. print(data)를 print_result(data)로 바꾸고 실행해본다.

하지만, print_result를 사용하려면 nornir-utils패키지를 설치해야한다.

이제 아래 내용을 추가해 둔다.

실행 결과는 아래와 비슷할 것이다.

이 실행 결과에서 원하는 부분이 uptime 이라면 결과를 parsing 하면 되는데, 문제는 결과가 단순한 파이썬 데이타 타입이 아니라는 것이다. 이 오브젝트는 딕셔너리와 비슷한 구조라고 했다. 그러면 어떤 구조인지 확인해 보자. 결과를 단순하게 보기 위해서, 하나의 호스트만 필터하여 실행하도록 하자.

코드를 아래와 같이 수정해서 엑셀파일의 id 4번인 스위치에서만 실행되도록 하자. 꼭 4번이 아니어도 된다.(그냥 찍었음.)

실행결과는,

결과를 보면, 원하는 문자열(Switch uptime is 16 weeks, 4 days, 21 hours, 15 minutes)이 포함된 결과는 MultiResult 오브젝트에 있다.

아래 코드를 추가하자.

실행결과는?

원하는 결과는 data[‘4’].result 가 가지고 있음을 확인 할 수 있다. 이 결과에서 type(data[‘4’].result) 해 보면, 이므로, 이제 문자열에서 uptime을 찾아 잘라내는 스크립트를 만들면 된다.

이 시점에서 스위치를 점검하기 위한 명령어가 여러 개라는 문제가 발생한다. 보통 시스코 스위치 상태를 점검하려면 몇가지 명령어를 사용해야 하므로, 이 전에 다루었던(Nornir 네트워크 자동화 -1) 그룹화된 task를 사용하여 task를 수행해야한다.

이제, 이 시점에서 어떤 항목을 점검할지 정해 두도록 하자.

보고서를 작성할 항목은, 장비 IP 주소, 호스트네임, 모델명, OS버전, UP Time, CPU 사용율, 메모리 사용율, 파워서플라이 상태, FAN상태, 온도로 한다.
먼저, 장비 IP 주소는 hosts.yaml 파일의 IP 주소를 사용하면 되고(장비에서 읽어와도 되나 고려사항이 많으므로 간단히 인벤토리 정보를 이용하도록 하자), 나머지는 아래 명령들을 실행해야한다.

show hardware – 모델명, OS 버전, uptime.
show env all 또는 show env – 파워서플라이, 온도, Fan 상태,
show config | inc hostname – 설정된 호스트네임
show processes cpu – CPU 사용율
show processes mem – 메모리 사용율

위의 경우처럼 적어도 5개의 명령을 실행해야 한다. netmiko_send_command는 하나의 명령밖에 실행하지 못하므로, 위의 명령을 실행하는 그룹화된 task를 작성한다.

그룹화된 task를 만들기 전에, 인벤토리의 hostname(ip 주소)을 반환하는 task를 작성한다. 함수 이름은 device_ip로 한다.

아래 함수는 Task 타입의 인수 task를 받아서 Result 타입의 결과를 반환하는 함수인데, 단순히 인벤토리의 hostname을 반환하는 함수이다.

* Grouped Task 작성

이제 netmiko_send_command로 위의 명령어를 모두 실행하는 task를 작성한다. 이 함수의 이름은 ios_group_task 로 하자.

이제, 이 task를 실행하기 위해 ios_pm 함수를 수정하자.

이제 스크립트를 실행하면, 각 호스트별로 각각의 명령어가 실행된 결과를 볼 수 있다. 아래는 실행결과의 일부분이다.

이제 남은것은 실행 결과로부터 원하는 부분을 추출하고, 엑셀파일에 결과를 예쁘게 출력하는 것이다. 그렇게 하기위해서는 결과를 좀 더 살펴볼 필요가 있다.

다시 코드를 수정하자.

역시 하나의 결과만 살펴보기위해서다.

이전과 다르게 결과가 좀 더 복잡해 보인다. 코드를 여러줄 써서 각각의 result를 확인해 보자.

이것을 실행하면,

이제, 장비가 많아지면 결과 추출이 좀 더 복잡해 진다.

다음 편에서는 결과를 파싱하여 보고서를 완성해 보도록 한다.

답글 남기기

Your email address will not be published.

%d bloggers like this: