DevOps/Programmability2015.02.17 20:35

NX-API

 

기존의 Python for Networker라는 주제로 포스팅하던 것을, 주제를 넓혀보고자..

Programmability for Networker로 이름을 변경하고 지속해서 시작합니다. ^^;

이번 포스팅은 Cisco의 Programmability를 지원하는 NX-API에 대한 포스팅입니다.  


 

NX-API  - Cisco Programmability

 

◈ NX-API

    - HTTP/HTTPS의 RPC 기반의 API 기능 수행

    - 'show', 'configuration', 'Linux Bash' 지원

    - JSON-RPC를 지원

    - Cisco Nexus 9000 platform 적용

 

 

◈ NX-API 동작

    - HTTP/HTTPS로 전송되며, 해당 CLI는 HTTP/HTTPS의 POST body로 encode된다.

    - Nexus 장비에서는 이러한 NX-API를 위해서 Nginx HTTP Server를 사용한다.

    - Nginx와 모든 하위 Process는 Linux cgroup의 메모리 제한 값을 초과하면, Process가 재시작 되도록 하여, 본 장비 리소스를 보호한다.

 

 

◈ NX-API 명령 포맷

    - Nexus 9000의 향상된 NX-OS CLI

    -  XML 출력,JSON 형태 출력

 

 

◈ NX-API 기능 활성화

    - NX-API feature 활성화 필요 ( Default : Disable)

NX-OS#(config)# feature nxapi

 

 

◈ NX-API Sandbox

    - HTTP/HTTPS를 사용하여, 사용자가 Cli 명령을 특정 Command Type, Output Type을 지정해서 사용할 수 있는 웹기반 인터페이스

    - NX-API Feature를 활성화 후, nxapi sandbox를 사용 할 수 있다.

NX-OS#(config)# nxapi sandbox

     - 접속 방법 : Web 브라우저에서 http://mgmt-ip  로 접속

 

 

◈ NX-API Request Element

    ○ Input

         - 1개 이상의 명령어 입력 가능. (단, 동일한 Messaage Type이어야 함 : Show, Configuration, bash)

         - Show와 Conf의 경우에는 다수의 명령어 입력 시, ';'(세미콜론)을 사용하며, 명령어와 세미콜론 사이는 1칸의 공백 필요

              ex) show interface brief ; show version  or  interface eth2/1 ; switchport ; no shut

         - Bash의 경우에는 다수의 명령어 입력 시, 마찬가지로 ';'(세미콜론)을 사용하지만, 명령어와 세미콜론 사이의 공백이 없어야 함.

             ex) cd /bootflash;mkdir zigi_dir

     

 

    ○ Type

        - cli_show : 구조화 된 결과값을 나타냄. 만약 XML을 지원하지 않는 명령 입력 시에는 error 메시지를 리턴

                              즉, 특정 명령어에 대해서만 구조화된 결과값을 나타내도록 지원. 

        - cli_show_ascii : ASCII 값으로 결과 출력.

        - cli_conf : Configuraion 명령 사용 시 사용

        - bash : Bash 명령 사용 ( NX-API에서는 non-interacitve Bash 명령을 지원)

        * 최대 10개의 Show 명령을 동시에 지원. (10개 이상 입력 시, 11번째부터는 무시 됨.)

        * ASCII의 경우에는 '|' (Pipe) 가 지원 됨. (XML의 경우에는 미 지원)

 

    ○ output_format 

        -  XML / JSON 포맷을 지원

        -  N9K는 XML을 지원하며, JSON은 XML을 전환하여 결과 값을 만든다.

   

 

◈ NX-API Response Element

     ○ version

         - NX-API Version (현재 1.0 / dCloud에서는 0.1 Version 지원)

     ○ type

         - 명령 실행 타입 (cli_show, cli_show_ascii, cli_conf, bash)

     ○ sid

         - 응답에 대한 Session ID.

         - 응답메시지가 chunked인 경우에만 유효함.

    ○ outputs

         - 요청한 전체 명령에 대한 출력 값을 감싸고 있는 Tag

         - cli_show, cli_show_ascii 의 경우에 다수의 명령어를 요청한 경우 각 개별 명령은 output tag가 붙는다.

    ○ output

         - 요청한 개별 명령에 대한 출력 값을 감싸고 있는 Tag

    ○ intput

         - 요청한 명령어

    ○ body

         - 요청한 명령어에 대한 응답

    ○ msg

         - 요청에 대한 응답의 처리 결과 메세지. code Element의 내용으로 확인 가능.

    ○ code

         - 요청에 의한 응답의 결과에 따른 Code번호.

         - NX-API에서는 표준 HTTP의 Status Code값을 사용한다.  

 

[ NX-API SandBox 실행화면 ]

 

 

◈ NX-API Sandbox 화면 구성

     ○ 상단 화면

 

 

         - 실행행하고자 하는 Command 와 Meassage format, Command Type을 지정할 수 있다.

            - POST 버튼은 위에서 지정한 Command와 Format/Type에 맞춰서 Request 코드가 만들어면서, Request가 이뤄진다.

 

    ○ 하단 좌측

 

 

 

 

            - 상단화면에서 지정한 내용에 따라서 만들어진 Request 내용을 출력

            - Python 버튼을 누르면, 해당 Request를 사용 할 수 있는 Python 코드로 생성 됨.

 

      ○ 하단 우측

 

 

         - 상단화면에서 요청한 내용에 대한 결과 값을 출력.

 

 

 

 NX-API Sandbox 실행 예제 -  JSON - cli_show

    

 

 

 NX-API Sandbox 실행 예제 -  JSON - bash

 

 

 NX-API Sandbox 실행 예제  -  Request를 Python Code로 변경

 

 

◈ NX-API Response Code

 

NX-API Response

Code

Message

SUCCESS

200

Success.      

CUST_OUTPUT_PIPED

204

Output is piped elsewhere due to request.

BASH_CMD_ERR

400

Input Bash command error.   

CHUNK_ALLOW_ONE_CMD_ERR

400

Chunking only allowed to one command. 

CLI_CLIENT_ERR

400

CLI execution error.    

CLI_CMD_ERR

400

Input CLI command error.   

IN_MSG_ERR

400

Request message is invalid.   

NO_INPUT_CMD_ERR

400

No input command.    

PERM_DENY_ERR

401

Permission denied.     

CONF_NOT_ALLOW_SHOW_ERR

405

Configuration mode does not allow show .

SHOW_NOT_ALLOW_CONF_ERR

405

Show mode does not allow configuration. 

EXCEED_MAX_SHOW_ERR

