DevOps/Programmability2018.03.30 13:46
 

안녕하세요.

이번 포스팅은 현재 제가 운영진으로 활동 중인 [네트워크 전문가 따라잡기] 커뮤니티의 

'제 24회 네트워크 전문가 따라잡기 "N.EX.T" (정기기술세미나)' 에서 진행한 세션의 발표 자료입니다. 

발표 자료는 첨부하였으며, 슬라이드를 바로 보실 수 있게 사진으로도 첨부합니다.

다만, 첨부 가능한 사진이 한계가 있어서 슬라이드는 2개의 포스팅으로 나눠서 합니다. (2번째 포스팅입니다.)

[첫번째 포스팅]

 

 

Posted by 네떡지기
DevOps/Programmability2018.03.30 13:43

안녕하세요.

이번 포스팅은 현재 제가 운영진으로 활동 중인 [네트워크 전문가 따라잡기] 커뮤니티의 

'제 24회 네트워크 전문가 따라잡기 "N.EX.T" (정기기술세미나)' 에서 진행한 세션의 발표 자료입니다. 

Session2.네트워크엔지니어를위한Python101.pdf

발표 자료는 첨부하였으며, 슬라이드를 바로 보실 수 있게 사진으로도 첨부합니다.

다만, 첨부 가능한 사진이 한계가 있어서 슬라이드는 2개의 포스팅으로 나눠서 합니다.

[두번째 포스팅]

 

Posted by 네떡지기
DevOps/Programmability2018.03.30 13:30

안녕하세요.

이번 포스팅은 현재 제가 운영진으로 활동 중인 [네트워크 전문가 따라잡기] 커뮤니티의 

'제 24회 네트워크 전문가 따라잡기 "N.EX.T" (정기기술세미나)' 에서 제가 진행한 세션과 관련된 내용입니다.

이번 행사에서는  [예제로 보는 '네트워크 엔지니어를 위한 Python 101'] 이라는 주제로 세션을 하였고

세션 시간에 사용된 간단한 예제에 대해서 코드를 공유합니다.

코드에 대한 내용은 세션 시간에 다루었기 때문에 자세한 설명은 생략합니다.

그리고 본 예제에 사용된 코드는 완성형 코드는 아닙니다.

우선 대표적인 예가 예외처리가 전혀 없습니다. (기본 라이브러리에서 제공되는 부분 제외)

아래의 코드들은 처음 접근을 어렵게 생각하시는 분들을 위해서 최대한 쉽게 접근할 수 있을 정도로 짧게 짧게 만들었으며

이후에 아래의 코드들을 조금씩 변형해가면서 본인만의 코드를 만들어보면 좋을 것 같습니다.

 

예제 1) 장비 접속 및 기본 명령어 수행 및 실행

from netmiko import ConnectHandler

arista= {
    'device_type': 'arista_eos',
    'ip':   'device',
    'username': 'admin',
    'password': 'admin',
    'port' : 2222,          # 기본 값이 22포트를 사용할 경우에는 사용하지 않아도 무방


net_connect = ConnectHandler(**arista)

output = net_connect.send_command('show int desc')
print(output)

 ○ 세션 시에 IP를 숨기기 위해서 'device'라는 이름으로 사용을 하였으며, 실제로는 해당 위치에 IP가 들어가면 됩니다

   단,IP 값은 문자열이기 때문에 ' ' 혹은 " "를 사용해야 합니다.

   문자열이기 때문에 도메인 값으로 대체해도 무방합니다

 

예제 2-1) 장비 접속 및 기본 명령어 수행 및 실행

from netmiko import ConnectHandler
import device

print("Connecting....")
nwnode = ConnectHandler(**device.ARI)
shver = nwnode.send_command("show ver")
print(shver)

예제 2-2) 장비 접속 및 기본 명령어 수행 및 실행  (device.py)

ariuser='admin'
aripwd='admin'
dv='arista_eos'

ARI={'device_type':dv,'verbose':False,'username':ariuser,'password':aripwd,'ip':'device','port':2222} 

 ○ 장비 인벤토리 정보를 기능을 수행할 코드와 별도로 분리한 예제입니다.

    예제 1과 동일하지만, 단순히 인벤토리를 분리한 내용입니다

    인벤토리 정보는 py코드를 사용할 수도 있지만, 별도의 파일로 관리해서 관리도 가능할 수 있습니다.

 

