소개
Ansible 을 처음 사용할 때는 모든 내용을 하나의 큰 playbook.yml 파일에 작성해도 괜찮습니다. 하지만 자동화 코드가 수백 줄로 늘어나면 파일을 관리하기 어려워집니다.
이 문제를 해결하는 방법이 Ansible Role입니다.
Role 은 문서 보관함의 폴더와 비슷합니다. 하나의 거대한 문서에 모든 내용을 넣는 대신, "웹 서버" 작업을 위한 폴더와 "데이터베이스" 작업을 위한 폴더처럼 목적에 따라 논리적인 폴더로 나눕니다.
자동화는 결국 소프트웨어 엔지니어링의 영역으로 확장되므로 Role 이 중요합니다. Playbook 이 몇 개의 작업을 넘어 커지면, 첫 실행을 성공시키는 것뿐 아니라 구조, 이름 지정, 재사용성도 중요해집니다.
이 실습에서는 다음을 수행합니다.
ansible-galaxy를 사용해 표준 Role 구조를 만듭니다.- 작업을 해당 Role 로 옮깁니다.
- 간단한 "마스터 Playbook"에서 Role 을 실행합니다.
확장 가능한 자동화에는 구조가 필요하므로 Role 이 중요합니다. 코드베이스가 커질수록 첫 실행을 성공시키는 것만큼 체계적인 구성도 중요해집니다.
Role 초기화
먼저 폴더 구조를 만듭니다. 모든 폴더를 직접 만들 수도 있지만, Ansible 에는 이 작업을 대신 수행하는 ansible-galaxy 도구가 포함되어 있습니다.
이 표준 구조를 사용하면 모든 Role 에서 작업, 변수, 파일, 템플릿, 핸들러를 예측 가능한 위치에 둘 수 있습니다. 구조를 일관되게 유지하면 팀원들이 서로의 자동화 코드를 더 쉽게 읽을 수 있습니다.
프로젝트 디렉터리로 이동합니다.
cd ~/project
Role 을 저장할 디렉터리를 만듭니다.
mkdir roles
이제 myrole이라는 새 Role 을 만듭니다. 자동화를 위한 "패키지" 또는 "모듈"을 만든다고 생각하면 됩니다.
ansible-galaxy init roles/myrole
생성된 내용을 확인합니다.
ls -R roles/myrole
여러 폴더 (tasks, handlers, vars 등) 가 표시됩니다.
- tasks: 실제 작업 (설치, 시작, 복사) 을 작성하는 위치입니다.
- vars: 변수를 작성하는 위치입니다.
- files: 이미지와 같은 정적 파일을 저장하는 위치입니다.
이번 실습에서는 tasks 폴더에 집중합니다.
Role 작업 정의
이제 Role 에 작업을 추가합니다. Role 의 기본 작업 목록은 tasks/main.yml에 있습니다.
디렉터리 구조를 확인할 때 유용한 tree 명령을 설치하는 간단한 작업을 작성합니다.
Role 의 작업 파일을 엽니다.
nano roles/myrole/tasks/main.yml
다음 내용을 추가합니다. 이미 tasks 파일 안에 있으므로 여기서는 tasks:로 시작하지 않습니다.
---
## tasks file for roles/myrole
- name: Ensure tree is installed
apt:
name: tree
state: present
become: yes
핵심 차이: 일반적인 Playbook 에는 tasks: 섹션이 있습니다. 하지만 Role 안에서는 이 파일 자체가 작업 목록이므로, 작업을 바로 나열하면 됩니다.
이러한 분리는 Role 의 재사용성을 높이는 이유 중 하나입니다. Role 은 자동화 로직의 특정 부분을 담당하고, Playbook 은 그 로직을 언제 어디에 포함할지 결정합니다.
저장하고 종료합니다.
마스터 Playbook 생성
이제 Role 을 만들었지만, Role 은 그 자체로 실행되지 않습니다. Role 을 호출하려면 "마스터 Playbook"이 필요합니다.
주 프로젝트 폴더에 site.yml 파일을 만듭니다.
nano ~/project/site.yml
이 Playbook 은 매우 짧습니다. "이 호스트에서 이 Role 을 실행하라"는 내용만 지정합니다.
이제 Playbook 은 모든 세부 작업을 담는 컨테이너라기보다 실행을 조정하는 오케스트레이터 역할을 합니다. 이것이 Role 이 만들어 내는 구조적 변화입니다.
---
- hosts: localhost
connection: local
roles:
- myrole
코드 이해하기:
roles::tasks:목록 대신 Role 목록을 지정합니다.- myrole: Ansible 은roles/디렉터리 안에서myrole이라는 폴더를 찾고, 그 안의tasks/main.yml에 있는 내용을 실행합니다.
저장하고 종료합니다.
검증 및 실행
실행하기 전에 오타가 없는지 확인합니다. Ansible 에는 기본 제공 구문 검사기가 있습니다.
다음 명령을 실행합니다.
ansible-playbook -i inventory --syntax-check site.yml
문제가 없으면 playbook: site.yml만 출력됩니다.
오류가 발생하면 메시지를 주의 깊게 읽습니다. 일반적으로 들여쓰기가 잘못된 정확한 줄 번호가 표시됩니다.
이제 Playbook 을 실제로 실행합니다.
ansible-playbook -i inventory site.yml
Role 의 작업이 실행되면서 다음과 같은 내용이 표시됩니다. TASK [myrole : Ensure tree is installed] ... changed
요약
이 실습에서는 Ansible 을 "전문적인" 방식으로 구성하는 방법을 배웠습니다.
- Role 초기화:
ansible-galaxy를 사용해 표준 폴더 구조를 만들었습니다. - 작업 정의:
tasks/main.yml안에 자동화 로직을 작성했습니다. - Role 사용: 간결한
site.yml마스터 Playbook 에서 Role 을 호출했습니다.
자동화 코드를 더 많이 작성하게 되면 모든 목적에 맞는 Role(예: apache, mysql, common) 을 만들 수 있습니다. 이렇게 하면 코드를 재사용하고 쉽게 읽을 수 있습니다.


