레이블이 py인 게시물을 표시합니다. 모든 게시물 표시
레이블이 py인 게시물을 표시합니다. 모든 게시물 표시

2018년 1월 11일 목요일

[Ansible] plugin 중에서 python을 이용한 filter에 대한 짧은 이야기

- 0 개의 댓글
민망한 하하하 짤에 대한 이미지 검색결과

하하하~!
하하하~;;;;

페이스북에 Ansible user 커뮤니티가 있는데, 거기에 ansible filter에 관련하여
인자 값을 두개만 넘겼는데, 3개가 처리되는 것에 대해서
모르겠다고 답변했는데, 나중에 알게 된 사실을 정리해서 올립니다.

답변은 김용기부장님께서 해주셨고, 저는 그걸 그냥 이해하고 정리한 정도입니다 :)

음...나중에 필터 관련해서 글을 정리할때 도움이 될꺼 같기도하고....누군가는 이게 또 그런저런 도움이 될꺼 같기도 해서 :)

참 그리고 여기에 있는 기본적인 filters.py는 다음의 github에서 참조하여 작성하였습니다.
https://gist.github.com/viesti/1febe79938c09cc29501#file-filters-py-L4


============ 파이썬 커뮤니티 사람들을 위해서 ============
들어가기에 앞서 python 커뮤니티에서 들어오신 분들을 위해서 약간 아주 약간 첨언하자면, 순순하게 filter가 위치한 디렉터리 /usr/lib/python2.7/site-packages/ansible/plugins/filter에 아래에 filters.py에 준하는 문법 수준으로만 작성한다면, 어떤 종류의 앤서블에서 실행되는 데이터 값에 관여 및 조정할수 있습니다.

여기서 재미있는 것은 모듈의 개념처럼 동작하는데 import는 없으며, reload의 concept도 없습니다. 그냥 여기 있는거 다 읽고 자동으로 모두 넣습니다..하하하;;;; 무거워질수도 있는 우려가 있습니다만....현재 filter에 위치하고 있는 py들이 얼마 없기 때문에 한동안은 큰 무리가 없을 것 같습니다. 사용자가 임의로 쓰기 좋은 환경이라는거죠 :)

이 얼마나 개발자 친화적인...(장난감)? 하하하;;

[vagrant@ansible-server filter]$ ll
total 228
-rw-r--r--. 1 root root 15859 Nov 29 21:08 core.py
-rw-r--r--. 2 root root 16706 Nov 29 22:40 core.pyc
-rw-r--r--. 2 root root 16706 Nov 29 22:40 core.pyo
-rw-r--r--. 1 root root   400 Jan 11 12:00 filters.py
-rw-r--r--. 1 root root   119 Nov 29 21:08 __init__.py
-rw-r--r--. 2 root root   309 Nov 29 22:40 __init__.pyc
-rw-r--r--. 2 root root   309 Nov 29 22:40 __init__.pyo
-rw-r--r--. 1 root root 28268 Nov 29 21:08 ipaddr.py
-rw-r--r--. 2 root root 28218 Nov 29 22:40 ipaddr.pyc
-rw-r--r--. 2 root root 28218 Nov 29 22:40 ipaddr.pyo
-rw-r--r--. 1 root root  1857 Nov 29 21:08 json_query.py
-rw-r--r--. 2 root root  1757 Nov 29 22:40 json_query.pyc
-rw-r--r--. 2 root root  1757 Nov 29 22:40 json_query.pyo
-rw-r--r--. 1 root root  4383 Nov 29 21:08 mathstuff.py
-rw-r--r--. 2 root root  5452 Nov 29 22:40 mathstuff.pyc
-rw-r--r--. 2 root root  5452 Nov 29 22:40 mathstuff.pyo
-rw-r--r--. 1 root root  7487 Nov 29 21:08 network.py
-rw-r--r--. 2 root root  5740 Nov 29 22:40 network.pyc
-rw-r--r--. 2 root root  5740 Nov 29 22:40 network.pyo
-rw-r--r--. 1 root root  1136 Nov 29 21:08 urlsplit.py
-rw-r--r--. 2 root root  1567 Nov 29 22:40 urlsplit.pyc
-rw-r--r--. 2 root root  1567 Nov 29 22:40 urlsplit.pyo
================================================

그러면,  질문 사항을 보겠습니다.




여기에 저는...아직 공부를 안해서!!! 입니다. 혹은 플러그인중에 필터를 쓸일이...그닥.-_-
없었다고나 할까요?
진짜 짤에 대한 이미지 검색결과
진짜입니다.!!

그래서 이거에 대해서 음 모르겠는데요? 라는게 주된 내용으로 답변하였는데,
김용기 부장님께서 아래와 같이 답변 주셨습니다.



그래서 해당 내용을 확인하려고 바인딩 되는 인자를 찍어보는 랩을 할 것입니다.

1) 필터에 사용할 코드와 인자 값을 찍기 위한 구성을 추가합니다.
 - 필터에 사용할 코드 : filters.py
 - 샘플 코드 : test.yml

2) 해당코드를 /usr/lib/python2.7/site-packages/ansible/plugins/filter에 저장합니다.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def make_rules(hosts, ports, proto):
    print "*"*50; print "  Binding IP is " + str([i for i in hosts]); print "*"*50+"\n"
    return [{"proto": proto,
             "from_port": port,
             "to_port": port,
             "cidr_ip": host} for host in hosts for port in map(int, ports.split(","))]

class FilterModule(object):
     def filters(self):
         return {'make_rules': make_rules}

3)아무런 생각 없이 샘플 코드를 실행합니다.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
---
- name: Test
  hosts: localhost
  vars:
    random_hosts:
      - 192.168.1.2
      - 192.168.1.3

  tasks:

    - name: debug message for traceback
      debug:
        msg: "{{ random_hosts | make_rules('22,8080', 'tcp') }}"

4) 짜잔 내용을 확인합니다.


신기하게도 맨 앞에 기입된 내용이 정말 바인딩이 되는군요!!

제가 이걸 초반에 헷깔린게..테스트는 ...안/못 하고..그냥 코드만 봤을때는 아무리 봐도 안 돌아가는 코드인데다가..ipaddr.py 코드의 경우에는 중간에 usage를 넣습니다.



그런데 이 작성자분은 filters.py라는 것에다가 코멘트(#)도 없이 그냥 usage라고 넣고 이와 같이 함께 그냥 작성하셨더라고요..그래서..아 그냥 오타인가? 했더랬죠 -_-

실행을 만약에 전부다 넣고(git에 있는 filters.py처럼)



 실행한다면, 당연히 에러가 납니다.



그냥 실행해도 마찬가지이고요..문법적으로 다가;;;;




반성합니다.!!! 역시 테스트를 해야죠~! 개발자/엔지니어 기타등 우리는 말로 하는게 아니라 다 테스트를 해보는 겁니다~!!!!
가즈아 짤에 대한 이미지 검색결과


[ 참고사항 ]
좀더 쉽게 확인하는 부분을 변경한 것도 첨부합니다.
저와 같이 비개발자분들이 쉽게 이해하도록 수정한 부분입니다.
밑에 for문과 print문만 보시면 되요~!
(다만 약간 결과물이 달라집니다 ~~ 참고하시고요~!!)
성투! 아 아니...다들 성공적인 한주가 되세요~!!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def make_rules(hosts, ports, proto):
    print "*"*30
    for i in hosts:
      print "  Binding IP is " + i
    print "*"*30+"\n"
    return [{"proto": proto,
             "from_port": port,
             "to_port": port,
             "cidr_ip": host} for host in hosts for port in map(int, ports.split(","))]

class FilterModule(object):
     def filters(self):
         return {'make_rules': make_rules}





[Continue reading...]

2017년 12월 31일 일요일

[Ansible] Plugin 살펴 보기 1편 (Action, Cache)

- 0 개의 댓글

플러그인에 대한 이미지 검색결과

Plugin은 사실 알아도 되고...몰라도 되고...
알면 좋은 정도? 하지만 향후에 진짜 정말 정말 정말 나중에 나만의 코드를? 만들고 싶을때 참조할 만한 정보와 좀 더 효과적으로 앤서블을 사용하고자 할때 필요한 내용들이 들어 있습니다.

그러니...이 말을 반대로 하면 어렵다는거죠 -_-

매번 글을 쓰면 쉬워요.
금방해요.
이정도야 다 그냥 그까이꺼....라고 썼는데 ......차마 이번꺼는 .....그렇게 못 쓰겠네요.
(따라서 인용도 과도하게 많습니다. 하하하;;;;)

플러그인은 현재 (공식적으로) 아래와 같은 애들이 있습니다.
https://docs.ansible.com/ansible/devel/plugins.html

그나마 눈에 들어오는건 CallBack이랑 Strategy네요.
왜냐...면 이전에 했으니까요 :) 하하하하;;;;

하나하나 살펴 보도록 합시다.

1. Action (tag : 거의 개발자 전용)
이건 간단하게 말하자면, 할 행동에 부가적으로 들어가는 것들을 정의하는 것입니다.
이미 쓰이고 있는건 Template을 만들때 쓰이고 있고, 실제로 Backup을 위해서 정의하는 것으로 가장 유명하게 쓰입니다.

이렇게 글로 보면 무슨 말인지 감이 안 오시겠죠 -_-?
저 또한 공홈에 있는 말을 아무리 읽어도 감이 안 오더라고....요

1차적으로 모든 모듈에 대한 내부 일부 코드와 설명이 들어 있는 페이지를 참조합니다.
근데 여긴 코드와 설명 그리고, 간단한 내용만 있어서...역시 부족함이 있더라고요.

그래서 Action plugin을 사용한 실 사례를 찾아봅니다.

사례 #1
반복적으로 수행해야 하는 작업이 있는데, 이걸 모듈을 개발하고 모듈의 제한사항인 동적 변수를 읽고 쓰는 부분을 해결하기 위해서, plugin으로 기능을 추가함
http://ndemengel.github.io/2015/01/20/ansible-modules-and-action-plugins/

사례 #2
간단한 모듈+플러그인을 구현하는 예제
https://terryhowe.wordpress.com/2016/05/03/ansible-2-0-modules-and-action-plugins/

사례 #3
네트워크 장비에서는 수시로 일어나는 backup을 action plugin이 이미 구현되어 있는데, 이걸을 확장함. (여러가지의 시행착오가 보이네요..)
https://networklore.com/extending-ansible-action-plugins/

Action plugin 이해를 위해서는 사례#1이 제일 나아 보이네요.

2. Cache (tag : Power-user용)

Cache는 Action에 비하면 아주 쉽습니다.

FACT와 인벤토리 data와 같은 것을 것을 저장하겠다는 거죠.
기본 값은 메모리에 저장하는데, 이것을 활용하거나, 반복적인 작업을 피하기 위해서, 또는 성능향상을 목적으로 따로 저장할 수 있습니다.

저장할수 있는 포맷은 다음과 같은데..

이를 크게 3개로 구분할 수 있습니다.

1) 영구적으로 저장 안되는거
 - memory : 기본 값

2) 메모리와 유사한 속도 수준으로 저장되며, 오래 가게 할수 있는 것(timeout)
 - memcached
 - redis

3) 디스크에 저장하며, 영구적인 것
 - jsonfile
 - pickle
 - yaml

다른 건 대략 유추가 가능한데, 좀 생소할 수 있는 NoSQL DB인 memcached와 redis에 대해서 간단하게 읽고 넘어가면 좋을 표를 봅시다.

 Memcached
 REDIS
처리 속도가 빠르다.
   - 당연히 데이터가 메모리에만 저장되므로 빠르다. 즉, 속도가 느린 Disk를 거치지 않는다.
처리 속도가 빠르다.
   - 당연히 데이터가 메모리+Disk에 저장된다. 그러나, 속도는 Memcached와 큰 차이가 없다.
데이터가 메모리에만 저장된다.
   - 당연히 프로세스가 죽거나 장비가 Shutdown되면 데이터가 사라진다.
데이터가 메모리+Disk에 저장된다.
   - 프로세스가 죽거나 장비가 Shutdown되더라도 Data의 복구가 가능하다.
만료일을 지정하여 만료가 되면 자동으로 데이터가 사라진다.
   - 이름에서도 느껴지듯이 Cache이다
만료일을 지정하여 만료가 되면 자동으로 데이터가 사라진다.
   - 동일한 기능을 지원한다.
저장소 메모리 재사용
   - 만료가 되지 않았더라도  더이상 데이터를 넣을 메모리가 없으면 LRU(Least recently used) 알고리즘에 의해 데이터가 사라진다.
저장소 메모리 재사용 하지 않는다.
   - 명시적으로만 데이터를 제거할 수 있다.
 문자열만 지원
문자열, Set, Sorted Set, Hash, List등의 다양한 Data Type을 지원.
출처 : http://blog.daum.net/smufu/4

이건 어려운 설명입니다. 궁금해 하시는 분들이 있을까봐
http://blog.leekyoungil.com/?p=200

그리고 추가적으로 NoSQL DB 리스트가 정리된 것도 링크합니다.
LIST OF NOSQL DATABASES [currently >225]


대에에충 어떻게 돌아가는지 확인을 위해서 redis를 한번 써보도록 합시다.

테스트를 위해서는 구성을 변경하고 관련 패키지를 설치해야 합니다.

구성 변경
사실 상은 fact_caching만 변경해 주면, 되나..명시성을 위해서 그냥 다 기입합니다.

그리고 패키지를 설치합니다. 설치 안 하고 그냥 하면 아래와 같이 에러가!!!

패키지들은 다음과 같습니다.
서비스와 소스코드라고 보시면 제일 무난할꺼 같네요.
 - sudo yum install redis
 - sudo systemctl start redis
 - sudo pip install redis




그런 다음에는 테스트를 위한 소스를 작성합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
---
- hosts: localhost
  tasks:
      - name: 1st fact chk with sleep 2
        debug:
            var: ansible_date_time.time
      - name: Sleep for a few seconds
        command: sleep 2

- hosts: localhost
  tasks:
      - name: 2nd fact chk with sleep 5
        debug:
            var: ansible_date_time.time
      - name: Sleep for 5sec
        command: sleep 5

- hosts: localhost
  tasks:
      - name: 3rd fact chck
        debug:
            var: ansible_date_time.time

한가지 언급하고 싶은게...timeout값을 조정하면 중간중간에 timeout 시켜서 시간이 바뀌는 것도 확인할 수 있습니다.

자 그러면, 실행해 봅시다.


그리고 일정 시간이 흐른 후에 다시 실행해 봅니다.
여전히 시간 인자 값(ansible_date_time.time)은 그대로 있습니다.
Cache하고 있다는 증거이죠
그리고 또 다른 증거는 gather_fact과정이 생략되어 있다는 것입니다.
(위에 빨간 칸 참조)


그리고 redis로 구성된 NoSQL DB는 다음과 같이 확인이 가능합니다.

1) 직접 DB 접근해서 확인하기
redis-cli
keys ansible*
MGET <key 이름>

2) python 코드로 추출해서 보기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/usr/bin/env python

import redis
import json

r = redis.StrictRedis(host='localhost', port=6379, db=0)
key = "ansible_facts" + "localhost"
val = r.get(key)

data = json.loads(val)
print data['ansible_date_time']['time']  # time

JSON으로 저장되어 있는 다시 parsing하는 것입니다.
당장 딱히 필요가 없어서..그냥 테스트로 하드코딩 했습니다. --; 하하하;;;

시간이 바뀐건 'redis-cli flushall'을 통해서 전체 정보를 한번 날려서 그런겁니다.
그렇게 하지 않으면 테스트 기간 동안 (3600초) 계속 정보가 유지되어 테스트가 안됩니다.

추가 정보
FACT에 포함되지 않고, 임의로 지정한 인자 값은 redis로는 cache되지 않는 것 같습니다.
암만 찾아봐도 안되고 아무리 테스트해도 먹질 않네요 -_-



소스 코드는 다음과 같습니다.

[ 넣는 코드 ]

1
2
3
4
5
6
7
8
---
- name: Save facts in redis
  hosts: localhost
  gather_facts: yes

  tasks:
    - set_fact:
        redis_var: "cache_it_4_everywhere"

[ FACT는 다시 사용하려고 했던 코드 ]

1
2
3
4
5
6
7
---
- name: Get facts from redis
  hosts: localhost
  gather_facts: yes

  tasks:
    - debug: var=redis_var

참고사항 : redis에 관련하여 
https://pypi.python.org/pypi/redis
https://redis.io/topics/quickstart
https://ko.wikipedia.org/wiki/%EB%A0%88%EB%94%94%EC%8A%A4


줄줄이 딸려 나오는 고구마에 대한 이미지 검색결과

원 제목은 plugin 조금만 살펴 보기 였는데...글이 무슨 고구마 마냥 계속 길어져서...
몇개로 또 쪼개야 할 것 같네요...하하하;;; 이렇게 길게 할 생각 없었는데...;;; 2탄에서 보아요~!

[Continue reading...]

2017년 8월 17일 목요일

[Python/Ansible] 윈도우와 네트워크 모듈에 대해서...

- 0 개의 댓글


앤서블로 이것저것 관리하다보면..

황당한 일을 종종 겪게 된다.
어제 겪었던...앤서블로는 실행이 되는데, 플레이북으로는 안된다던가...

모듈마다 문자열 처리하는 방식이 틀리다던가 하는 일들 말이다.

이게 웃긴게...센트OS 우분투는 왠만하면 다 잘 된다..
즉 범용 리눅스는 다 큰 문제 없이 모든 걸 다 잘 처리해 놨다.


그런데 문제는 마이너들....
윈도우나 네트워크 모듈 같은 것들 말이다..

그러나..이건 반대로 생각하면 기회가 아닐까 -_-?

내가 PR(pull request)할수 있는 기회 말이다..

이 글은 코리아 파이썬 유저 그룹에 포스팅 할 예정이긴 한데..
그 이유는 다른 것 개발하고 그러는 것도 좋은데, 이런 것에도 관심을 가지면..
재미있을 것 같다는 것이다..

버그성 기능을 나열해 보면..
1. win_command

이게 ansible(ans는 약자로 등록했다)로 바로 실행하면  플레이북에서도 똑같이 동작해야 하는데...

플레이북에서
"net use z: \\\192.168.1.10/home/vagrant/nfs_shared"
로 등록하고 실행하면 에러가 난다.

net use "z:" "\\192.168.1.10/home/vagrant/nfs_shared"로 해야만 에러가 나지 않는다.

## 수정수정 ##
이건 powershell스크립트로 쓰네요 python의 탈을 쓴 ps1...인듯;;;
Using module file /usr/lib/python2.7/site-packages/ansible/modules/windows/win_command.ps1

2. nxos_config 


/usr/lib/python2.7/site-packages/ansible/modules/network/nxos/nxos_config.py
이 모듈을 사용하여 nxos를 config하게 되는데...

문자열 처리가 좀 서투르다..
무슨 얘기냐면...

이건 에러가 안 나는데..
lines: 'ntp server 192.168.1.10 use-vrf management'

이건 에러가 난다.
lines: ntp server 192.168.1.10 use-vrf management

당연한거 아닌가요 문자열을 묶어 줘야 하잖나요 라고 할수 있겠지만...
대부분의 리눅스에서 제공하는 모듈은 안 묶어줘도 된다.

또 위와 같이 문자열을 다르게 보는 모듈도 있고...제 각각이다..
특히  lineinfile과 blockinfile 모듈은 정말 아름답게 혼자서 잘 동작한다.
옵션도 엄청 많고....

개발할 소지가 충분히 있다는 뜻이다..
그래서 다른 파이썬 분야도 많지만 누군가는 관심을 가져주기를 하는 마음에서...하하하;;

PS : 네트워크 모듈 주소
https://github.com/ansible/ansible/tree/devel/lib/ansible/modules/network

[Continue reading...]

2017년 7월 23일 일요일

[파이썬] 랜덤+가중치

- 0 개의 댓글
페이스북 파이썬 유저 그룹에서 앤서블(Ansible) 이벤트를 진행했는데.. 진짜 정말 생각보다 많은 분들이 등록을 하셨다.

무료이벤트이긴 하지만...이렇게 호응이 좋을 줄이야...

그래서 고마운 맘에 조금 더 드려야 하고 2명을 더 추가하고...공유해드린 분은 가중치(weight)를 드려야 겠다고 생각했다. 그런데...이걸 가중치도 되면서 난수도 뽑아 주는 프로그램을 구글에서 검색해서 하려고 했는데.. 이런 프로그램이 개발된게 없다..


난 프로그래밍 할줄 잘 모르는데.... 어쩌겠다..만들어야지..진짜 허접해서 그래서..이걸 만들었다.. 비웃을 수도 있지만...-_-; 일단 동작은 하니까... 그리고 계속 써야 할 수도 있어서...

[ 추첨 영상 ]





[ 당첨자 ]
1 : 변규섭
2 : LeeDong Won
7 : Changkyum Kim 
14 : Minho Park
19 : Jeffery Lim  (22번 중복으로 추가 당첨)
22 : LeeDong Won

[코드]

#!/usr/bin/python
#-*- coding: utf-8 -*-
import random

# 가중치
weight = 3

# 참여하신 분 
shared = 8
reply = 17

#당첨 되신 분 
won = 5

w = []
#가중치꺼 
for i in range(weight):
    for i in range(shared):
        w.append(i+1)

#보통꺼
w = w+range(shared+1,shared+reply+1)

# 중복제거 
w_sample = list(set(random.sample(w,won))) 

# 중복제거 하면, 다시 샘플링 함 
while True:
    if won==len(w_sample):
        print w_sample
        break
    else:
        w_sample = list(set(random.sample(w,won)))  

[Continue reading...]

2017년 6월 6일 화요일

[파이썬] info.py

- 0 개의 댓글


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

# platform 모듈은 파이썬 코드를 실행하고 있는 운영체제의 환경 정보를 알려줍니다.
# multiprocessing은 CPU의 개수를 알기 위해 사용합니다.

import platform
import multiprocessing

# print는 화면에 글자를 출력하라는 함수입니다.
print "운영체제: ", platform.system()
print "운영체제의 상세정보: ", platform.platform()
print "운영체제 버전: ", platform.version()
print "프로세서: ", platform.processor()
print "CPU 수: ", multiprocessing.cpu_count()
[Continue reading...]
 
Copyright © . 쿠버네티스 전문가 블로그 - Posts · Comments
Theme Template by BTDesigner · Powered by Blogger