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 네떡지기
분류없음2017.03.08 12:36

안녕하세요.


이번 포스팅은 간단한 동영상으로 올려봅니다.


앞으로 포스팅을 위해서 준비 중인(?) ACI와 관련한 간단한 동영상입니다.


ACI에서 EPG를 생성하고, Contract을 생성하고, Contract을 맺어주기 위한 작업을 JSON을 통해서 진행을 하는 내용입니다.

다만, JSON을 생성하는 것을 EPG와 Contract를 변수로 하여,

Ansible을 통해서 변수로 지정된 EPG와 Contract을 생성 및 연결하는 JSON을 생성하고 이를 통해서 ACI에 적용합니다.

JSON을 수동으로 변경해서 만드는 것에 비해서 잘못 수정할 부분이나,

보다 많은 부분에 적용해야 하는 경우가 발생하는 경우에 조금 유용하게 사용할 수 있지 않을까 싶습니다.

물론 이 방법 이외에도 추가적으로 보다 유연하고 편리하게 사용하게 사용하기 위한 방법들에 대해서는 고민 중입니다.

 

 






Posted by 네떡지기
분류없음2017.02.09 07:44

안녕하세요.

이번 포스팅은 작년에 포럼에서 발표했던 IAC 관련 발표 내용입니다.

인프라 환경에 대한 변화에 따라서, 필요한 이유..  현재 나와있는 다양한 오픈소스에 대한 내용..

그리고 몇 가지 관련 오픈소스 프로젝트를 소개했던 내용입니다.

 

 

 

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 네떡지기

티스토리 툴바