2017년 6월 14일 수요일

[Ansible] NX-OS (Cisco 네트워크 운영체제) 관리하기 (6)



약속 드린 것처럼, 리눅스만 관리하면 안 좋아 보이니까~
NX-OS도 관리할 수 있는걸 보여드리기 했죠?

그러기 위해서는 nx-api라는게 필요하다고 했었죠?
지난글 참조

NX-OS를 새로 설치는 다 했는데, 우선 얘기했던 nx-api가 있나 봅시다.

n9k-1# show run | in feature 
n9k-1# 
n9k-1# show run | in feature
n9k-1# 

무려 두번을 했는데, 없습니다....
nxapi는 사실 기본으로 올라오는 feature가 아니라서요. 설정해 줘야 합니다. 

n9k-1# conf t 
Enter configuration commands, one per line. End with CNTL/Z.
n9k-1(config)# feature nxapi
n9k-1(config)# show run | in feature
feature nxapi

그리고 잊지 말고 저장도 해줍니다 .안 해주면 다음 부팅에 이걸 또 해야 합니다.

n9k-1(config)# copy run start
[########################################] 100%
Copy complete.


자 이제 feature도 올라왔고, 동작하는지 봐야 겠죠?

아주 간단하게 엔서블 컨트롤러에서 다음과 같이 짭니다.
vlan 생성해 보는 예제입니다.
(혹시나 해서 vlan 개념이 궁금하신 분은 #링크 로)

[root@Ansible ~]# cat vlan_ex.yml 
---
- name: vlan management
  hosts: nxos
  connection: local
  gather_facts: no


  tasks:
    - name: vlan create
      nxos_vlan: 
        vlan_id: 10
        state: present 
        name: by_ansible 
        transport: nxapi


vlan 10번아 만들어 져라 뽕 



(참고 n9k-1번은 (172.30.1.201, n9k-2번은 172.30.1.202로 세팅되어 있습니다. \
그리고, n9k-2은 일부로 nxapi를 올리지 않았으니까 실패한것 입니다.~~)

어디 한번 볼까요?

[생성하기 전]


[생성한 이후]

뿅! vlan 10이 by_ansible이라고 하면서 만들어 졌습니다.
셀프 짝짝짝!!!

사용자 생각 

근데...사실 vlan 만들려면 그냥 로긴 해서 만들면 되는데 뭐하러 이렇게 귀찮게 해라고 되 물으실수 있습니다. 또한 vlan 머 만들어 두면 앞으로 만들일도 별로 없는데 왜 굳이 귀찮게 라고도 할수도 있죠

그거 사실이거든요 -_-; 하하하하;;;

명령어 총 3개로 그게 가능하거든요.

n9k-1# conf t 
Enter configuration commands, one per line. End with CNTL/Z.
n9k-1(config)# vlan 10 
n9k-1(config-vlan)# name by_console


이렇게 말이죠...


반론?

이거는 hosts에다가 여러대를 입력을 해두면 한번에 다 할수 있고요, 전체적으로 세팅하고 관리할 수 있고요 불라불라..라고 얘기해 봅니다.


사용자 생각 
아니 이거 만들어 두면 거의 안 바꾼다니까!!
그리고, 설정파일(config)파일 자체를 관리하는데, 굳이 왜 이런게 필요한지 모르겠는데?
라고 생각할 수 있습니다.


고민

그래서 생각해 봅니다..
제가 봐도 참...쓸데가....애매하거든요..

vlan을 사용자 요청에 따라 자유롭게 생성이라도 하면 좀 쓸만할텐데요 원격지에서 말이죠 간단한 생산성 도구를 사용하듯.

무슨 말인고 하면,  매번 vlan을 생성하기 위해서 yml파일을 생성하고 sending하고 하는게 아니라 좀 다이나믹하게 해보고 싶은거죠.

예를 들면, 나 vlan 2-10을 nxos 그룹에 만들고 싶은데?
하면 yml을 만들고, 그에 맞게 보내줘야 하잖나요?

그냥 호출해서 몇개 입력해서 바로 vim같은거 안 쓰고
뚝딱하고 하고 싶은거죠!!


응 ? 어쩌라고라는 생각이 드시죠;;? 당연한 겁니다.
생각보다 어렵지 않으니 한번 가벼운 마음으로 보세요~!

우선 일단 모듈내용을 살펴 봅니다. 모듈에서 쓸 수 있는건 최대한 써야 하니까요
하고 싶은건 사용자의 요구사항에 맞게 vlan을 자유롭게 생성하는거니까요.

현재의 모듈에서 파라미터 몇개를 골라 잡습니다.
https://docs.ansible.com/ansible/nxos_vlan_module.html

name
no
Name of VLAN.

transport
yescli
Configures the transport connection to use when connecting to the remote device. The transport argument supports connectivity to the device over cli (ssh) or nxapi.

username
no
Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the nxapi authentication depending on which transport is used. If the value is not specified in the task, the value of environment variable ANSIBLE_NET_USERNAME will be used instead.

vlan_id
no
Single VLAN ID.
vlan_range
no
Range of VLANs such as 2-10 or 2,5,10-15, etc.

그리고 플레이북 파일을 약간 수정해 줍니다.

---
- name: vlan management
  hosts: nxos
  connection: local
  gather_facts: no

  tasks:
    - name: vlan create
      nxos_vlan:
        vlan_id: '{{vlan_id}}'
        username: admin
        state: present
        name: by_ansible
        transport: nxapi


그리고 실행해 봅니다.



n9k-1에 잘 추가가 되었을까요? 안되었을까요~?


vlan20번이 잘 추가 되었습니다.
이로써, 외부에서 글자 몇자를 더 추가로 넣어서 vlan을 추가할 수 있게 되었습니다.
사용자가 아 vlan 30을 추가해야 하는데, 할때 다량의(nxos에 포함된 호스트들)에 자유롭게 변경하면서 추가관리 할수 있다는거죠. (삭제는 또 구현해야 겠지만요)

ansible-playbook Single_Vlan.yml -k --extra-vars="vlan_id=20"




저라면...솔직히 안 쓸꺼 같습니다. 
왜냐면요. 너무 글자를 쳐야 하는게 많아요..
-_-; 역시 좀 편해야 쓸만하지 이런 긴 문장을 쓰면서 까지 굳이 굳이 굳이.....

또 vlan을 다량을 추가하려면 vlan_id가 아닌 vlan_range 파라미터를 써야 합니다. 
왔다 갔다 하기 귀찮다는거죠..

YAML에서 조건절에 따른 분기가 어느정도 제공이 되고, 
어느정도의 문법이 있긴 하지만.. YAML(야물) 해당 부분을 커버하는 것은 효율적이지가 않습니다. 그러라고 만든 애가 아니거든요. 

음...그래서 nxos_vlan.py 소스코드를 직접 수정할까도 고민해 봤는데, 그러면 매번 배포판 나올때마다 수정을 직접 해야 하니 아주아주아주 비 효율적인 방법이 되어 버립니다. 

참고 사항 : 앤서블 컨트롤러에 소스 위치 
/usr/lib/python2.7/site-packages/ansible/modules/network/nxos/nxos_vlan.py (456줄)
소스 파일 참고 사이트 : 깃허브꺼라 배포된 것보다 휠씬 기능이 많아서 길고 내용이 많습니다. (661줄)

vlan_id는 이렇게 




vlan_range는 이런식으로 구현해 놓았네요. 



그래서 선택한 방법이 껍데기는 파이썬으로 짜는 것입니다. 
분기 조건이랑 인자값 입력 그리고 help 파일까지 만드는게 굉장히 쉽거든요. 
아니...그럭저럭 쉽다고 하는게 더 낫겠네요...

구성은 이렇게 할껍니다. 

사용자가 vlan_create.py를 호출하면 

1. 너가 vlan을 만들려고 하는데, 하나야 여러개야를 물어봅니다. 
2. 그리고 생성할 호스트를 입력 받고,
3. vlan ID(들)도 입력 받습니다.
4. 그리고 암호 넣으라고 나오는 것을 입력하면 끝~!

입니다.

크게 두가지의 방법으로 만들 수 있는데 제일 쉬운 인자값을 물어보고 받는 걸로 하겠습니다. 
이거 말고 인자값을 명령어에 같은 줄에 입력 하는 방식도 있는데, 그게 더 뽀대나지만..일단은 ~ 이걸로 하는걸로 (참, 배시나 perl, ruby로 짜셔도 됩니다. 이건 순수 재 취향이라서 그리고 인자값과 help파일로 하는 것은 파이썬 책 838페이지를 참조하셔도 됩니다. )


[ vlan_create.py ]


#!/bin/env python
#-*- coding: utf-8 -*-

import os

def run(select,hss,vli):
  if select ==1:
    os.system("ansible-playbook Single_Vlan.yml -k --extra-vars='hosts=%s vlan_id=%s'"%(hss,vli))
  elif select ==2:
    os.system("ansible-playbook Multi_Vlan.yml -k --extra-vars='hosts=%s vlan_range=%s'"%(hss,vli))
  else:
    print "1 또는 2가 아닌 값입니다. 프로그램을 다시 시작해주세요."

if __name__ == "__main__":
  print "하나의vlan을 생성하실지, 여러개의 vlan을 생성하실지 선택하세요"
  select = input("한개는 1을 여러개는 2를 입력합니다(1,2): ")
  print "vlan을 생성할 호스트 이름을 입력하세요"
  hss = raw_input("만약/etc/ansible/hosts 모두를 입력하고 싶다면, all을 입력하세요 :")
  vli = raw_input("vlan ID를 입력하세요 :")

  run(select,hss,vli)


코드는 파이썬 책 (P143)을 참고로 작성된 것입니다.



















간만에 책 홍보 :))))