413

Maximum number of consecutive show
commands exceeded. The maximum is 10.

MSG_SIZE_LARGE_ERR

413

Response size too large.   

BACKEND_ERR

500

Backend processing error.    

FILE_OPER_ERR

500

System internal file operation error.  

LIBXML_NS_ERR

500

System internal LIBXML NS error.  

LIBXML_PARSE_ERR

500

System internal LIBXML parse error.  

LIBXML_PATH_CTX_ERR

500

System internal LIBXML path context error. 

MEM_ALLOC_ERR

500

System internal memory allocation error.  

USER_NOT_FOUND_ERR

500

User not found from input or cache.

XML_TO_JSON_CONVERT_ERR

500

XML to JSON conversion error.  

BASH_CMD_NOT_SUPPORTED_ERR

501

Bash command not supported.   

CHUNK_ALLOW_XML_ONLY_ERR

501

Chunking allows only XML output.

JSON_NOT_SUPPORTED_ERR

501

JSON not supported due to large amount of output.

MSG_TYPE_UNSUPPORTED_ERR

501

Message type not supported.   

PIPE_OUTPUT_NOT_SUPPORTED_ERR

501

Pipe operation not supported.   

PIPE_XML_NOT_ALLOWED_IN_INPUT

501

Pipe XML is not allowed in input.

RESP_BIG_JSON_NOT_ALLOWED_ERR

501

Response has large amount of output. JSON not
supported.

STRUCT_NOT_SUPPORTED_ERR

501

Structured output unsupported.    

 

 

※ 참고

http://www.google.co.kr/url?url=http://www.jedelman.com/home/introduction-to-using-cisco-nx-api&rct=j&frm=1&q=&esrc=s&sa=U&ei=R2HhVIi2Ioqa8QXqtYAw&ved=0CDMQFjAF&usg=AFQjCNE6Udq_iqse1vYQpq12BtIIiKVOXA

http://keepingitclassless.net/2014/02/cisco-aci-nexus-9000-nxapi/

http://jeffostermiller.blogspot.kr/2015/01/my-first-python-script.html#!/2015/01/my-first-python-script.html

 

Posted by 네떡지기
DevOps/Programmability2015.01.26 22:32



PyEZ라는 Junos OS 장비를 다룰 수 있도록 해주는 Python용 micro-framwork라고 하는 Library를 다뤄봅니다.

이번 포스팅에서는 PyEZ가 무엇인지 아주 간단히, 그리고 아주 간단한 예제를 통해서 가볍게 접근해봅니다. 



Juniper PyEZ Library


○ PyEZ 란?

     - Junos OS 장비를 원격에서 관리 및 자동화하는 Python으로 만든 'micro-framework'

     - Junos OS 혹은 , Junos OS XML API에 대한 이해가 복잡하게 필요하지 않음

     - 비개발자에게는 원격지의 Junos OS 장비의 자동화 업무 등의 할 수 있도록 하는 간단한 Power Shell 역할을 함.

     - 개발자에게는 보다 큰 네트워크 인프라의 자동화 관점에서 사용할 수 있는 확장성 있게 사용할 수 있는 Library 역할을 함. 


○ PyEZ 기능

     - Junos OS CLI의 기반에서의 동일한 기능을 할 수 있도록 설계.

     - 'fact'를 사용한 Software version, serial 등의 정보 제공

     - 현재 동작 상태 정보를 확인 ('Show' 명령)

     - snippets와 templates를 사용하여, unstructured configuration 변경

     - 추상화 된 모델을 통하여 structured configuration 변경

 

 Architecture

     - ncclient library는 NETCONF를 통해서 벤더에 상관없이 사용 가능하도록 함

     - Junos-pyez는 Junos OS 장비를 쉽게 통신하여 관리할 수 있도록 만들어진 Micro-framework.



 



PyEZ Library Install

 

1. 다음과 같이 PyEZ Library를 사용하기 위하여 Install을 한다. [ Windows 기준 ]

     ※ Install 문서 Link.

     https://techwiki.juniper.net/Automation_Scripting/010_Getting_Started_and_Reference/Junos_PyEZ/Installation#Windows

 

 

     정상적으로 Junos PyEZ  Library가 설치된 것을 확인할 수 있다.


※ 주의사항 Paramiko 설치되어 있어야 함.

                           → jnpr.junos.Device 에서 paramiko Library를 Import해서 사용. 

 




PyEZ 처음 사용해보기

   - PyEZ Library를 사용하여, Junos OS 장비에 접속하여 해당 장비의 Hostname과 Version 정보를 가져오기

   - 장비 접속 시, jnpr.junos의 Device라는 클래스를 사용하고, 해당 클래스에서 제공하는 facts를 사용하여 필요한 정보를 가져온다.

   - 아래는 10.1.1.97의 IP를 가진 Junos OS 장비에 접속하여 정보를 가져와서 출력하는 예제입니다.




Posted by 네떡지기
DevOps/Programmability2015.01.10 13:22

OnePK 예제

 


지난 포스팅에 이어서 Python을 사용한 OnePK 예제를 다뤄봅니다.

간략한 예제를 통해서, OnePK를 어떻게 사용할 수 있는지 알아보겠습니다.


 

 

○ OnePK 두 번째 예제

   - Network Element의 Interface 정보를 가져와서 출력해보는 예제입니다

   - Ethernet Type의 Interface 정보를 가져오고, 해당 Interface의 Description을 출력합니다

 

   ◆ 실행결과

 

 

   ◆ 소스코드

  

   - 기본 코드는 지난 포스팅인 Python for Networker Part 14(OnePK3)을 참고해주시면 됩니다.

   - Interface를 정보를 가져오기 위해서 OnePK에서 제공하는 Package중에, Interface라는 Package를 사용합니다.

   - 여기서는 NetworkInterface와 InterfaceFilter라는 Class를 사용합니다.

   - 현재 Element(Network Device)의 Interface 정보를 가져오기 위해서는 get_interface_list 메서드를 사용하게 됩니다.

   - get_interface_list 메서드를 사용하기 위해서는 InterfaceFilter를 지정해줘야 합니다

     InterfaceFilter를 지정하기 위해서, InterfaceFilter에 대한 객체를 생성하는 데

     InterfaceFilter의 객체 생성 시에는 NetworkInterface의 InterfaceTypes을 선택해야 합니다. (Default는 ONEP_IF_TYPE_ANY)

    - 코드 상에서 보면, InterfaceTypes를 사용하기 위해서 NetworkInterface Class의 InterfaceTypes라는 enum 멤버를

      intType이라는 변수에 할당하고, intType에서 Ethernet Type을 지정해서, intfilter라는 InterfaceFilter 객체를 생성합니다

      intfilter를 이용해서 원하는 Interface 리스트 정보를 가져옵니다. 

    - LIST형태로 리턴받은 NetworkInterface에서 하나씩 객체를 가져와서 Interface이름과 description을 출력한다.

    - descritpion의 경우에는 get_config() 메서드를 사용하여, InterfaceConfig 를 리턴받아서, InterfaceConfig의 메서드를 사용한다.

  

 