예제 3-1) 장비 인터페이스 상태 출력  

shstatus ='''
Port    Name               Status       Vlan       Duplex Speed Type
Fa1/0   ZIGI-SVR0          notconnect   1            auto    auto 10/100BaseTX
Fa1/1   ZIGI-SVR1          notconnect   1            auto    auto 10/100BaseTX
Fa1/2   ZIGI-SVR2          notconnect   1            auto    auto 10/100BaseTX
Fa1/3   ZIGI-SVR3          connected   1            auto    auto 10/100BaseTX
Fa1/4   ZIGI-SVR4          notconnect   1            auto    auto 10/100BaseTX
Fa1/5   ZIGI-SVR5          notconnect   1            auto    auto 10/100BaseTX
Fa1/6   ZIGI-SVR6          connected   1            auto    auto 10/100BaseTX
Fa1/7   ZIGI-SVR7          notconnect   1            auto    auto 10/100BaseTX
Fa1/8   ZIGI-SVR8          notconnect   1            auto    auto 10/100BaseTX
Fa1/9   ZIGI-SVR9          notconnect   1            auto    auto 10/100BaseTX
Fa1/10  ZIGI-SVR10         connected   1            auto    auto 10/100BaseTX
Fa1/11  ZIGI-SVR11         notconnect   1            auto    auto 10/100BaseTX
Fa1/12  ZIGI-SVR12         notconnect   1            auto    auto 10/100BaseTX
Fa1/13  ZIGI-SVR13         notconnect   1            auto    auto 10/100BaseTX
Fa1/14  ZIGI-SVR14         notconnect   1            auto    auto 10/100BaseTX
Fa1/15  ZIGI-SVR15         notconnect   1            auto    auto 10/100BaseTX

'''

status = shstatus.split('\n')

for op in status:
    print(op)
 

○ 장비 인터페이스 정보를 출력하는 예제입니다.  

   이번 예제는 실제 장비를 접속한 것이 아니라, 장비에 접속하여 인터페이스 정보 가져온 내용을 출력하는 부분입니다.

   장비 정보를 가져오게 되면, 하나의 길 문자열로 되어 있는 데 이를 가공하는 방법에 대한 예제이며

   이 예제에서는 결과 값을 각 Line 단위로 쪼개는 함수(split)를 사용하여 정보 Line 단위로 저장하고

   저장된 값을 하나씩 가져와서 출력합니다.

 

예제 3-2) 장비 인터페이스 상태 출력 

shstatus ='''
Port    Name               Status       Vlan       Duplex Speed Type
Fa1/0   ZIGI-SVR0          notconnect   1            auto    auto 10/100BaseTX
Fa1/1   ZIGI-SVR1          notconnect   1            auto    auto 10/100BaseTX
Fa1/2   ZIGI-SVR2          notconnect   1            auto    auto 10/100BaseTX
Fa1/3   ZIGI-SVR3          connected   1            auto    auto 10/100BaseTX
Fa1/4   ZIGI-SVR4          notconnect   1            auto    auto 10/100BaseTX
Fa1/5   ZIGI-SVR5          notconnect   1            auto    auto 10/100BaseTX
Fa1/6   ZIGI-SVR6          connected   1            auto    auto 10/100BaseTX
Fa1/7   ZIGI-SVR7          notconnect   1            auto    auto 10/100BaseTX
Fa1/8   ZIGI-SVR8          notconnect   1            auto    auto 10/100BaseTX
Fa1/9   ZIGI-SVR9          notconnect   1            auto    auto 10/100BaseTX
Fa1/10  ZIGI-SVR10         connected   1            auto    auto 10/100BaseTX
Fa1/11  ZIGI-SVR11         notconnect   1            auto    auto 10/100BaseTX
Fa1/12  ZIGI-SVR12         notconnect   1            auto    auto 10/100BaseTX
Fa1/13  ZIGI-SVR13         notconnect   1            auto    auto 10/100BaseTX
Fa1/14  ZIGI-SVR14         notconnect   1            auto    auto 10/100BaseTX
Fa1/15  ZIGI-SVR15         notconnect   1            auto    auto 10/100BaseTX

'''

status = shstatus.split('\n')

for op in status:
    if(op.find('connected') > 0):
        print(op.split()[0]) 