그리고 호출하는 파일이 약간 변동이 있습니다. 

1. 두개로 왜?
일단 두개로 작성한 이유는 nxos_vlan에서 하나를 만들때 쓰는 모듈과 여러개 일때가 다르게 작성되었기 때문입니다. 

2. 왜 name을 뺐나?
NX-OS에서 중복된 이름은 허용하지 않는데, 이에 따라서 계속 생성할 경우 중복때문에 오류가 납니다. 여러개의 vlan을 생성할때도 마찬가지입니다. 
엄밀히 따지자면, transport에서 cli로 완전히 통짜로 짜면 되겠지만..꼭 굳이 그럴 필요가 ;;
언젠가는 모듈에서 직접 지원할듯요. 

3. hosts이름은 왜 외부에서 받나?
이건 당연히 이해하시라고 생각하는데, 사용자가 선택을 할 수 있어야 의미가;;;쿨럭...
맨날 똑같은 애한테 배포한다면 정말 의미가;;; 쿨럭x100

[ Single_Vlan.yml ]
---
- name: vlan management
  hosts: '{{hosts}}'
  connection: local
  gather_facts: no

  tasks:
    - name: vlan create
      nxos_vlan: 
        vlan_id: '{{vlan_id}}' 
        username: admin
        state: present 