○ OnePK 두 번째 예제 변형-1

   - 위에서 출력한 Interface 정보를 보면, 인터페이스가 순번대로 반환되지 않기 때문에 0번 인터페이스부터 7번까지 차례대로

     출력되지 않는다.

   - 이를 해결하기 위해서 다음과 같이 코드를 한 줄 삽입하여 정렬을 하게 되면 아래의 두번째 예제 변형의 결과값처럼 차례대로

     인터페이스 정보를 출력할 수 있다.

  

 sortInt =  sorted(myInt,key=lambda intf: intf.name)

 

   ◆ 실행결과

 

 

○ OnPK 두 번째 예제 변형 -2

   - Description 이외에 추가적으로 필요한 정보는 OnePK 3번째 시간에서 얘기하였던, OnePK API에서 필요한 값을 찾아서,

    얼마든지 추가하여 정보를 알아낼 수 있다. 다음은 Interface의 상태가 Up/Down인지 확인한 내용까지 출력하였다.

 

   ◆ 실행결과

 

 

○ OnePK 세 번째 예제

   - OnePK 두 번째 예제처럼, Interface 정보를 가져올 수도 있지만, 실제 설정을 할 수 도 있다.

   - 다음은 Interface의 Description 정보를 변경한 간단한 예제이다. 

    

 

   - 위 코드의 실형결과를 보면, G0/6의 Interface의 Descritpion이 없다가 ex3.py를 실행하였을 때 설정이 되는 것을 확인하고

     다시 전체 인터페이스 정보를 출력해보면 G0/6에 정상적으로 Descritpion이 바뀐 것을 확인할 수 있다.

 

   ◆ 소스코드

         ※ 현재 포스팅된 Ex3의 예제는 결과값이 Sort를 다르게 써서, 조금 다릅니다. 변경 코드는 저녁에 이미지 교체 예정입니다

               이미지 교체 후에는 본 안내 메시지는 삭제할 예정입니다

 

   - NetwortInterface List 중에서 6번째(Index는 0부터 시작)의 Description을 set_description 메서드를 사용하여 변경합니다.

   - 변경 전/후로 Descritpion을 출력해서 결과를 확인합니다

 

 

◆ 이번 포스팅에서는 OnePK 2,3번째의 예제를 통해서 Network Element의 Interface에 대한 정보를 확인 및 설정하는 방법을

    알아 보았습니다.  2,3번 모두 기본 예제의 연장선상에 있으며 앞으로 다룰 예제들도 비슷할 것입니다

    결국 핵심은 예제가 아니라, 예제를 바탕으로 OnePK에서 제공하는 API를 잘 활용하는 방법과 아이디어가 될 것 같습니다.

 

 

Posted by 네떡지기
분류없음2014.12.16 01:17

   

 


이번 포스팅부터는 OnePK 예제를 다뤄봅니다.

본 포스팅의 예제는 원래 제목이기도 하지만, OnePK에서 지원하는 언어 중에 Python을 사용하여 진행하게 됩니다.

이번 포스팅에서는 예제를 하기 위한 다른 내용도 함께 들어가느라, 1개의 예제만 다루게 됩니다.


 

 

○ OnePK 첫 번째 예제

   - Network Element와 연결하여, 해당 Element의 정보를 가져오는 예제

 

 

  - 아래의 동영상과 같이 장비의 다양한 Element 정보를 가져올 수 있다.

 

 

  -  Source Code

 

 

  - Source Code를 보면, 매우 단순(?)합니다.

  - OnePK가 지원되는 Device와의 연결을 위해서 'IP address', 'username', 'password'가 필요로 하며,

    해당 정보를 가지고, 해당 Device에 대한 Handle을 갖는 Device라는 객체를 생성합니다.

  - 생성된 Device라는 객체에서 Connect() 메서드를 이용해서 해당 장비와 연결을 하게 됩니다.

  - 이후, elem이라는 Device의 Element 정보를 갖는 값을 이용해서 필요한 정보를 가져올 수 있게 됩니다.

  - 위의 코드만 보면, 내용을 정확히 몰라도 직관적으로 이해할 수 있을 정도로 단순합니다.

  - 제일 위에 import한 ZIGI_OnePK라는 Library를 이용해서 element에 대한 Device를 만들고 사용하는 데,

    ZIGI_OnePK는 OnePK를 사용하기 쉽게 도와주는 간단한 Library입니다.

  - 아래에서는 해당 Library에 대한 Code를 나타내고 있습니다.

 

 

 ZIGI-OnePK Library Source Code 

    - https://github.com/NetworkZIGI/OnePK

 

  - zigiElement 라는 Class와 PinningHandler라는 Class로 구성되어 있습니다.

  - zigiElement class에는 생성자 / tlsPinningConnect / Connect / DisConnet 메서드로 구성되어 있습니다.

  - OnePK 생성자에서는 접속하고자 하는 Device의 IP와 Username, Password, Pin File, Port를 입력하게 되어 있습니다.

  - OnePK는 Default로 15002를 사용하며, 다른 포트로 변경 가능합니다.

  - Pin File과 Pinning은 특정 Host가 WhiteList 기반의 TLS 인증을 하는 절차인데,

    Pin File은 Device에서 OnePK 설정을 하면 생성되는 Fingerprint 값과 Hash type, Device ID로 구성된 파일입니다.
    (실제 순서, Device ID, Hash type, Fingerprint)

    여기서는 TLS Pinning이라고 하는 TLS를 사용한 암호화 통신을 유지하며, 인증에 대한 부분만 Bypass하여 OnePK를 쉽게

    사용할 수 있는 방식으로 구성되어 있습니다.

  - 예제코드에서 다뤄지는 elem 변수는 OnePK API에서 제공되는 NetworkElement Class에 대한 객체이며,

    예제에서 다룬 속성 값들의 정보는 모두 NetworkElement Class에서 제공되는 속성 값이라고 볼 수 있습니다.

    즉, NetworkElement Class 내용을 보면 보다 많은 필요한 정보를 사용할 수 있습니다.

  - 이처럼 OnePK를 사용하기 위한 API 정보는 아래 그림과 같이 API 문서 페이지를 보면 모두 확인할 수 있습니다.

  - 초기 OnePK에서는 Vanilla TCP(일반적인 TCP 통신)를 사용하였으나,

    최신 OnePK(1.3), IOS (15.4)에서는 암호화되지 않은 통신은 Disable되고,  TLS를 사용하도록 하여 보안을 강화하였습니다.

 

 

 

 

   

 

