2018년 1월 11일 목요일

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

민망한 하하하 짤에 대한 이미지 검색결과

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

페이스북에 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}





0 개의 댓글:

댓글 쓰기

 
Copyright © . 시스템/네트워크 자동화 전문가 블로그 - Posts · Comments
Theme Template by BTDesigner · Powered by Blogger