[Ansible] Role 을 활용해보자
Ansible Role
변수나 태스크, 핸들러 등의 정의를 구조적으로 할 수 있도록 하는 Ansible의 파일/디렉토리 구조라고 생각하면 된다.
ansible-galaxy init [프로젝트명]
이라고 커맨드를 날리면 해당 프로젝트명으로 디렉토리가 생기고, 디렉토리 안에 아래와 같은 파일들이 생긴다.
[vagrant@controller tomcat85]$ pwd
/home/vagrant/Ansible/tomcat85
[vagrant@controller tomcat85]$ ll
total 4
-rw-rw-r--. 1 vagrant vagrant 1328 Aug 12 07:13 README.md
drwxrwxr-x. 2 vagrant vagrant 22 Aug 12 07:13 defaults
drwxrwxr-x. 2 vagrant vagrant 6 Aug 12 07:13 files
drwxrwxr-x. 2 vagrant vagrant 22 Aug 12 07:13 handlers
drwxrwxr-x. 2 vagrant vagrant 22 Aug 12 07:13 meta
drwxrwxr-x. 2 vagrant vagrant 22 Aug 12 07:13 tasks
drwxrwxr-x. 2 vagrant vagrant 6 Aug 12 07:13 templates
drwxrwxr-x. 2 vagrant vagrant 39 Aug 12 07:13 tests
drwxrwxr-x. 2 vagrant vagrant 22 Aug 12 07:13 vars
이 디렉토리에서는 몇가지를 꼭 만족시켜야 한다.
- 디렉토리 이름 유지
- 각 디렉토리는 반드시 main.yml을 포함해야 한다.
- 필요없는 디렉토리는 삭제해도 되지만, 반드시 하나는 있어야한다.
각 디렉토리는 직관적으로 어떤 역할인지 이해가 가는데 defaults랑 vars는 둘다 변수에 관한 디렉토리이다.
어떻게 다른가 하면 우선순위에서 다르고 한다.
Ansible에서 변수는 굉장히 많은 곳에서 정의할 수 있는데.. (무려 20곳이 넘네.. ?) 간단히 요약하면Ansible command에서 넘겨받은 변수 inventory 내의 변수 role: vars system 변수 role defaults 변수
이다.
즉, default보다 vars가 우선순위가더 높다. 예를들어 tomcat8을 설치할 때 기본적으로 java 1.7을 쓰되, 가끔 java 1.8을 쓰는 경우에 defaults에는 java1.7로, 특정 roles의 vars에만 java1.8로 정의해서 사용할 수 있다. 즉, 동일 변수에 대해서 재정의할 때에 사용한다고 생각하면 된다.
** role 디렉토리 구조 role하나의 디렉토리는 이러한데, Ansible작업을 구성할 때에 하나의 role을 사용해서 작업을 구성하기보다는 여러 roles들이 합쳐서 작업을 구성한다. roles를 확장하면 아래와 같은 구조가 된다.
site.yml
webservers.yml
fooservers.yml
roles/
common/
tasks/
handlers/
files/
templates/
vars/
defaults/
meta/
webservers/
tasks/
defaults/
meta/
이렇게 프로젝트를 구성하게 되면, 보통 site.yml 에서
---
- hosts: webservers
roles:
- common
- webservers
위와같은 플레이북을 실행하여 ansible-playbook site.yml
role들을 불러오게 된다.