○ 장비 인터페이스 정보를 출력하는 예제의 변형입니다.

    각 Line별로 가져온 값에서 현재 연결된 인터페이스 정보만을 출력하기 위해서 'connected'라는 값을 찾아서

    'connected'된 인터페이스만을 출력합니다.

 

 

 

예제 4-1) 장비 Uptime 출력 

shverinc = "zigi-r1 uptime is 2 hours, 27 minutes"
uptime = shverinc.split(" uptime is ")
print(uptime)

 

예제 4-2) 장비 Uptime 출력 

shverinc = "zigi-r1 uptime is 2 hours, 27 minutes"

uptime = shverinc.split(" uptime is ")
print("Device Host : {0}\t\tUptime : {1}".format(uptime[0],uptime[1]))

 ○ 장비 Uptime을 출력하는 예제입니다.

    출력된 값은 기본적으로 가져온 값을 어느 정도 수준까지 가공해서 사용할 것인지에 대한 부분입니다.

 

예제 5) 장비 Mac-address 정보 출력

shmac = '''VDX# show mac-address-table
VlanId   Mac-address       Type     State        Ports
41       0000.0000.fe00    Dynamic  Active       Te 1/5/1
41       0000.0000.fe01    Dynamic  Remote       Te 2/5/1
41       001c.7f63.950f    Dynamic  Active       Te 1/5/1
41       02e0.52b2.f50d    System   Active       XX 1/X/X
41       c4f5.7c18.3962    System   Remote       XX 2/X/X
43       0000.0000.fe00    Dynamic  Active       Po 3
43       0000.0000.fe01    Dynamic  Active       Po 4
43       001c.7f63.7efc    Dynamic  Active       Po 4
43       001c.7f69.7b76    Dynamic  Active       Po 3
43       02e0.52c3.940e    System   Active       XX 1/X/X
43       c4f5.7c18.3962    System   Remote       XX 2/X/X
701      0050.5686.049e    Dynamic  Remote       Te 15/0/14
701      0050.5686.09d9    Dynamic  Remote       Te 15/0/19
701      0050.5686.123f    Dynamic  Remote       Te 15/0/4
701      0050.5686.1384    Dynamic  Remote       Te 15/0/15
701      0050.5686.1647    Dynamic  Remote       Te 15/0/18
701      0050.5686.44ff    Dynamic  Remote       Te 15/0/6
701      0050.5686.4614    Dynamic  Remote       Te 15/0/9
701      0050.5686.6265    Dynamic  Remote       Te 15/0/8
701      0050.5686.7078    Dynamic  Remote       Te 15/0/3'''

mactables = shmac.split('\n')
macinfos = []
for mactb in mactables:
    if((mactb.lower().find(' te'))>0):
        macinfos.append(mactb)

for macinfo in macinfos:
    macinfo=macinfo.split()
    print("MAC : {0} \t Interface : Te {1}".format(macinfo[1],macinfo[5]))

○ 장비의 Local Mac Address 정보를 출력하는 내용입니다.

   

 

예제 6) 파일 입출력해보기 

zigifile = open("zigi.txt",'w')
zigifile.write("zigispace.net")
zigifile.close()

zigifile2 = open('zigi.txt','r')
zigi = zigifile2.read()
zigifile2.close()
print (zigi)

○ 초간단 파일 입출력 예제입니다.

예제 7) 장비 정보 가져온 후, 파일로 만들기

from netmiko import ConnectHandler
import device

print("Connecting....")
nwnode = ConnectHandler(**device.ARI)
shver = nwnode.send_command("show ver")

zigifile = open('zigi.txt','w')
zigifile.write(shver)
zigifile.close() 

○ 장비의 정보를 가져와서, 해당 값을 파일로 만드는 예제입니다.

Posted by 네떡지기
DevOps/Programmability2017.06.27 02:09

Today Keys : cisco, aci, apic, python, package, sdk, cobra, programming, programmable, automation, installation 


이번 포스팅은 Cisco ACI의 Python SDK인 cobra를 위한 기본 설치 과정에 대한 내용입니다. 
ACI의 경우에는 기본적으로 APIC Gui를 통해서 설정을 진행하고 있지만, 
설정해야 하는 부분이 많아지게 되면, GUI로는 어려운 면이 없지 않아 있습니다. 
그럴 때, 사용될 수 있는 부분이 XML이나 JSON을 이용한 POST로 파일을 직접 올려서 설정하는 방법도 있지만
해당 기능이 모든 설정에 대해서 지원하지는 않습니다. 