○ OnePK Python API

https://developer.cisco.com/site/onepk/documents/api-reference/python/

 

 

 

 

 Device에서 OnePK 설정

 - OnePK 장비 설정       

ZIGI_DEVICE(config)# onep

ZIGI_DEVICE(config-onep)# transport type tls disable-remotecert-validation

 

 

 - OnePK 상태 확인

ZIGI_DEVICE#sh onep status
Status: enabled by: Config
Version: 1.2.1
Transport: tls; Status: running; Port: 15002; localcert: TP-self-signed-4294967295; client cert validation disabled
Certificate Fingerprint SHA1: 88DCF998 958884C2 1458D3A9 8637E244 A8A244E3
Transport: tipc; Status: disabled
Session Max Limit: 10
CPU Interval: 0 seconds
CPU Falling Threshold: 0%
CPU Rising Threshold: 0%
History Buffer: Enabled
History Buffer Purge: Oldest
History Buffer Size: 32768 bytes
History Syslog: Disabled
History Archived Session: 8
History Max Archive: 16
Trace buffer debugging level is info


Service Set: Base               State: Enabled     Version 1.2.1
Service Set: Vty                State: Disabled    Version 0.1.0
Service Set: Mediatrace         State: Disabled    Version 1.0.0

 

 

 - OnePK Session 상태 확인

ZIGI_DEVICE# sh onep session all
ID         Username State            ReconnectTimer ConnectTime                 ApplicationName
7075       zigi     Connected        0              Mon Dec 15 16:05:04.478     ZIGI-OnePK-APP

 

 

Posted by 네떡지기
분류없음2014.12.14 04:16

 


이번에는 Cisco OnePK에 대한 아주 간단한 소개와 앞으로 포스팅 하게 될 OnePK에 대한 예제 내용들입니다.

이번 포스팅에서는 OnePK로 할 수 있는 예제 결과에 대해서만 간략하게 보여드리고,

이후 포스팅부터는 OnePK에 대한 좀 더 기술적인 내용과 함께

이번 포스팅에 보여드린 예제에 대해서 코드와 함께 좀 더 자세히 살펴보도록 하겠습니다.

 


 

Cisco OnePK (Platform Kit)

 

 ○ OnePK 란?

     - Cisco Open Network Environment SDN 전략 요소

     - 개발/자동화/빠른 서비스 생성 등의 작업을 손쉽게 하게 도와주는 툴킷

     - 다양한 언어(C, Java, Python)를 사용할 수 있도록 API를 제공

     - API를 사용하여 비즈니스 요구에 따른 확장, 변경 등의 다양한 작업 가능.

 

 

 ※ Cisco OnePK Site : https://developer.cisco.com/site/onepk/index.gsp

 

 

 ○ OnePK를 사용한  예제 1

     - Network Element(Device)에 접속하여 다양한 속성값을 가져올 수 있다.

 

 

 

 ○ OnePK를 사용한  예제 2

     - Network Element(Device)의 정보를 가져와서 확인할 수 있다. 

- Network Element의 실제 Interface 정보 -

 

- OnePK를 사용하여, Interface 번호와 Description을 가져온 결과 -

 

 

 ○ OnePK를 사용한  예제 3

     - Network Element의 설정을 OnePK에서 제공하는 API를 통해서 변경 ( Interface Descpriton 변경)

 

 

 

 

 

 ○ OnePK를 사용한  예제 4

     - Network Element에 직접 CLI 명령을 통해서 정보 확인 및 Config 설정

 

- CLI 명령을 통해서, 현재 정보를 출력하고, Loopback Interface를 생성 후, 동일한 정보를 출력하여 확인 -

 

 

● Cisco OnePK에 대한 소개 정보는 솔라구구님 블로그를 참조하셔도 좋습니다.

   : http://sola99.tistory.com/208

 

 

Posted by 네떡지기
프로그래밍/Python2014.08.24 17:15

 

Last Updated 2014.08.26


Python for Networker의 이번 포스팅은 Cisco dCloud 의  Nexus 9000 : NX-OS Programmability v1에 있는 Python Script 예제 중의 하나를 다뤄봅니다.

 

이 Python Script는 Nexus에서 현재 원하는 정보를 Text 형태의 첨부파일로 만들어서, 메일로 전송을 하는 예제 Script 입니다.

 

다음과 같이 bootflash://script 디렉토리에서 예제 Script를 실행합니다.

 

 

dcloud-n9k#  python ./n9k_serviceability.py 수신메일주소

 

 

 

 

Script를 실행하게 되면, 어떤 종류의 정보를 수집할 것인지에 대해서 물어보게 됩니다.

 

여기서 원하는 정보의 종류를 선택하면, Nexus에서 해당 정보를 수집하여, 수신하고자 하는 Email 주소로 발송을 하게 됩니다.

 

실제 메일이 제대로 발송이 되었는지 확인을 해보면, 아래와 같이 제 메일 계정으로  메일이 수신되었음을 확인할 수 있습니다.

 

Cisco dCloud의 Nexus 9000에서의 예제 Script이기는 하지만,

어차피 기존 포스팅에서도 다뤘듯이 Nexus에서만 가능한 부분은 아닙니다.

 

그럼 유사한 기능을 기존 포스팅에서 언급했던, Arista vEOS에서 유사한 Script로 만들어서 테스트 해보겠습니다.

 

Arista VM을 실행하여, vEOS에서 mail.py 이라는 예제 Script를 만들었습니다.

 

그리고 아래와 같이 해당 Script를 실행해봅니다.

 

 

이 예제에서는 특정 정보를 가공해서 메일을 발송할 수 있다는 점에 대해서 보여주는 것이기 때문에

복잡하게 구현하지는 않았고, 단순하게 현재 vEOS의 version 정보를 확인하여, 첨부파일로 전송을 하는 역할을 합니다.

 

위와 같이 해당 Script를 실행하게 되면, vEOS의 version 정보를 Text 형태의 첨부 파일로 가공을 하게 되고, 메일을 보내게 됩니다.

(참고로 Arista VM에서 bash shell mode에서 python script를 실행 중인 모습입니다.)

 

