2017년 6월 26일 월요일

[Ansible] debug모듈과 debugger에 대한 고찰



드디어 debug를 합니다 :)

debug 부분에는 크게 두가지 부분이 있는데요.
debug 모듈을 통해서 필요한 메세지를 출력하고 그에 따라 정보를 확인하는 부분이 있고..
debugger를 yml파일에 삽입해서 라이브로(gdb처럼) 인자 값을 확인하고 필요에 따라서 수정도 할수 있는 부분이 있습니다.

그런데 그런데...엄청나게 길고 복잡한 것들을 하지 않는 경우에서는...딱히 쓸모가...
그보다 더 유용한 것을 1-2개 정도 공유 할 겁니다.

1. debug 모듈

우선 볼 것은, 진행되는 사항을 특별한 옵션 없이 좀더 보고 싶을때 사용할 수 있는 디버그 모듈 입니다. 사용하는 방법은 여러가지가 있지만, 간단하게 살펴 보고 넘어가겠습니다아~
그게 제가 보기에는 이렇게 사용하는 것도 좋지만 그냥 -vvvv 옵션을 줘서 사용하는게 더 편리할 것 같더라고요.
배포 버전일 경우는 다르지만, 개발할때는 오고 가는걸 확인하면서 자세히 보는 -vvvv 가 더 변수를 보기에 편리한 것 같다능...

[ nginx_bulk.yml ]
---
- hosts: cuda
  remote_user: nginx_user
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx
      register: result
    - debug: var=result

  handlers:
    - name: start nginx
      service: name=nginx state=started


만약에 저 옵션이 없는 경우에는 그냥 이렇게 나옵니다.


그리고 -v가 붙으면 더 자세하게 진행되는 사항들을 볼수 있는데...

-vvvv로 실행하면 아래와 같이 위에 간단한 변수들을 포함하여 거의 모든 내용을 볼수가 있습니다. 저도 yaml 짜다가 막히면 이걸로 봤어요. 



2. debugger

페이스북 앤서블 유저 그룹에서 YongKi Kim님이 공유해 주신 자료에 나와 있듯 redo나 continue 그리고 variables등에 대한 현재 인풋 값을 보고 조치 또는 작업할 수 있긴 하나...수백 라인이 아니라면 굳이....가끔 변수 값이 정확하게 들어가 있는지 확인차 시도해 볼수도 있겠습니다.


많이 많이 답답하면 말이죠 
개발자에게 필요한 툴로 보여지네요. 저희야 유저니까요 :) 

파일 안에 strategy (전략)에 debug라는 문구만 추가해 주면 알아서 오류에 따라서 break 포인트를 잡습니다. 

[ nginx_bulk.yml ]
---
- hosts: cuda
  strategy: debug
  remote_user: nginx_user
  become: yes
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx
      register: result
    - debug: var=result

  handlers:
    - name: start nginx
      service: name=nginx state=started


debug로 빠진 다음에 p vars(출력해라 변수들을)를 입력하면 엄청 많은게 나옵니다. 
(경우에 따라서 초반이면 적을수도 있고요)
이걸 보고 변수 값들이 정확하게 돌아가도록 입력 되었는지 확인해 보면 되겠네요. 



3. 유용한 정보 

그런데 이거를 눈으로 쳐다보고 있으면 눈이 빠지겠죠?

그래서 두가지의 방법을 활용해 볼수 있을 것 같습니다. 
확실하게 해결된다는 보장은 없지만 ^^;; 좀더 개선이 됩니다. 

1) 앤서블 로그

앤서블 환경 설정에 보면 로그를 기록하게 하는 것은 디폴트로 활성화 되어 있지 않습니다. 
왜냐..하면 로그가 너무 많이 쌓이니까요 하하하 :) 

하지만 저희는 필요할때는 켜서 확인하면서 보면 더 편리할 것입니다.

  /etc/ansible/ansible.cfg
 92 # logging is off by default unless this path is defined
 93 # if so defined, consider logrotate
 94 log_path = /var/log/ansible.log    <<< 수정해야 할 부분 

예를 들면 'tail -f /var/log/ansible.log'를 해 놓고 다른 창에서 실행하면서 비교해 볼수도 있기도 할꺼구요. (왼쪽이 명령 실행, 오른쪽이 tail로 실행 결과 확인하는 것입니다.)