APIC Python SDK를 사용하여, POST로 지원되지 않는 설정을 GUI가 아닌 Code로써 손쉽게 설정할 수 있습니다.
(물론 코드를 작성해야 한다는 부담은 있지만, GUI를 통한 대량의 Click보다는 나은 선택이 아닐까 싶습니다)


Cisco APIC Python SDK은 'cobra'라고 합니다. 

cobra를 이용한 프로그래밍을 하기 위해서는 다음의 2개 패키지를 설치해야 합니다. 


acicobra (SDK) 

acimodel (ACI MIT Model Package)

 

이 2개이 패키지는 APIC에서 아래의 URL을 통해서 다운로드 받을 수 있습니다. 


  http[s]://APIC Address/cobra/_downloads/ 




이 디렉토리 내에는 다음의 2개의 .egg file들이 존해아며, 파일 이름에는 APIC과 Python 버전 정보가 함께 표기되어 있습니다.

따라서, APIC 버전에 따라서 다음의 파일명은 조금 다를 수 있습니다. 

 

 위의 패키지 2개를 다운로드 받은 이후에는 설치해야 하는 데, 

이를 설치하기 위해서는 다음의 패키지가 사전에 반드시 설치 되어 있어야 합니다. 

 Python 2.7, easy_install , pip , virtualenv 

 위의 사전 설치 패키지를 모두 설치하고 나면, APIC에서 다운 받은 파일을 설치를 진행해야 하는 데, 

 이 때 다음의 2가지 사항에 유의해야 합니다. 


   acicobra SDK와 acimodel Package를 설치는 반드시, acicobra SDK를 먼저 설치 후에 acimodel을 설치

  ◇ 기존에 설치된 acicobra SDK가 있다면, 설치 전에 먼저 Uninstall 을 한 이후에 재 설치. 


APIC SDK 설치는 Windows와 Linux 환경 모두 설치가 가능하며, 

이번 포스팅에서는 Windows 환경에서의 설치를 살펴보겠습니다.



 Windows에 SDK 설치하기

1. Windows 환경 변수의 Path에 Python 경로와 Python scripts 경로를 추가

2. easy_install 명령을 이용하여 acicobra SDK egg 파일을 설치 

      easy_install -Z acicobra-X.X-pyX.X.egg

 Windows에 ACI Model Package 설치하기

1. easy_install 명령을 이용하여 acicobra SDK egg 파일을 설치 

      easy_install -Z acimodel-X.X-pyX.X.egg


 ACI SDK, Model Package 설치 확인

pip show 명령어를 사용하여, 정상적으로 SDK와 Package가 설치되었는지를 확인합니다.



* 관련 링크 : https://developer.cisco.com/media/apicDcPythonAPI_v0.1/install.html




Posted by 네떡지기
DevOps/Programmability2017.05.17 19:37

 

Keyword : netmiko, paramiko, ssh, python, programmability, automation, network, 자동화, 프로그래머빌리티


Programmability for Networker를 새롭게 시작하는 포스팅입니다. ^^; 지난번 Part에 이어서 Part 22부터 시작입니다.

당분간 진행하는 부분이 예전에 진행을 하면서 사용했던 부분이긴 하지만,

Netmiko라는 멀티벤더에서 손쉽게 Paramiko SSH를 사용할 수 있도록 해주는 라이브러리로 진행을 하게 될 예정이라서,

먼저 Netmiko 라이브러리를 설치하는 것으로 가볍게 시작해봅니다.

 

 

Netmiko 

 Multi-vendor library to simplify Paramiko SSH connections to network devices

 

* 관련 링크 : https://github.com/ktbyers/netmiko

 

 

○ Python 버전

         Python 2.7, 3.4, 3.5

 

○ 지원되는 장비

         Paramiko >= 1.13+

         scp >= 0.10.0

         pyyaml

         pytest(for unit tests)

 

 ※ Paramiko

   - Python SSH 모듈 

 

 

 

○ 지원되는 장비

       - Regularly tested

          Arista vEOS / Cisco ASA / Cisco IOS / Cisco IOS-XE / Cisco IOS-XR / Cisco NX-OS / Cisco SG300
          HP Comware7 / HP ProCurve / Juniper Junos / Linux

 

       - Limited tested

          Avaya ERS / Avaya VSP / Brocade VDX / Brocade ICX,FastIron / Brocade MLX,NetIron / Cisco WLC
          Dell-Force10 DNOS9 / Dell PowerConnect / Huawei / Mellanox / Palo Alto PAN-OS / Pluribus / Vyatta VyOS

 

       - Experimental
          A10 / Alcatel-Lucent SR-OS / Ciena SAOS / Cisco Telepresence / CheckPoint Gaia / Enterasys / Extreme
          F5 LTM / Fortinet

 

 

 

○ 설치 방법

       - Netmiko의 설치방법은 아래의 페이지에 안내되어 있지만, 실패하실 수 있습니다.

        * https://pynet.twb-tech.com/blog/automation/netmiko-tools.html

 

 

 

 

 

설치 시에 아래와 같은 에러메시지를 만날 수도 있습니다.

 

 

       -

 

혹시 설치에 실패를 하게 되면, 아래와 같이 설치를 진행하시면 됩니다. (Cent OS 7.3 기준입니다)

 

 

   rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
   yum install python-pip

   yum install python-dev
   yum install python-lxml
   yum install opensll
   yum install openssl-devel

   pip install netmiko

 

 

 

 

 

 

 

 

 

Posted by 네떡지기
DevOps/Programmability2017.05.01 09:49

안녕하세요.

 

이번 포스팅은 기존에 진행하던 Programmabiliy for Networker 라는 주제의 포스팅을..

다시 오랜만에 재개하기 위한 사전 동영상 포스팅입니다.

 

아래의 동영상은 Access-list를 관리하기 위한 방법으로 작성한 코드입니다.

차단하기 위한 별도의 IP리스트 파일을 관리를 하여,

기존의 있는 Access-list에 해당 파일에 있는 IP를 차단하는 역할을 해줍니다.

 

또한 이력관리를 위해서 앞에 Access-list Numbering을 ACL이 추가되는 현재의 날짜와 그 날의 순번대로 작성됩니다.

즉, 2017년 5월 1일에 작성되는 ACL의 경우에는 1705010000, 1705010001 과 같이 Accesss-list가 만들어집니다.

 

개인적으로 진행하는 스터디에서 다뤄질 소모임이기도 하고...

공부를 위한 부분이기도 하고..

6월에 진행되는 네전따 커뮤니티 세미나 발표를 위한 부분이기도 하고..

업무를 위해서 필요한 부분이기도 할...

Programmability for Networker 포스팅이.. 곧 다시.. 재개합니다. ^^

 

 

.

Posted by 네떡지기
분류없음2015.08.21 13:49

Docker,Remote, API,client,  library, python,host, 원격, 리모트, 도커, git : today Key

 

 Docker의 6번째 포스팅입니다. 이번 포스팅에서는 Docker를 Remote에서 제어할 수 있도록 제공되는 Remote API client libraries에 대해서 다뤄봅니다. 보안적인 측면보다는 최대한 우선 쉽게 접근하는 걸 목표로 잡고 있기 때문에 이 점은 감안해서 봐주시면 감사하겠습니다. ^^

이런 식으로 Docker를 Client에서도 다룰 수 있다는 것 정도로 보면 어떨까 싶습니다! ^^

물론 이러한 API를 활용하여 Docker Host를 관리하도록 한다면 Docker의 명령을 직접 입력하지 않고 Application을 클릭하는 것만으로도

docker를 관리할 수 있을 것입니다.


 

Docker Remote API Client libraries

    Docker에서는 Client가 Docker Host를 제어하기 위한 다양한 언어로 구성된 API Library에 대해 있음  

    Docker를 작성한 Go를 비롯한 다양한 언어에 대한 Library가 Git을 통해서 제공되기 때문에 원하는 언어를 선택 가능. 

    Client는 Host를 제어하는 역할이기 때문에 별도의 Docker Engine를 설치할 필요가 없으며,

       Windows,Mac 등에서도 직접 사용 가능.

    본 포스팅에서는 Windows기반의 PC에서 Python Library를 사용하여 Docker Host를 제어

   • Docker API LINK : https://docs.docker.com/reference/api/remote_api_client_libraries/

   

  

 

 

Docker Remote API Client libraries - Python

    Python용 Library를 설치

          - pip install docker-py  [ Docker Python Library가 있는 Git 페이지에도 나와있음 ]

          - https://github.com/docker/docker-py

 

 

    Python Shell에서 Docker Host에 접속 및 정보 확인

          - docker.client 라이브러리를 Load

          - Docker Host에 접속

              ※ Docker Host에서 기본 Unix Sock 접속이 아닌 TCP로 접속할 수 있도록 설정 필요.

          - info() 메서드를 사용하면 현재 Docker Host에 대한 정보를 확인할 수 있음.

 

 

   Docker Image 정보 확인

          - images() 메서드를 통해서 Docker Host에 있는 이미지 정보를 출력

          - docker images 역할

 

 

   Docker Image 정보 확인 변형

          - 위에 표기된 대로, 모든 정보가 다시 결과 값으로 리턴될 때의 사용자가 보기에는 조금 어렵게 리턴이 되게 되기 때문에 결과 값을

            아래와 같이 가공이 필요로 함.

          - originList() 메서드는 간략하게 결과 값을 가공하기 위해 만든 별도의 메서드

 

 

 

   Docker Image 정보 확인 변형2

      - originList() 메서드는 처음이 결과 값보다는 보기가 편하지만 그래도 여전히 보기가 쉽지 않고 필요한 정보 뿐만 아니라,

        필요 없을 수 있는 모든 정보들에 대한 결과를 보여주기 때문에 아래와 같이 필요한 정보에 대해서만 간략하게 보여줄 수 있도록

        메서드를 작성하는 것이 좋음.

      - ImageList() 메서드는 Image ID와 Repo, Tags, Virtual Size 에 대한 값만을 보여주도록 가공하도록 작성한 별도의 메서드.

 

 

   Docker Container 생성

      - create_container() 메서드를 사용하여 Container를 생성

      - start() 메서드에 매개변수로 생성된 Container 객체를 포함하여, Container를 Running 상태로 만듬.

      - start() 메서드에 의해 생성된 Container가 정상적으로 동작하는지 확인하기 위해서, 해당 Container에서 동작 중인 웹서비스 호출

 

 

      - containers() 메서드를 사용하면, 현재 동작 중인 Container의 정보를 볼 수 있음.

           : docker ps 역할

 

      - 아래의 실행 결과 값은 마찬가지로 originList() 메서드를 사용하여 전체 정보를 보기 쉽도록 가공.

 

 

 

 

Posted by 네떡지기
분류없음2015.05.22 12:56

pyeapi, api, node, python, programmability : today Key


이번 포스팅은 지난 시간에 이어서, arista의 pyeapi에 대한 간략한 포스팅입니다.

pyeapi를 사용 시에 기본적으로 보게 된, 몇 가지의 코드 내용을 간략하게 알아봅니다.

별도로 구현부까지는 세부적으로 알아보지 않고, 각 주요 메서드에 대한 사용법과 설명만 하였습니다.

추후에 필요에 따라서 이렇게 주요 메서드에 대해서는 추가로 알아 볼 예정이며,

또한 물론 각 메서드를 사용한 코드와 동작 결과에 대한 예제도 함께 알아보겠습니다.


 


class Node(object): 

  

   def config(self, commands):

       ▷ commands는 String이나 List형으로 구성되나, String형은 내부적으로 List Type으로 다시 변경해서 처리된다.

       ▷ 실제 Command 실행은 run.commands 메서드를 사용

 


   def enable(self, commands, encoding='json', strict=False):

       ▷ Command는 List 형태로 전송

       ▷ 기존 Command 요청 형태는 json이며, json을 지원하지 않는 경우에는 text로 전송하도록 함

       ▷ strtict가 false 경우에는 json을 지원하지 않는 command에 대해서 text 방식으로 시도.

       ▷ Config 모드의 명령은 지원하지 않음.

       ▷ 실제 Command 실행은 run.commands 메서드를 사용

 

 

    def run_commands(self, commands, encoding='json'):

       ▷ 명령어를 전송하는 하위 계층의 메서드

       ▷ 일반적으로 직접 사용하지 않고, config나 enable 메서드를 통해 사용

       ▷ 실제 장비로 Command의 전송은 node 클래스의 멤버의 _connection의 execute 메서드 사용

           ※  _connection

                - connect_to 메서드 연결 시, Node 객체를 생성하게 되는데, Node 객체 초기화 시에

                 연결하고자 하는 node의 정보를 가지고 make_connection 메서드를 통해서 node와 연결할 객체를

                 eapi 연결 type에 따라서 socket, http_local, http, https EapiConnection을 호출

          

 

    def api(self, name, namespace='pyeapy.api'):

       ▷ name 매개변수를 통해서 API 모듈을 자동으로 Load

       ▷ 기본 namespace는 pyepai.api 이므로, api 내의 모듈 명만 써주면 됨.

       ▷ initialize 메서드와 instance 메서드에 확인하고, 해동 모듈을 리턴 함.

 

 

    def connect_to(name):

       ▷  매개변수의 name으로 node 정보가 있는 파일에서, 해당 node의 접속 정보(ip, id, pass 등)을 가지고 node 객체를 생성

 

Posted by 네떡지기
분류없음2015.05.13 00:26

pyeapi, eapi, python, arista, example : Today Key 

이번 포스팅에서는 지난 번에 알아보았던  pyepai에서 제공하는 몇 가지 예제에 대해서 간략하게 알아보려고 합니다.

예제를 통해서 이러한 기능들도 사용할 수 있구나? 정도 ^^

무엇이든, 왜? 사용해야 하는지 아는게 중요할테니,

이번 포스팅에서는 몇 가지 예제를 통해서 왜? 써야 하는지를 생각해 볼 수 있었으면 합니다.

 


Arsita Python Client for eAPI (pyeapi) 예제


pyepai 예제 List

  • pyeapi를 설치하고 나면, 아래와 같이 몇 가지 예제를 코드를 제공합니다.

      여기에서는 simple과 유사한 기능을 하는 sysmac을 제외한 나머지 코드를 살펴보려고 합니다.

 

 

 

 

get-config.py

  • EOS 장비의 running-config와 startup-config 그리고 2개의 Config에 대한 비교 내용을 출력하는 예제입니다.

  • 해당 예제 코드를 실행하면 아래와 같은 결과를 볼 수 있습니다.

 

 

  •위의 실행 결과를 보여주는 코드는 다음과 같습니다.

 

 

  •pyeapi 라이브러리를 import한 이후에 node정보가 있는 configuration을 Load합니다.

     즉, 지난 pyeapi 첫 번째 시간에 얘기했던 configuration 파일을 default로 사용할 수도 있지만, 위의 예제처럼 원하는 파일을

     Load해서도 사용할 수 있습니다.

 

  •EOS 장비의 config를 가져오는 것은, get_config 메서드를 사용하며 매개변수로 running-config 혹은 startup-config를

     전달함에 따라서 알맞은 Config를 가져올 수 있습니다.

  •마찬가지로 2번째 매개변수로 'diffs'를 전달하게 되며, running-config와 startup-config를 비교한 결과 값을 출력할 수 있습니다.

  •하지만, 위의 결과 출력 값을 한 눈에 보기는 좀 어렵기 때문에 예제 소스의 출력 부분을 조금 수정하면 아래와 같이 보기 편하게

     나타낼 수도 있습니다.

 

 

 

simple

  •2번째 예제는 간단하게 장비의 MAC-Address를 가져와서 출력하는 예제입니다.

  •예제 코드는 직접 확인해보고 분석해보면 좋을 것 같습니다.  그렇게 길지도 않고 직관적으로 파악이 가능한 정도입니다.

 

 

 

vlans_api.py

  • 이번에는 Vlan정보를 출력하고, vlan을 생성 그리고 삭제하는 예제도 있습니다. 

       마찬가지로 예제 코드는 직접 확인해보시고 분석하시기를 추천해드립니다

 

 

 

      이번 포스팅에서는 첫 번째 예졔에서 약간의 부분을 빼고는 기술적인 부분은 거의 배제하고 올렸습니다.

      코드를 처음부터 다 짤 필요도 없으며, 다 짤 수 없어도 기존에 만들어진 예제를 보고 응용할 수 있으면 충분히 활용이 가능할 것입니다.

      그러기 위해서는 위아 같은 간단한 예제를 통해서, 이런 저런 다양한 기능에 대해서 미리 알아보는 과정이 필요하게 됩니다.

      반드시 예제로 주어진 코드는 한 번씩 살펴보고 예제 코드를 변형하여 자신만의 코드로 활용해 보시길 바랍니다. 

       

 

Posted by 네떡지기
분류없음2015.04.06 22:59



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

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



Juniper PyEZ Library


○ PyEZ를 통한 Configuration 관리

    • PyEZ를 통한 설정 관리 : Unstructured / Structured
    • Unstructured  
          - 지원되는 특정 포맷 형식에 Junos Config를 전달하여 관리
          -  다수의 변수를 가진 Template을 사용하면 보다 쉽고 빠르게 사용 가능
    • Structured
          - 설정 / 속성에 접근하는 프로그래밍 방법을 잘 정의한 추상화 자원을 사용
      - 추상화 자원은 Puppet이나 Chef같은 IT frameworks와 유사하다.

 

 

 

 

 

○ Unstructured
 • Unstructed 변경은 Config 클래스를 사용 (jnpr.junos.utils.config.Config)
 • Config 클래스는 load() 메서드를 제공하여, snippet 혹은 Template을 불러오는 역할
 • Configuration의 Data로, Strings, files, XML 객체, Jinja2 Template 객체를 사용
       - Configuration Data  snippets와 Jinja2 Template가 포함될 수 있다.
  • String, Files, Jinja2 Templat에 들어가는 데이터 포맷은 ASCII Text,
     Junos XML elements, Junos OS set command가 지원된다.
  • 각 데이터 포맷은 load() 메서드 사용 시, format 매개변수를 사용하여 지정하거나,   설정 파일의 적절한 확장자를 지정하여 설정 가능.

 

 

 

 

○ PyEZ를 통한 Configuration 변경 예제 1

 • Unstructure 방식으로 Junos Device를 설정을 바꾸는 에제를 살펴본다.

 • Unstructure 방식을 사용하기 위해서 Config Class를 먼저 import 한다.

 • Junos Device에 연결하고, 해당 Device를 매개변수로 한 Config 객체를 만든다.

 • Junos의 Config 변경 방식 중의 Set Commands를 사용한 변경 방식을 사용을 위한 Set 명령을 만들고,

     Config 객체에서 이를 Load한다. 이 때에 기본 Configration Data Format은 XML이므로, Set으로 변경해준다.

 •변경될 Config를 확인하고, 장비에 적용한다.

 

 

 • 위의 Code를 실행하고 나면, Juniper 장비에는 아래와 같은 설정이 들어가게 된다.

 

 

 

 

○ PyEZ를 통한 Configuration 변경 예제 2

 • 2번째 에제는 Text 형태 포맷의 Configuration을 적용하는 예제이다.

 •Configuration의 TEXT를 별도의 파일로 만들어서 불러올 수 있기도 하고, 아래와 같이 Code에 Text 변수로 만들어서

    해당 변수를 불러와서 설정이 가능하다.

 •Configuration만 Text 형태로 작성하여 Format을 Text로 지정하는 것 이외에 기존과 거의 유사하다.

 •아래 Code를 실행하게 되면, Loopback 0으로 Interface가 1개 생성된다.

 

 

 

 

 

○ PyEZ를 통한 Configuration 변경 예제 3

 •3번째 예제는 Jinja 형식의 Template으로 Juniper 장비의 Configuration을 수정하는 예제입니다.

 •예제에서 사용된 Template은 아래와 같습니다.

    Junos에서 Hostname을 변경하기 위한 Config이며, Jinja 형식을 사용하여 hostname의 값을 변수 형식으로 사용합니다.

 

 

 

 •이번에는 Template를 file에서 불러오기 때문에 configuration 객체에서 Load 시에, Template 파일의 경로를 지정합니다.

 •Jinja에서 사용된 변수에 값을 적용하기 위해, load 시에 해당 변수에 들어갈 값이 있는 변수를 매개변수로 넣습니다.

    즉, Load 시에 Template File의 Path와 Template에서 사용된 변수를 할당합니다.

 •기타 나머지 실행은 동일합니다.

 •아래의 Config를 적용하고 나면, Juniper 장비의 Hostname이 변경됩니다.

 

  •다음은 위의 코드를 실행 한 후의 Junos 장비의 Hostname이 바뀐 내용입니다.

 

 

 

 

Posted by 네떡지기

티스토리 툴바