자 이제, 메일이 잘 도착했는지 메일함을 확인해보겠습니다.

(위의 예제에서는 별도로 뒤에 수신자 email 주소를 쓰지 않았지만 Nexus에서와 마찬가지로 실행 시 수신하고자 하는 email주소를 쓰게 되면,  해당 email로 전송도 물론 가능합니다.)

 

 

 메일함을 보면,  정상적으로 메일이 잘 수신된 것을 확인할 수 있습니다.

 첨부파일을 열어보게 되면, show version으로 확인된 정보를 볼 수 있습니다.

 

 이번 포스팅에서는 별도의 기술적인 내용은 배제하였습니다.

 

  다만, Python을 이용하여 어떤 것들이 가능한지에 대해서 Cisco dCloud에서의 보여주는 예제를 확인해보고

 또한 그러한 예제들이 단순히 특정 벤더에서만 실행되는 것이 아니라 Python을 지원하는 어떤 장비에서도 유연하게 사용할 수 있다는 것을

 확인해보는 것이 이번 포스팅에서 말하고자 하는 부분입니다.

 

  물론 Script 상에 들어가는 각 벤더에서 제공하는 모듈들은 유사한 기능을 하는 각 벤더의 모듈을 가져다 쓰기는 해야겠지만,

 기본적인 프로그램 상의 로직이나 코드는 모두 재활용이 가능합니다. 

 

  또한 기존에 있는 코드에서 추가적인 기능들을 얼마든지 필요에 의해서 추가도 가능하게 될 것입니다. 

 

 그럼 다음 포스팅에서 다시 찾아뵙겠습니다.

 

 


Nexus 5000에서도 테스팅 추가 완료하였습니다.

 

아래와 같이 Nexus 5000에서 mail.py 이라는 Script를 만들었습니다.

기본적인 코드는 위에서 사용했던 코드와 거의 유사하며, 실제 장비에 Cli 모드의 명령하는 부분과 결과값을 가공하는 부분만

다르게 되어 있습니다. Script의 내용은 기존과 마찬가지로 show version으로 나오는 결과값을 메일로 발송하도록 되어 있습니다.

 

 

위와 같이 정상적으로 코드가 실행된 것을 확인할 수 있습니다.

 

 

 Nexus에서 메일을 발송한 이후에, 메일함을 살펴보면

정상적으로 메일과 첨부파일이 도착한 것을 볼 수 있습니다.

 

이것으로 Nexus 9000 / 5000 , Arista vEOS에서 모두 메일 발송하는 Python Script를 살펴보았습니다.

전체적으로 변경된 부분은 단지 장비에 대한 상태를 확인하기 위한 명령어를 입력하고, 해당 결과값을 가공하는 부분만 다르고

나머지 부분은 모두 동일하다고 보시면 됩니다.

 

앞으로는 정말 코드를 처음부터 짤 수는 없더라고, 기존 코드를 이해하고 수정할 수 있을정도로 알아두어야만(?) 할 것 같습니다.

 

 

 

Posted by 네떡지기
프로그래밍/Python2014.08.18 17:42

 


10번째 Python for Networker 포스팅입니다.

이번 포스팅에서 Cisco Nexus의 7000과 5000에서 공통으로 사용이 가능하도록 기존에 만들었던 ipinfo.py 모듈을 변경해봅니다.

장비별로 개개의 코드를 작성해서 수행하는 것보다는 장비에서 공통으로 호환성있게 사용 가능한 코드를 만드는 것이 향후 코드에 대한

유지보수 측면에서 더욱 유리할 것 이기 때문에 유심있게 봐두면 좋을 듯 싶습니다.

 

Git에서 Code 보기

  - einfo.py : https://github.com/NetworkZIGI/Python_for_Network/blob/master/eipinfo.py

  - vCheck.py : https://github.com/NetworkZIGI/Python_for_Network/blob/master/vCheck.py

 


 

 

Nexus 7000와 Nexus 5000에서 지원하는 Python의 경우에는 각각 지원되는 방식이 다르다.

 

실제 Cisco에서 제공되는 Python의 Cisco Module을 확인해 보면 아래와 같이 내장된 Member가 서로 다른 것을 확인할 수 있다.

 

◇ Nexus 7K Cisco Module

 

__doc__

__name__

__package__

cli

cli_execution_error

clil_syntax_error

clid

clip

set_vrf

 

 

◇ Nexus 5K Cisco Module

 

BGPSession

Routes

check_port_discards

line_parser

show_run

BufferDepthMonitor

SectionParser

cisco_secret

mac_address_table

ssh

CLI

VRF

cisco_socket

md5sum

tacacs

CheckPortDiscards

Vlan

cli

msdp

telnet

CiscoSecret

__all__

dhcp

ospf

transfer

CiscoSocket

__builtins__

eigrp

ospfv3

udld

Feature

__doc__

feature

pim

vlan

History

__file__

get_global_vrf

private-vlan

vpc

IPv4ACL

__name__

get_valid_port

ptp

vrf

IPv6ACL

__package__

history

rip

vrrp

Interface

__path__

hsrp

routes

vtp

Key

acl

interface

scheduler

 

LineParser

bfd

interface-vlan

section_parser

 

MacAddressTable

bgp

key

set_global_vrf

 

OSPFSession

buffer_depth_monitor

lacp

show_queues

 

 

 

서로 지원되는 Cisco Module이 다르기 때문에, 관리자가 Module을 새롭게 만들 경우에는 이러한 점이 고려되어야 합니다.

물론 Cisco Module을 사용하지 않고 만든 Python Module은 상관이 없겠지만, Cisco Module을 Import하여 만든 Python Module은

각 Nexus 별로 지원되는 내용과 결과값이 다르기 때문에 별개의 코드로 만들어야 하는 경우가 발생하게 됩니다.

 

기존 Python for Networker : Part 6 에서 다뤄졌던, IP를 가지고 해당 IP의 정보(IP / Mac  / VLAN / Interface / Description)를 보는

ipinfo.py의 경우에도 대부분의 코드가 비슷하지만, Cisco Module이 사용된 부분에 대해서는 내용이 달라지게 됩니다.

 

가령 Nexus 7K의 경우에는 Cisco Cli 명령을 수행하기 위해서 cisco.cli 메서드를 사용하여 결과를 수행하면 str(문자열) 값으로

결과값을 가져옵니다. 반면에 Nexus 5K의 경우에는 cisco.CLI 메서드르 사용하고 이러한 결과값은 tuple 형태로 결과를 가져옵니다.

 

이처럼 cisco에서 제공하는 Module이 서로 다르게 처리되다 보니, 각 Module을 만들고자 할 때에는 각각의 Module에서 사용되는

cisco Module을 고려하여 만들어야 합니다.

 

그렇다면, Nexus 7K와 Nexus 5K에서 공통으로 사용할 수 있는 코드를 만들 수는 없을까요?.... 물론 가능합니다.

 

먼저 아래의 예제 코드를 살펴보면..

 

 

vCheck.py : Nexus 7000/5000 구분하는 예제 코드

import sys
N7K = 'Nexus7000'
N5K = 'Nexus5000'
#N3K = 'Nexus3000'     : Constant for Extension.

NexusVersion = ''

def NexusVersionCheck():
    global NexusVersion
    sysPathList = sys.path
    for pathItem in sysPathList:
        if(pathItem=='/bootflash/scripts'):
            NexusVersion = N7K
            break
    else:
        NexusVersion = N5K

 

위의 예제 코드는 코드가 실행되는 장비가 Nexus 7000인지, 5000인지 확인하는 코드입니다.

원리는 무척이나 단순합니다.

 

각 장비의 path 정보값을 가져와서 확인을 하는 데, Nexus 7000에서는 기존 포스팅에서 다뤘던 것처럼

bootflash/scripts 에 Python Module이 들어가게 됩니다. 그리고 이 Path 정보는 Nexus 7000에만 있습니다.

(물론 제가 Testing이 가능한 장비가 Nexus 7000과 5000밖에 없기 때문에, 다른 장비에서는 어떻게 달라질지 그리고 그경우에는

 어떠한 방법으로 다시 구분을 할지는 달라지게 됩니다. 단지 장비별로 이렇게 특정값을 확인하여 어떤 장비인지 확인할 수 있는지에

 대한 부분을 확인하는 Module을 만든다면, 현재 해당 Module이 실행되는 장비가 어떤 장비인지 확인 할 수 있습니다.)

 

이러한 구분 정보를 통하여 현재 동작하고 있는 Module의 장비 값을 Global 변수에 저장할 수 있습니다.

그러면, 실제 특정 기능을 수행하는 Module에서는 위의 정보를 바탕으로 필요한 Cisco Module을 사용하여 처리할 수 있습니다.

 

위의 Nexus Version을 체크하는 Module을 바탕으로, 기존에 작성하였던 ipinfo.py를 Nexus 7000과 5000에서 모두 동작하게 하는

공통 Module로 아래와 같이 작성할 수 있습니다.

 

 

eipinfo.py

#!/bin/env python
import argparse
import sys
import cisco
import vCheck
from vCheck import NexusVersionCheck


IP = 'IP-Address'
MAC = 'Mac-Address'
Vlan = 'Vlan'
Intf = 'Interface'
Desc = 'Description'


IP_info = {IP:'None', MAC:'None', Vlan:'None', Intf:'None', Desc:'None'}

 

def get_ARP_Table(ipaddr):
    arpCmd = 'sh ip arp ' + ipaddr
    arpCmdResultList = [] 
    if(vCheck.NexusVersion==vCheck.N7K):
        arpCmdResult = cisco.cli(arpCmd)
        arpCmdResultList = arpCmdResult.split('\n')
    elif(vCheck.NexusVersion==vCheck.N5K):
        arpCmdResult = cisco.CLI(arpCmd, False)
        arpCmdResultList = arpCmdResult.get_output()

    for arp in arpCmdResultList:
        if (-1<arp.find(args.ip)):
            return arp
    else:
        print ' %s : Not found IP Address Infomation' % args.ip
        sys.exit()

 

def get_IP_MAC_info(info):
    info_list = info.split()
    IP_info[IP] = info_list[0]
    IP_info[MAC] = info_list[2]
    IP_info[Vlan] = info_list[3][4:]

 

def get_Interface_info():
    macCmd = 'sh mac address-table addr ' + IP_info[MAC]
    macCmdResultList = [] 

    if(vCheck.NexusVersion==vCheck.N7K):
        macCmdResult = cisco.cli(macCmd)
        macCmdResultList = macCmdResult.split('\n')
    elif(vCheck.NexusVersion==vCheck.N5K):
        macCmdResult = cisco.CLI(macCmd, False)
        macCmdResultList = macCmdResult.get_output()

 

    for infInfo in macCmdResultList:
        idx = infInfo.find(IP_info[MAC])
        if(-1<idx):
            IP_info[Intf] = infInfo[58:]
            get_Description_info(IP_info[Intf])
            break


def get_Description_info(iInfo):
    if(iInfo.find('Eth') == 0 or iInfo.find('Po')==0):
        intCmd = 'sh int desc | inc ' + iInfo
        if(vCheck.NexusVersion==vCheck.N7K):
            intCmdResult = cisco.cli(intCmd)
            intCmdResultList = intCmdResult.split('\n')
            if(intCmdResult != ''):
                IP_info[Desc] = intCmdResultList[0][25:].strip()
        elif(vCheck.NexusVersion==vCheck.N5K):
            intCmdResult = cisco.CLI(intCmd, False)
            intCmdResultList = intCmdResult.get_output()
            if(intCmdResult != ''):
                IP_info[Desc] = intCmdResultList[0][25:].strip()

 

def show_IP_info():
    print '==================================='
    print '      enhanced IP Info : NetworkZIGI                 '
    print '==================================='
    print '%-15s : %s' % (IP,IP_info[IP])
    print '%-15s : %s' % (MAC,IP_info[MAC])
    print '%-15s : %s' % (Vlan, IP_info[Vlan])
    print '%-15s : %s' % (Intf, IP_info[Intf])
    print '%-15s : %s' % (Desc,IP_info[Desc])

 

NexusVersionCheck()
parser = argparse.ArgumentParser('Args',description='Args Desc')
parser.add_argument('ip')
args = parser.parse_args()
iparp = get_ARP_Table(args.ip)
get_IP_MAC_info(iparp)
get_Interface_info()
show_IP_info()

 

 

위의 Code 중에서 파란색으로 표기된 부분이 Nexus 7K와 5K를 구분하기 위한 부분입니다.

 

 그럼 이제 위의 1개의 코드로 Nexus 7000과 Nexus 5000에서 별도의 코드를 각각 사용하는 것이 아닌, 하나의 동일한 코드로

원하는 결과값을 같이 얻을 수 있게 되었습니다.

 

 이번 Part에서 다뤄진 부분은 제가 Test가 가능한 장비를 기준으로 두 장비에 대해서 단순한 방법으로 구분을 지었습니다.

하지만, Nexus 의 다른 시리즈의 경우에는 또 지원되는 부분이 다르기 때문에 그러한 부분까지 수용하기 위해서는 장비를 구분하는

vCheck 모듈의 수정이 필요하게 될 것입니다.

 

 여기서 세부적인 장비 구분을 체크하는 실제적인 내용보다는, 그러한 장비 구분을 통해서 실제 수행을 원하는 내용의 코드를 장비 개별

코드가 아니라, 하나의 공통 코드로 만들어서 사용할 수 있다는 것이 다루고자 하는 내용이었습니다.  

 

 그러한 부분을 잘 활용하게 된다면, 하나의 코드로 다른 버전의 장비에서도 호환이 되는 코드를 작성할 수 있을 것입니다.

 

물론 아예 처음부터 지원되는 cisco module이 동일하다면, 이러한 부분을 별도로 고려하지 않을 수 있겠지만

그러한 부분도 고려한 코드를 작성하는 것도 현재 시점에서는 또 하나의 몫이 아닐까 생각을 해봅니다.

Posted by 네떡지기
프로그래밍/Python2014.08.13 12:20

이번 포스팅은 별도의 Part은 아니고~ 추가 포스팅입니다.

지난 Part 6에서 다뤄진 내용에 대해서 Nexus 7K용으로 변경한 코드입니다.

꼭 바꿔야하는 부분을 제외하고.. 약간 추가적으로 내용 업데이트도 함께 했습니다. (그 부분은 5K도 공통사항이긴합니다..)

Nexus 7K로 변경해야 할 때, 어디를 바꿔야 하는지 문의하시는 분이 계셔서 수정해서 올려드립니다.
지난 번에 생각했던 것보다 조금 더 수정해야 하는 부분이 있어서. ^^;

포스팅으로 대체했습니다.

 

Python for Networker : Part 6 보기

 

Github에서 보기 

 


 

 

 

 ○ IP Info - Nexus 7000

 __author__ = 'Network ZIGI - Ko Jae Sung'

 #!/bin/env python
import argparse
import sys 
import cisco 
IP = 'IP-Address' 
MAC = 'Mac-Address' 
Vlan = 'Vlan' 
Intf = 'Interface' 
Desc = 'Description' 
IP_info = {IP:'None', MAC:'None', Vlan:'None', Intf:'None', Desc:'None'} 

def get_ARP_Table(ipaddr): 
    arpCmd = 'sh ip arp ' + ipaddr 
    arpCmdResult = cisco.cli(arpCmd) 
    arpCmdResultList = arpCmdResult.split('\n') 
    for arp in arpCmdResultList: 
        if (-1<arp.find(args.ip)):   
            return arp           
    else: 
        print ' %s : Not found IP Address Infomation' % args.ip  
        sys.exit() 

def get_IP_MAC_info(info): 
    info_list = info.split()          
    IP_info[IP] = info_list[0]        
    IP_info[MAC] = info_list[2]          
    IP_info[Vlan] = info_list[3][4:]    
                                     
def get_Interface_info(): 
    macCmd = 'sh mac address-table addr ' + IP_info[MAC] 
    macCmdResult = cisco.cli(macCmd) 
    macCmdResultList = macCmdResult.split('\n') 
 
    for infInfo in macCmdResultList: 
        idx = infInfo.find(IP_info[MAC]) 
        if(-1<idx): 
            IP_info[Intf] = infInfo[58:] 
            get_Description_info(IP_info[Intf]) 
            break 


def get_Description_info(iInfo): 
    if(iInfo.find('Eth') == 0 or iInfo.find('Po')==0):  
        intCmd = 'sh int desc | inc ' + iInfo 
        intCmdResult = cisco.cli(intCmd) 
        if(intCmdResult != ''): 
            intCmdResultList = intCmdResult.split('\n') 
            IP_info[Desc] = intCmdResultList[0][25:].strip() 

def show_IP_info(): 
    print '================================================' 
    print '             IP Info : NetworkZIGI              ' 
    print '================================================' 
    print '%-15s : %s' % (IP,IP_info[IP]) 
    print '%-15s : %s' % (MAC,IP_info[MAC]) 
    print '%-15s : %s' % (Vlan, IP_info[Vlan]) 
    print '%-15s : %s' % (Intf, IP_info[Intf]) 
    print '%-15s : %s' % (Desc,IP_info[Desc]) 

parser = argparse.ArgumentParser('Args',description='Args Desc') 
parser.add_argument('ip') 
args = parser.parse_args() 

iparp = get_ARP_Table(args.ip) 
get_IP_MAC_info(iparp) 
get_Interface_info() 
show_IP_info() 

 

 

Posted by 네떡지기
분류없음2014.07.31 23:51

 


벌써 9번째 포스팅에 접어들었네요. ^^;

 

이번 포스팅은 직접 장비가 없어도 해보실 수 있는 VM을 이용하여 실습을 할 수 있도록 하는 환경을 꾸미는 내용입니다.

 

바로 ARISTA의 vEOS를 VMWARE 환경에서 사용할 수 있도록 만들어 보겠습니다.

 

이번 포스팅에서 1대의 가상 머신을 설치해보지만, 여러대의 VM을 띄워서 네트워크 구성도 물론 가능합니다!

 

 

NetworkZIGI Python Git : https://github.com/NetworkZIGI/Python_for_Network

 


 

 

먼저 Arista의 vEOS를 사용하기 위해서, vEOS 이미지를 구하셔야 합니다.

vEOS 이미지는 Arista 홈페이지를 가면, 아래와 같이 vEOS를 다운 받으실 수 있습니다. 
물론 다운을 받기 위해서 가입을 하셔야 합니다. (단, 별도의 파트너 계정일 필요는 없이 회원 가입만으로 다운이 가능합니다.)

 

그리고 버전이 여러개가 있는데,

 

    F 버전 : 기능이 추가된 버전

    M버전 : 안정화된 버전

 

이라고 볼 수 있습니다.

 

 

버전 한가지를 골라서, 해당 버전의 모든 파일과 ISO 파일을 모두 다운 받습니다.

 

다운을 받는데는 시간이 조금 걸리기 때문에, 다운 시켜놓고~ 잠시 네떡지기의 블로그에서 다른 포스팅도 봐주시면 감사하겠습니다.

 

....

 

자 모든 파일이 다운이 끝났으면, 이제부터 환경을 만들어 보겠습니다.

전 과정(?)을 모두 캡춰를 떴으니~ 사진만 보고 따라가셔도 충분히 손쉽게 구축할 수 있습니다.

 

 

