Role
- 정의 : 플레이북 내용을 기능 단위로 나누어 공통 부품으로 관리/재사용하기 위한 구조
- 롤을 사용하면 사용자들이 잘 만들어놓은 Playbook의 조합을 가져다가 활용할 수 있음
- 앤서블 갤럭시를 통해 템플릿을 공유하고 다운받을 수 있음
- 이미 많은 사용자가 사용 중이고, 보안적으로 검증된 Playbook들을 파라미터 변경만으로 손쉽게 가져다 사용할 수 있기 때문에 안정성과 생산성을 높일 수 있음
- 여러 사람과 공유할 수 있으려면 표준화된 설정이 있어야 함. 앤서블의 롤도 사전에 정의된 디렉토리 구조와 설정들을 제공하고 이 가이드라인에 맞춰 롤을 작성해야함
- 롤을 실행하려면 반드시 Playbook을 통해서 실행해야함
- Playbook에서 Role 사용
- 하나의 Playbook에서 여러 Role을 사용할 수도 있음
Role 디렉토리 구조
하위 디렉터리 | 기능 |
defaults | 이 디렉터리의 main.yml 파일에는 롤이 사용될 때 덮어쓸 수 있는 롤 변수의 기본값이 포함되어 있습니다. 이러한 변수는 우선순위가 낮으며 플레이에서 변경할 수 있습니다. |
files | 이 디렉터리에는 롤 작업에서 참조한 정적 파일이 있습니다. |
handlers | 이 디렉터리의 main.yml 파일에는 롤의 핸들러 정의가 포함되어 있습니다. |
meta | 이 디렉터리의 main.yml 파일에는 작성자, 라이센스, 플랫폼 및 옵션, 롤 종속성을 포함한 롤에 대한 정보가 들어 있습니다. |
tasks | 이 디렉터리의 main.yml 파일에는 롤의 작업 정의가 포함되어 있습니다. |
templates | 이 디렉터리에는 롤 작업에서 참조할 Jinja2 템플릿이 있습니다. |
tests | 이 디렉터리에는 롤을 테스트하는 데 사용할 수 있는 인벤토리와 test.yml 플레이북이 포함될 수 있습니다. |
vars | 이 디렉터리의 main.yml 파일은 롤의 변수 값을 정의합니다. 종종 이러한 변수는 롤 내에서 내부 목적으로 사용됩니다. 또한 우선순위가 높으며, 플레이북에서 사용될 때 변경되지 않습니다. |
사용 방법
- ansible-galaxy 명령어를 사용해서 Role 작성 준비
ansible-galaxy role ROLE_ACTION option # Role 작성을 위한 초기 셋팅 ansible-galaxy role init <Role 이름>
- Role 구성에 필요한 task와 handler 등의 스크립트 작성
- Playbook 작성
- hosts: tnode1 tasks: - name: Print start play ansible.builtin.debug: msg: "Let's start role play" - name: Install Service by role ansible.builtin.import_role: name: my-role
실습1 - Role을 활용하여 httpd 웹 실행해보기
- Role 작성을 위해 초기 디렉토리 구성
ansible-galaxy role init yongho.httpd cd yongho.httpd
- httpd 서비스 설치를 위한 task 작성
cat << EOF > tasks/main.yml --- # tasks file for my-role - name: install service {{ service_title }} ansible.builtin.apt: name: "{{ item }}" state: latest # 변수에 정의된 패키지들을 반복하면서 모두 설치 loop: "{{ httpd_packages }}" # 변수에 정의된 지원되는 배포판의 경우에만 서비스 설치 진행 when: ansible_facts.distribution in supported_distros # 웹 실행 시 사전에 만들어놓은 index.html 파일을 사용하기 위해 파일 복사 수행 - name: copy conf file ansible.builtin.copy: src: "{{ src_file_path }}" dest: "{{ dest_file_path }}" # copy가 완료되면 notify에 정의된 행위를 수행. 여기서는 서비스 재시작 notify: - restart service EOF
- httpd 웹의 메인 페이지인 index.html 파일 작성
echo "Hello! Ansible" > files/index.html
- 2번 항목의 task에서 사용할 핸들러와 변수 정의
# notify를 통해 실행될 핸들러 정의 cat << EOF > handlers/main.yml - name: restart service ansible.builtin.service: name: "{{ service_name }}" state: restarted EOF # Task에 사용될 변수 정의 cat << EOF > vars/main.yml service_name: apache2 src_file_path: ../files/index.html dest_file_path: /var/www/html httpd_packages: - apache2 - apache2-doc supported_distros: - Ubuntu EOF
- Role을 수행할 Playbook 작성
# Role의 상위 디렉토리에서 Playbook 생성 cd .. # 인벤토리 생성 cat << EOF > inventory [all] tnode1 EOF # Playbook 작성 cat << EOF > role-example.yml --- - hosts: all tasks: - name: Print start play ansible.builtin.debug: msg: "Let's start role play" - name: Install Service by role ansible.builtin.import_role: name: yongho.httpd EOF
- Playbook 실행
ansible-playbook -i inventory role-example.yml
- 결과 확인
curl tnode1 # 결과 Hello! Ansible
실습2 - 앤서블 갤럭시에서 Role 사용해보기
- 역할(Role) 메뉴에서 원하는 키워드 입력 후 검색. 여기서는 Wordpress 설치
- 정렬 기준을 다운로드 순으로하면 많이 활용되고 있는 Role이 무엇인지 알 수 있음. 상위에 있는 Role 중에 적합한 Role 선택
- 선택한 Role의 문서 탭으로 이동하면 설치 방법과 Playbook 작성 방법을 확인할 수 있음
- 설치 및 Playbook 파일 작성
ansible-galaxy role install inmotionhosting.wordpress cat << EOF > wordpress.yml - hosts: all roles: - role: inmotionhosting.wordpress EOF
- Playbook 실행 및 결과 확인
ansible-playbook -i inventory wordpress.yml
댓글