본문 바로가기
  • ▒ 네모의 쉽게 배우는 네트워크 | 개발 ▒
네트워크 운영도구 개발/업무 자동화

[네트워크 자동화 시작하기]#2-1. Netmiko 활용해보기 - 장비 접속

by 너l모 2021. 8. 20.
반응형

※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :P 추가로 궁금하신 점은 댓글로 남겨주시고 필요한 자료 있으면 요청주세요! 잘못된 내용이 있으면 고쳐주시면 감사하겠습니다. 자료 퍼가실 때는 출처 남겨주세요!


 ο 목차

     


    ※ 코드 보는 방법 참고

    ㅇ 달러 기호($)가 있는 경우 -> 리눅스 터미널에서 CLI 명령어 입력

    ㅇ "=#" 기호가 있는 경우 -> psql 쉘에서 명령어 입력

    ㅇ 꺽쇠가 하나 있는 경우(>) -> 윈도우 명령 프롬프트(cmd)에서 명령어 입력

    ㅇ 꺽쇠가 세개 있는 경우(>>>) -> python 쉘에서 명령어 입력


    1. Netmiko 활용 준비

    1) Netmiko 자동화 관련 사이트

    ※ 포스팅 내용 외에 궁금한 자료는 웬만하면 아래 3개 사이트 안에 다 있습니다. 추가로 정보가 필요할 때에는 아래 사이트 내용 참고 하세요 :P

     

    (1) Netmiko 공식 깃허브 저장소

    GitHub - ktbyers/netmiko: Multi-vendor library to simplify Paramiko SSH connections to network devices

     

    GitHub - ktbyers/netmiko: Multi-vendor library to simplify Paramiko SSH connections to network devices

    Multi-vendor library to simplify Paramiko SSH connections to network devices - GitHub - ktbyers/netmiko: Multi-vendor library to simplify Paramiko SSH connections to network devices

    github.com

     

    (2) Netmiko API 모듈, 클래스 정보 제공 사이트

    netmiko API documentation (ktbyers.github.io)

     

    netmiko API documentation

    The SSHDetect class tries to automatically guess the device type running on the SSH remote end. Be careful that the kwargs 'device_type' must be set to 'autodetect', otherwise it won't work at all. Parameters *args : list The same *args that you might pr

    ktbyers.github.io

     

    (3) Netmiko 활용 가이드 for Network engineer (by ktbyers)

    Python for Network Engineers | Articles (twb-tech.com)

     

    Python for Network Engineers | Articles

    Since late 2014, I have been working on an open-source Python library that simplifies SSH management to network devices. The library is based on the Paramiko SSH library and is named Netmiko. You can find the library at https://github.com/ktbyers/netmiko a

    pynet.twb-tech.com

     

    2) Netmiko 지원 가능한 네트워크 장비 OS 리스트

    • 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)

     

    netmiko.base_connection API documentation

    Module netmiko.base_connection Base connection class for netmiko Handles SSH connection and methods that are generically applicable to different platforms (Cisco and non-Cisco). Also defines methods that should generally be supported by child classes Sourc

    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 다음 포스팅에서 뵈요!


    ※ 좋아요와 구독은 큰 힘이 됩니다. 감사합니다. 

     

    반응형

    댓글