실제로 어떻게 쓸수 있는지 알아봐야 겠죠?
모든 디렉터리를 다 사용할 건 아니지만
디렉터리를 우선 생성해야 합니다 :)
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 개의 댓글:
댓글 쓰기