하하하~!
하하하~;;;;
페이스북에 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}
|