※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :P 추가로 궁금하신 점은 댓글로 남겨주시고 필요한 자료 있으면 요청주세요! 잘못된 내용이 있으면 고쳐주시면 감사하겠습니다. 자료 퍼가실 때는 출처 남겨주세요!
ο 목차
※ 코드 보는 방법 참고
ㅇ 달러 기호($)가 있는 경우 -> 리눅스 터미널에서 CLI 명령어 입력
ㅇ "=#" 기호가 있는 경우 -> psql 쉘에서 명령어 입력
ㅇ 꺽쇠가 하나 있는 경우(>) -> 윈도우 명령 프롬프트(cmd)에서 명령어 입력
ㅇ 꺽쇠가 세개 있는 경우(>>>) -> python 쉘에서 명령어 입력
1. Netmiko 활용 준비
1) Netmiko 자동화 관련 사이트
※ 포스팅 내용 외에 궁금한 자료는 웬만하면 아래 3개 사이트 안에 다 있습니다. 추가로 정보가 필요할 때에는 아래 사이트 내용 참고 하세요 :P
(1) Netmiko 공식 깃허브 저장소
(2) Netmiko API 모듈, 클래스 정보 제공 사이트
netmiko API documentation (ktbyers.github.io)
(3) Netmiko 활용 가이드 for Network engineer (by ktbyers)
Python for Network Engineers | Articles (twb-tech.com)
2) Netmiko 지원 가능한 네트워크 장비 OS 리스트
Supported Platforms | netmiko (ktbyers.github.io)
- 지원 가능한 장비 리스트(참고)
- Arista vEOS
- Cisco ASA
- Cisco IOS
- Cisco IOS-XR
- Cisco SG300
- HP Comware7
- HP ProCurve
- Juniper Junos
- Linux
- and other
- 같은 벤더사 제품이 아니더라도 OS 플랫폼이 동일하다면 Netmiko 활용 가능(일부 기능은 테스트가 필요할 수 있음)
- 예를 들어, 국산 제품인 유비쿼스 네트워크 장비는 시스코 벤더사는 아니지만 시스코 IOS를 기반으로 동작하기 때문에 Netmiko를 활용하여 자동화 관리가 가능함.
2. Netmiko 활용 방법
1) 장비 접속하기
(1) 필요 모듈
- netmiko 패키지의 ConnectHandler 모듈 필요
from netmiko import ConnectHandler
(2) 접속방법 1 - 직접 정보 전달을 통한 장비 접속 방법
net_connect = ConnectHandler(
device_type = "장비OS플랫폼",
host = "호스트명_or_IP",
username = "접속계정명",
password = "계정패스워드",
secret = "enable패스워드"
)
- ConnectHandler 함수를 사용해서 장비 접속과 관련된 인자를 원격 네트워크 장비에 전달하고, 결과로 얻어진 SSH 세션에 대한 커넥션클래스를 net_connect라는 변수로 return함.
(3) 접속방법 2 - 딕셔너리 변수를 통한 간접 정보 전달 및 장비 접속 방법
cisco1 = {
"device_type" = "장비OS플랫폼",
"host" = "IP",
"username" = "접속계정명",
"password" = "계정패스워드"
"secret" = "enable패스워드"
}
net_connect = ConnectHandler(**cisco1)
- 접속할 네트워크 장비에 대한 SSH 접속 정보를 딕셔너리 변수로 미리 지정한 후, 이를 활용해 SSH 커넥션클래스를 얻는 방법
- 다수 장비에 대한 코드를 짤 때에는 딕셔너리 변수를 활용하는 것이 여러모로 유용함
(4) ConnectHandler 설정 가능 인자 값들
* 아래 페이지 참고
netmiko.base_connection API documentation (ktbyers.github.io)
2) 접속 결과 확인하기
(1) find_prompt() 클래스 함수 사용
print(net_connect.find_prompt())
- 리턴된 SSH 커넥션클래스의 find_prompt() 함수는 현재 접속된 장비의 prompt 값을 str 변수로 리턴함
- 예시) 아래와 같이 네트워크 장비의 현재 prompt 값 리턴 ( "호스트네임>" 혹은 "호스트네임#" 형태)
3) 접속 종료하기
(1) disconnet() 클래스 함수 사용
net_connect.disconnect()
- 기본적으로 SSH 세션을 1개 소모하여 원격 접속하는 것이기 때문에 작업이 끝난 후에는 disconnect() 함수를 사용해서 소모된 SSH 세션을 사용가능하도록 돌려줘야 함.
- 장비의 SSH 세션 동시 접속 설정값에 따라 사용가능한 세션을 모두 소모해버리면 추가로 SSH 접속시에 영향이 있을 수 있고, 너무 많은 SSH 세션이 정상적으로 종료되지 않아 문제가 발생할 수 있음.
4) 실전 코드 예제
from netmiko import ConnectHandler
cisco1 = {
"device_type" = "장비OS플랫폼",
"host" = "IP",
"username" = "접속계정명",
"password" = "계정패스워드"
"secret" = "enable패스워드"
}
net_connect = ConnectHandler(**cisco1)
print(net_connect.find_prompt())
net_connect.disconnect()
5) 심화 :: getpass() 함수 사용하기
관리 편의를 위해서라고는 하지만 장비에 대한 중요한 접속 정보(특히 패스워드)를 파이썬 스크립트에 남겨둔다는 것은 보안상의 관점에서 봤을 때 바람직하지는 않습니다.
getpass() 라는 함수를 사용하면 파이썬 스크립트에 패스워드를 미리 저장해두는 것이 아니라, 스크립트를 실행시킬 때마다 관리자가 패스워드는 직접 입력할 수 있습니다.
(1) getpass() 모듈 import
from getpass import getpass
(2) getpass() 사용하기
cisco1 = {
"device_type" = "장비OS플랫폼",
"host" = "IP",
"username" = "접속계정명",
"password" = password
}
net_connect = ConnectHandler(**cisco1)
- 코드를 실행시키면 아래와 같이 Password : 를 직접 입력하도록 입력창이 나타남
(3) 여러 장비에 getpass()로 동일한 패스워드 사용하기
password = getpass()
cisco1 = {
"device_type" = "장비OS플랫폼",
"host" = "IP1",
"username" = "접속계정명",
"password" = password
}
cisco2 = {
"device_type" = "장비OS플랫폼",
"host" = "IP2",
"username" = "접속계정명",
"password" = password
}
- getpass()로 받은 패스워드를 password 변수로 저장하여 다수 장비에 일괄 적용할 수 있음
이것저것 테스트 해보면서 사용 방법을 손에 익혀보시길 바랍니다 :P
처음에는 좀 귀찮아도 장비가 많을수록 스크립트 하나하나가 가져다주는 효율과 편리성은 말로 다 할 수가 없어요.
다음 포스팅은 원격에서 enable 및 명령어 전달에 대한 내용을 다룰 예정입니다.
포스팅이 많은 도움이 되면 좋겠습니다 :P 다음 포스팅에서 뵈요!
※ 좋아요와 구독은 큰 힘이 됩니다. 감사합니다.
'네트워크 운영도구 개발 > 업무 자동화' 카테고리의 다른 글
[네트워크 자동화 시작하기]#2-2. Netmiko 활용해보기 - 명령어 사용하기 (0) | 2021.08.23 |
---|---|
[네트워크 자동화 시작하기]#1. 윈도우(Windows)에서 네트워크 자동화 환경 구성하기 (1) | 2021.07.26 |
[네트워크 자동화 시작하기]#0. 네트워크 자동화란? (0) | 2021.07.23 |
댓글