2) 인간이 읽기 좋게 변경하기 

이게 무슨 말이냐면 내부/외부의 플러그인(보통 python 파일)을 이용해서, 결과 값이 좀더 읽게 좋게 해주는 것입니다. 이게...완벽하지는 않은데....그래도 꽤 괜찮습니다. 안 하는 것보다는 하는게 더 좋음 
vim을 있는 그대로 쓰는 것보다 칼라 스키마를 적용하면 더 좋게 쓸수 있는 것 같다고 하면 가장 비슷한 비유 같네요 :) 


2-1) 가장 쉬운 방법
우선 가장 쉬운 방법은 이미 지정되어 있는 callback을 키는 것입니다. 
이는 앤서블 2.x 이상에 있습니다. 

해당 사항을 변경하기 전에는 그냥 한줄을 쭈욱 쭈욱 쭈욱 나옵니다. 
짧으면 사실 읽는데 큰 부담이 없는데, 보기 안 좋습니다. 
코드도 한줄을 쭈욱 쭈욱 짤수 있고, 문서는 한줄로 쓸수 있는데 줄 바꿈을 하는 이유는 우리들이 쉽게 읽으려고 하는거니까요. 



그럼 변경을 해 보면 

 /etc/ansible/ansible.cfg
 63 # change the default callback
 64 stdout_callback = debug        <<< 수정해야 할 부분 
 65 # enable additional callbacks
 66 #callback_whitelist = timer, mail



내용은 같지만 좀 더 보기가 편해졌죠?
인증이 실패하였군요 라는 것?
하하하 1초를 절약하는게 어디입니까;;;;;

2-2) 두번째로 쉽고 재미있는 방법?
이건 순수하게 저만 재미있다고 느낄수 있는데...외부 플러그인을 활용하는 방법입니다. 
세상에는 많은 착한 의지를 가지고 순수하게 개발해주는 사람들이 있는데, 그 사람들이 개발한 것을 그대로 사용하는 것입니다. 

몇개를 사용해 봤는데 그중에 한 2개 정도가 그나마 쓸만한 것 같네요. 
그 중에서 저는 openshift-ansible을 쓸겁니다. 이게 좀더 간단하고 칼라풀 하더라고요. 

openshift-ansible

ansible-human_log


우선 plugin을 인식하는 위치를 앤서블 컨피그 파일에서 확인합니다. 
디폴트 설정은 왠만하면 안 바꿉니다. 

 /etc/ansible/ansible.cfg
174 # set plugin path directories here, separate with colons
175 #action_plugins     = /usr/share/ansible/plugins/action
176 #cache_plugins      = /usr/share/ansible/plugins/cache
177 callback_plugins   = /usr/share/ansible/plugins/callback
178 #connection_plugins = /usr/share/ansible/plugins/connection
179 #lookup_plugins     = /usr/share/ansible/plugins/lookup
180 #inventory_plugins  = /usr/share/ansible/plugins/inventory
181 #vars_plugins       = /usr/share/ansible/plugins/vars
182 #filter_plugins     = /usr/share/ansible/plugins/filter
183 #test_plugins       = /usr/share/ansible/plugins/test
184 #terminal_plugins   = /usr/share/ansible/plugins/terminal
185 #strategy_plugins   = /usr/share/ansible/plugins/strategy


잡았다 요놈!

하지만 해당 디렉터리에 가보면 디렉터리가 없습니다. 따라서 우선 만들어 주고요. 
curl로 raw파일을 다운로드 받습니다. (git이 없습니당;;)

[root@ansible ~]# mkdir -p /usr/share/ansible/plugins/callback

[root@ansible ~]#
curl -o /usr/share/ansible/plugins/callback/default.py https://raw.githubusercontent.com/openshift/openshift-ansible/master/callback_plugins/default.py  


그리고 나서 다시 실행하면 거의 똑같이 사람이 읽기 좋은 결과를 보여줍니다. 
상황에 따라서, 다르게도 보여질수도 있고, 같게 나올수도 있어서...이건 선택의 문제 같네요 :) 



이런 것들은 활용한다면 좀더 쉽게 플레이북을 만들고 활용할 수 있겠네요 :) 



0 개의 댓글:

댓글 쓰기

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