Nornir 네트워크 자동화 – 1

Nornir 네트워크 자동화 – 1 (기초편)

1. Nornir란 무엇인가?

Nornir는 파이썬으로 작성된 자동화 프레임워크다. Ansible의 경우 파이썬으로 작성되었지만 프로그래밍을 몰라도 사용하는데 문제는 없지만, Nornir를 사용하려면 파이썬 프로그래밍을 알아야한다.
Nornir는 파이썬 버전 3.6.2 이상에서 동작한다.

2. Nornir 설치

Nornir는 PyPI에 게시되며, 다른 파이썬 패키지들처럼 pip 명령으로 설치가 가능하다. 또한 개발단계에서는 virtual environment를 사용하는것이 좋다.

아래 명령으로 설치한다.

설치후 파이썬 쉘에서 Nornir 시험해본다.

오류가 발생하지 않는다면 잘 설치된 것이다.

3. Nornir 초기화

InitNornir 함수를 이용하여 Nornir를 초기화 한다. 초기화에는 설정파일을 이용할 수도 있고, 파이썬 코드를 사용할 수도 있으며 두가지를 조합하여 사용할 수도 있다.

* 설정파일 작성 – 설정파일은 yaml 포맷으로 작성한다. 여기에서는 설정파일 이름을 config.yaml로 했다.(다른 이름을 사용해도 된다.)

아래와 같이 config.yaml 파일을 작성한다.

* 설정파일로 Nornir 초기화하기.
아래는 config.yaml 파일로 Nornir를 초기화한후에 worker 개수를 확인하는 파이썬 코드이다.

위 코드를 파이썬 쉘에서 실행하면 10 이 보인다.

* 설정파일 없이 초기화하기(파이썬 코드작성)

파이썬 쉘에서 실행한 결과는 동일하다.

* 위의 두 가지를 조합해서 사용하는 방법

위 코드에서는 설정파일의 num_workers는 10이나 InitNornir 파라메터로 숫자를 40으로 변경했으므로, 실행결과는 40 이 된다.

4. 인벤토리

인벤토리는 hosts, groups, defaults로 구성된다. 여기에서는 SimpleInventory 플러그인을 사용한다.
SimpleInventory 플러그인은 세개의 파일(hosts.yaml, groups.yaml, defaults.yaml)에 관련 데이타를 저장한다.

* hosts 파일: hosts 파일은 가장 바깥쪽(왼쪽)의 키가 host 이름과 개체에 연결된 구조로, 아래 코드를 실행하면 host 개체의 스키마를 볼 수 있다.

실행 결과는,

위의 스키마를 바탕으로 그림의 리스트를 hosts.yaml 파일을 만들면 아래와 비슷한 구조가 된다.

* groups 파일: groups 파일은 hosts 파일과 동일한 구조를 가진다. 위에서 작성한 hosts파일에서 중복되는 부분을 group으로 만들 수 있다.
backbone_1, backbone_2 항복의 중복되는 부분을 Nexus 그룹으로 만들수 있는데, hosts파일과 group파일은 아래처럽 보일 것이다.

hosts.yaml

groups.yaml

* defaults 파일: defaults파일은 host 파일과 동일한 스키마를 가지나 개별 요소를 나타내는 외부 키가 없다.

* 인벤토리 접근하기.
인벤토리는 inventory 속성으로 접근할 수 있다.

위 코드를 실행하면, 아래와 같은 결과를 볼 수 있다.

인벤토리는 각 호스트와 그룹에 접근하는데있어 딕셔너리와 유사한 속성을 가진다.

hosts와 groups는 모두 아래처럼 keys() 메소드를 사용하여 접근 가능하다.

* 모델의 상속
groups.yaml 파일에서 Cisco_telnet 그룹은 Cisco 그룹을 상속하여 port 만 다른 그룹을 만들 수 있다.

5. 인벤토리 필터
인벤토리에서 원하는 호스트를 골라내는 간단한 방법은 (key, value) 쌍을 이용하는 것이다. 아래와 같은 방법으로 WIFI에 해당하는 호스트를 골라 낼 수 있다.

(key, value) 쌍을 여러개 사용하는 것도 가능하며 필터를 여러번 사용하는 것도 가능하다

filter를 여러번 사용해도 된다.

children_of_group 메소드를 사용할 수도 있다.

이 외에 함수를 만들고 filter_func 파라메터를 주어 원하는 호스트를 골라낼 수도 있고,더 많은 경우의 수를 가지고 골라내기위해 filter object F 를 사용하는 방법도 있다.

6. Task

Task는 한 호스트를 위해 어떤 기능을 구현한 재사용 가능한 코드다.
네트워크 장치에서 task는 플러그인 설치를 통해서 실행이 가능하다. task를 이해하기 위해 리눅스 host를 추가하고 만들어본다.
hosts.yaml에 아래 호스트를 추가한다.

이제, 아래처럼 task 를 작성한다.

위에서 작성한 task를 실행하면 아래와 같은 결과를 볼 수 있다.

task 함수에 인수를 주어 기능을 확장할 수 있다. 위에서 만든 함수를 아래와 같이 변경하고 실행할때 인수를 준다.

이제, 실행하면 아래와 같은 결과를 볼 수 있다.

run 함수에 name 인수를 주지 않으면 함수 이름이 기본값이 된다.

7. 그룹화된 Task

네트워크 장치에서 여러 명령을 내려야 한다면 어떻게 해야할까?
netmiko_send_command 는 하나의 명령어만 처리한다.
한번에 여러 가지 명령어를 실행하고 싶다면, task를 그룹화해서 사용할 수 있다.
아래는 cisco ios 장비에서 show hardware, show env all 명령을 실행하는 task다.

위에서 작성한 코드를 실행하면 아래와 같은 결과를 볼 수 있다.

8. 처리결과
처리결과를 보는 가장 간단한 방법은 nornir-util 패키지의 print_result 함수를 이용하는 것이다. 이것은 위의 코드에서 볼 수 있다.

사용방법은,

일부 호스트의 결과만 보려면,

자세한 처리 결과를 이용하는 방법은 part-2 부분에서 다를 것이다.

참고문서:
https://nornir.readthedocs.io/en/latest/tutorial/index.html
https://blogs.cisco.com/developer/nornir-python-automation-framework
https://saidvandeklundert.net/2020-12-06-nornir/

답글 남기기

Your email address will not be published.

%d bloggers like this: