2017년 12월 31일 일요일

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


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

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탄에서 보아요~!

0 개의 댓글:

댓글 쓰기

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