Custom 모드를 선택해서 시작합니다.

 

그냥 Next를 하시면 됩니다. ^^

 

아까 홈페이지에서 다운 받은

Aboot-veos-2.0.8.iso

로 지정하시면 됩니다!

 

Linux로 선택하시고, inOther Linux 2.6x 로 선택 하시면  됩니다.

 

 

 

 

적당하게, Virtual Machine Name을 주고, 위치를 지정합니다.

 

Next 클릭! (CPU 1)

 

2048MB 로 지정하시고, Next 선택

 

전 Host-only networking을 했습니다.

 

Next 클릭! (LSI Logic)

  

IDE로 지정하시고, Next 선택

 

 

Disk는 Existing Disk로 지정하시고,

Arista 홈페이지에서 다운받은 이미지 파일(vEOS-4.13.7M.vmdk)을 지정합니다.

Next 선택합니다.

 

모두 끝습니다.

Finish를 선택하시면 됩니다.

 

자, 이제 가상머신을 구동시킵니다!

 

위와 같이 vEOS가 부팅되는 것을 볼 수 있습니다.

 

부팅이 완료되면, 로그인 창이 뜹니다.

기본 계정은 'admin'으로 하시고, 별도의 비밀번호는 없습니다.

 

 

자, 이제 모든 환경이 갖춰졌으니 Python Shell을 띄워서 간단하게 Print까지 한 줄 해보았습니다.

 

이제부터는 집에 있는 컴퓨터로도 실습까지 해 볼 수 있는 멋진 환경을 구축하시게 되었습니다.

 

이번 포스팅은 이만 줄이고~ 다음 포스팅에서 다시 또 조만간 뵙도록 하겠습니다.

Posted by 네떡지기
프로그래밍/Python2014.07.28 12:59

 

Last Updated : 2014.07.30


 

이번 포스팅은 Nexus 7000 시리즈에서 Python Script를 실행하기 위한 방법입니다.

 

Nexus 버전별로 지원되는 부분이 조금씩 다른 듯 싶은데..    (물론 제가 모든 장비를 해 볼 수 있는 환경이 아니어서요... )

 

Nexus 5000의 경우에는 바로 Python 명령을 사용하여 기존의 만들어진 Python 모듈을 실행할 수 있지만,

 

Nexus 7000에서는 Python 명령을 치고 '?'를 치면...   아래와 같이 Python Shell로 들어가는 것 밖에 되지 않습니다.

 

 

 

Nexus 7000

Nexus 5000

N7K# python ?
  <CR>  

N5K# python ?
  <CR>       
  bootflash:  The file to run

 

그럼 과연 실행은 어떻게 할까요?

바로 source 명령어로 실행을 하게 됩니다.

그런데, 이 때 Source 명령으로 실행하기 위해 'Hello.py'를

 

print 'Hello ZIGI'

 

라는 한 줄짜리 코드를 작성해서 실행하려고 보면, 실행이 되지 않습니다.

그럼 source라는 명령을 치고 ? 를 쳐봅니다.

그럼 아래와 같이 출력이 됩니다.

 

 

Source 명령

NX-OS# source ?
  background (no abbrev)         Run the script in the background, see also 'show background' and 'kill background'
  build_cmd_script.py               No help
  build_cmd_script_from_file.py  No help
  cgrep                                Grep for something in stdin (-> use behind pipe) and display its 'context' \

                                         (determined by indentation, like in 'show run')
  check_sys_st_op_consist.py     No help
  cmn_file_util.py                    No help
  copy-sys (no abbrev)            Copy the system provided example scripts of /sys to bootflash:scripts
  def_cmd_script.tmp               No help
  elame.tcl                            No help
  gen_sys_st_op.py                  No help
  logw.py                              No help
  poap.py                             Loads system/kickstart images and config file for POAP
  show-version                      A succinct 'show version' -- mixes in stuff from 'show version build-info / internal build'
  sys/                                  Directory
  systemcheck.py                   No help
  systemcheck.pyc                 No help
  update_cmd_script.py           No help

 

Hello.py 라는 파일이 없습니다.

 

이유인 즉,

 

The bootflash:scripts directory is the default script directory. All scripts must be stored in the bootflash:scripts directory or in a subdirectory of it.

 

바로 bootflash 안에 scripts 폴더에 넣어야 합니다. 바로 위에 보이는 저 항목들도 모두 Scripts 폴더에 있기 때문이지요.

물론 Scripts 하위 폴더에 저장을 해도 상관은 없습니다. 경로만 지정한다면..

그럼 scripts 폴더에 다음 "hello.py"를 아래와 같이

 

print 'Hello ZIGI'

 

를 다시 만들어 실행해봅니다.

 

NX-OS# source hello.py
Error: language not supported

 

그럼 위와 같이 다시 또 실행이 되지 않습니다.

 

그 이유는.

 

You can run a tcl script instead of a Python script by inserting #!/bin/env tclsh before the first line in the example and replacing all occurrences of the Python

 

Python script 제일 상단에  "#!/bin/env python"  을 추가해줘야 합니다.

  

 

bootflash://scripts/hello.py

#!/bin/env python

print "Hello ZIGI"

※ 스크립트가 #!로 시작하는 경우, 스크립트를 해석하여 실행할 프로그램 의 경로명이 된다.

 

자, 이제 다시 실행을 해보겠습니다.

 

 

bootflash://scripts/hello.py : 실행

NX-OS# source hello.py

Hello ZIGI

NX-OS#

 

위와 같이 Python Script를 실행할 수 있는 걸 볼 수 있습니다.

 

그럼 기존에 포스팅했던 Script도 실행할 수 있습니다.

 

 

bootflash://scripts/hello.py : 실행

NX-OS# source ipinfo.py 10.10.10.100
================================================
             IP Info : NetworkZIGI             
================================================
IP-Address      : 10.10.10.100

Mac-Address   : 0080.9867.123B
Vlan              : 11
Interface       : Ethernet 1/1
Description     : ZIGI-WebServer

 

단, 코드를 약간 수정해주셔야 합니다.

왜냐하면, Cisco Nexus에서도 장비 버전별로 지원되는 패키지가 다르기 때문이지요.

Nexus 5000에서 사용한 cisco.CLI() 라는 메서드 대신에, cisco.cli(), cisco.clip(), cisco.clid()가 있습니다.

 

저는 cisco.cli() 메서드를 이용해서 위와 같이 만들었습니다.

어떻게 변형해야 하는지는 간단한 숙제로 남겨드리겠습니다. ^^

 

 

  

Posted by 네떡지기

티스토리 툴바