#       name: by_ansible
        transport: nxapi
        
[ Multi_Vlan.yml ]
---
- name: vlan management
  hosts: '{{hosts}}'
  connection: local
  gather_facts: no

  tasks:
    - name: Multi-vlan create
      nxos_vlan: 
        vlan_range: '{{vlan_range}}' 
        username: admin
        state: present 
        transport: nxapi


그럼 이제 돌려 볼까요?
#1 vlan 하나 만들기 


잘 만들어 지는군요... 하하하하하하~


#2 다량의 vlan 만들기 



이것도 잘 되네요~~ (당연히 테스트하고 올리는거니까요;;; 하하하;;;)

확인~!!


다 잘 만들어져 있네요~


#3 n9k-2번에도 nxapi를 켜고 vlan 110,120,130 만들기




확인~!




다 잘 되네요~~

이 명령어를 어디에서나 'vc'로 그냥 호출하는 방법은 파이썬 책 145페이지에 나와있습니다. (하하하하;;; 홍보 맞습니다.)


그럼 이제 다음에는 GUI에 하는 것에 대해서 알아보도록 하겠습니다.~~







0 개의 댓글:

댓글 쓰기

 
Copyright © . 엔지니어를 위한 파이썬 및 기술 블로그 - Posts · Comments
Theme Template by BTDesigner · Powered by Blogger