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

[네트워크 자동화 시작하기]#2-2. Netmiko 활용해보기 - 명령어 사용하기

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

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


 ο 목차

     


    ※ 코드 보는 방법 참고

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

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

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

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


    Netmiko에서 지원하는 다양한 command_send 함수 중 제가 가장 많이 사용하는 3개 함수를 소개해볼까 합니다.

    케이스에 따라 다른 함수가 필요할 수도 있겠지만 저는 3개 이외의 다른 함수는 크게 사용할 일은 없었습니다. 

     

    아래 자료가 작업에 도움이 되길 바랍니다 :P 


    CASE1 | send_command() 함수

    1. 사용 조건

    "명령어 전달 -> 동작 -> 동작 결과 반환" 방식의 원격 제어가 필요한 경우

     

    2. 사용 명령어 예시

    ▶ show 명령어

    명령어 전달 -> 명령어에 대한 결과값 반환

    ▶ clear 명령어

    명령어 전달 -> 동작(clear) -> 동작에 대한 결과값 반환

    ▶ etc...

     

    3. 사용 방법

    (코드 예시)

    # 모듈 import
    from netmiko import ConnectHandler
    
    # 접속할 device1 정보
    device1 = {
        "device_type" = "장비OS플랫폼",
        "host" = "IP",
        "username" = "접속계정명",
        "password" = password
    }
    
    # device1 장비 ssh 접속 
    net_connect = ConnectHandler(**device1)
    
    # enable 모드 활성화
    net_connect.enable()
    
    # "show system" 명령어 전달 후 결과를 output에 저장
    output = net_connect.send_command("show system")
    
    # output 결과 출력
    print(output)

     

    (결과 예시)

    - 시스템 모델 정보 출력

     

    CASE2 | send_command_timing() 함수

    1. 사용 조건

    "명령어 전달 -> 동작을 위한 확인 질문 -> 추가 명령어 전달 -> 동작 -> 동작 결과 반환" 방식의 원격 제어가 필요한 경우

    ※ send_command_timing() 함수는 첫번째 명령어를 전달하고 다음 프롬프트가 나타날 때까지 기다린 후(delay) 세션이 연결된 프롬프트에 추가 인수를 입력할 수 있도록 제어

     

    2. 사용 명령어 예시 

    ▶ write memory 명령어 

    - write memory 는 '장비로 write memory 명령어 전달 -> 장비에서 "Overwrite 'config: 0 start.cfg'? [y/n]" 와 같은 확인 질문 -> 질문에 대해 yes 혹은 no라는 추가 인수를 다시 한번 장비로 전달'해야 정상적으로 동작하는 명령어

    - send_command()를 아래와 같이 구성한다해도 write memory는 동작하지 않음. 

    # write memory 수행 명령어 전달.
    output = net_connect.send_command("write memory")
    # 장비에서 output으로 질문을 보냈으나 질문을 보낸 시점에서 세션이 종료되어 write memory는 수행되지 않음.
    
    # 질문을 예상하고 yes 명령어를 전달하려 하나 이미 기존 세션이 종료되었기 때문에 장비에는 새로운 명령어인 yes가 입력됨.
    output += net_connect.send_command("yes")
    # yes라는 명령어는 없으므로, 오류 출력

    - 이런 경우 send_command_timing() 명령어를 이용해서 기존 세션을 그대로 유지한 채 "yes|no"를 추가 인수로 다시 한번 전달해주면 정상적으로 write memory 작업을 수행할 수 있음.

     

    3. 사용 방법

    (코드 예시) test_netmiko.py

    # 모듈 import
    from netmiko import ConnectHandler
    
    # 접속할 device1 정보
    device1 = {
        "device_type" = "장비OS플랫폼",
        "host" = "IP",
        "username" = "접속계정명",
        "password" = password
    }
    
    # device1 장비 ssh 접속 
    net_connect = ConnectHandler(**device1)
    
    # enable 모드 활성화
    net_connect.enable()
    
    # "show system" 명령어 전달 후 결과를 output에 저장
    output = net_connect.send_command_timing("write memory")
    output += net_connect.send_command_timing("yes")
    
    # output 결과 출력
    print(output)

    (결과 예시)

    - 정상적으로 memory write 작업이 완료된 것을 확인할 수 있음. 

    ※ "write memory"에 해당하는 동작은 save_config() 라는 명령어로도 간단하게 구현 가능함. 

    ※ 위의 내용은 예시로 사용법 정도만 참고

     

    CASE3 | send_config 함수

    1. 사용 조건

    네트워크 장비에 configure 설정이 필요한 경우

    ※ 일반적으로 설정을 하기 위해서 장비에 "configure" -> "설정값" -> "exit" 명령어를 차례로 전달해야 하는데, send_config는 그 중 "configure" 와 "exit" 명령어를 기본적으로 포함하는 함수로, 중간의 "설정값"만 인수로 전달하면 되도록 구성됨. 

     

    2. 사용 방법

    (코드 예시) test_netmiko.py

    # 모듈 import
    from netmiko import ConnectHandler
    
    # config 설정값 - 원격 log 서버 및 ntp 서버 설정
    conf_set = ["logging x.x.x.x","ntp server y.y.y.y"]
    
    # 접속할 device1 정보
    device1 = {
        "device_type" = "장비OS플랫폼",
        "host" = "IP",
        "username" = "접속계정명",
        "password" = password
    }
    
    # device1 장비 ssh 접속 
    net_connect = ConnectHandler(**device1)
    
    # enable 모드 활성화
    net_connect.enable()
    
    # "show system" 명령어 전달 후 결과를 output에 저장
    output = net_connect.send_config_set(conf_set)
    
    # output 결과 출력
    print(output)
    
    net_connect.disconnect()

     

    (코드 실행)

    > python3 test_netmiko.py

    - "configure"와 "exit" 없이 설정값 만으로 장비에 원격 로그 서버와 ntp 서버가 설정된 것을 확인할 수 있음. 

    여러 줄의 설정값을 설정할 때 특히 유용하게 사용 가능함. 


    이상으로 netmiko로 원격 통제시 가장 많이 사용하는 함수 3개 소개가 끝났습니다.

     

    다음 시간에 더 유용한 포스팅으로 돌아오도록 하겠습니다~

    감사합니다. 


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

     

    반응형

    댓글