2017년 12월 6일 수요일

[Ansible] 그럼 롤(Role)은 어떻게 쓰나요?

지난번 글에서는 롤의 구성을 알아봤다면~!
실제로 어떻게 쓸수 있는지 알아봐야 겠죠?

모든 디렉터리를 다 사용할 건 아니지만
디렉터리를 우선 생성해야 합니다 :)
sudo mkdir -p /etc/ansible/roles/nginx
cd /etc/ansible/roles/nginx/
sudo mkdir tasks handlers defaults vars files templates meta



해당 내용을 다 만들었으면, 이제 각각의 디렉터리에 들어갈 yml파일을 만들어 보죠
룰 #1
main.yml입니다.
음...이상하게 들리시겠지만?

각각의 디렉터리 밑에 main.yml이라고 되어 있어야 읽어들입니다 :)
하하하;; (저는 범인이 아니에요~~)

잘못 없음 짤에 대한 이미지 검색결과

어쨌거나~~! 최근에 작업했던 코드를 사용해 어떻게 롤로 변형되는지 알아보겠습니당.

[ nginx_if_main.yml ]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes
  vars:
    lnx_name: "{{ 'Ubuntu' if ansible_distribution == 'Ubuntu' else 'CentOS' if ansible_distribution == 'CentOS' else 'Just Linux' }}"

  tasks:
  - name: nginx for Any Linux
    include_tasks: "{{ lnx_name }}.yml"


[ CentOS.yml ] 
1
2
3
4
5
6
7
8
- name: install epel-release
  action : "{{ ansible_pkg_mgr }} name=epel-release state=latest"
- name: install nginx web server
  action : "{{ ansible_pkg_mgr }} name=nginx state=present"
- name: Upload default index.html for web server
  get_url: url=https://www.nginx.com dest=/usr/share/nginx/html/ mode=0644
- name: Start nginx web server
  service: name=nginx state=started
[ Ubuntu.yml ] 
1
2
3
4
- name: install nginx web server
  action : "{{ ansible_pkg_mgr }} name=nginx state=present"
- name: Upload default index.html for web server
  get_url: url=https://www.nginx.com dest=/usr/share/nginx/html/ mode=0644 validate_certs=no
======
최종 결과 구조는 이렇게 됩니다. 
{ tasks }
우선 가장 먼저 tasks 부분을 만들어 보겠습니다.
[ main.yml ]
1
2
3
---
- name: nginx for Any Linux
  include: "/etc/ansible/roles/nginx/tasks/{{ lnx_name }}.yml"

[ CentOS.yml ]
1
2
3
4
5
6
7
8
- name: install epel-release
  action : "{{ ansible_pkg_mgr }} name=epel-release state=latest"
- name: install nginx web server
  action : "{{ ansible_pkg_mgr }} name=nginx state=present"
- name: Upload default index.html for web server
  get_url: url=https://www.nginx.com dest=/usr/share/nginx/html/ mode=0644
  notify:
    - Start nginx web server

[ Ubuntu.yml ] 
1
2
3
4
- name: install nginx web server
  action : "{{ ansible_pkg_mgr }} name=nginx state=present"
- name: Upload default index.html for web server
  get_url: url=https://www.nginx.com dest=/usr/share/nginx/html/ mode=0644 validate_certs=no
여기서 중요한 건 include_tasks가 role에서는 인지가 안됩니다 -_-
그래서 include로 바꾸어주고, role의 경우는 실행위치를(현재는 = /home/vagrant)
기본으로 인지하니...절대 경로로 바꿔 줬습니다.
그리고 서비스 재 시작 같은거는 핸들러로 빼줬습니다. :) 멋있으라구 
{ handlers }
'Start nginx web server' 라는 notify를 받아서 동작하는 핸들러를 만들 차례입니다. 

[ main.yml ]
1
2
3
---
- name: Start nginx web server
  service: name=nginx state=started


{ defaults }
이번에는 패스~ 합니다. 
{ vars }
우리가 플레이북을 짤때 넣었던 그 vars이 이 vars입니다.
똑같아요 다만 이건 우선 순위가 defaults에서도 등록한 변수보다 높습니다. 즉 덮어쓰기가 된다는거죠 :)
근데 한가지 문제가....jinja2 문법에 따라 조건이 들어가면 해석이 늦습니다.
그래서 해당 vars는 쓰지 못하고...role을 호출할때 조건으로 뺐습니다 ㅠㅠ 흑...
눈물 짤에 대한 이미지 검색결과
{ files }
역시 특별히 할일이 없네요 :) 패스 
{ templates }
이번 예제는 템플릿이 없어서 패스~
{ meta }
의존성이 없어서 역시 패스~!
꼴랑 4개 만들고 ~~ 롤이라고 하기에는 부족함이 있지만...
어쨌든 호출해 볼까요~?
{ role을 부르는 코드 }

1
2
3
4
5
6
7
---
- name: Install nginx on the nodes
  hosts: nodes
  become: yes

  roles:
    - { role: nginx, lnx_name: "{{ 'Ubuntu' if ansible_distribution == 'Ubuntu' else 'CentOS' if ansible_distribution == 'CentOS' else 'Just Linux' }}" }
lnx_name을 vars로 빼고 싶었지만...빼지 못함 아쉬움이 있네요
role을 하나 더 만들고 child로 뺄까도 고민했지만...그건 다음 기회가 있다면 -_-
role을 호출하고 변수만 정할수 있도록 옆에 도우미 줄이 있는게 확인이 되네요 그럼 결과는~?
잘 돌아가는게 확인이 되네요~ :)
role을 잘만 이용하면, 메인 코드가 아주 많이 간결해 질수 있답니다.

0 개의 댓글:

댓글 쓰기

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