Ssoon
[ Part-2 ] 앤서블 기본 사용법 - Role 본문
CloudNet@ 가시다님이 진행하는 Ansible 101 Study
"앤서블로 시작하는 인프라 자동화" (한빛미디어) 로 진행
✅ role 구조 소개 및 사용법
- Role
- 앤서블 코드를 쉽게 재사용
- 인프라를 프로비저닝하거나 애플리케이션을 배포하는 데 필요한 모든 것을 표준화된 디렉터리 구조로 패키징
- 디렉터리를 복사하여 롤을 다른 프로젝트로 복사한 다음 플레이 내에서 호출
- 콘텐츠를 그룹화 ▶ 다른 사용자와 공유
- 웹서버, 데이터베이스 또는 git 리포지터리와 같은 시스템 유형의 필수 요소를 정의
- 대규모 프로젝트를 쉽게 관리
- 다른 사용자와 동시 개발
- 잘 작성된 롤 ▶ 앤서블 갤럭시를 통해 공유
💠 앤서블 롤 구조
- 하위 디렉터리 및 파일의 표준화된 구조에 의해 정의
- 최상위 디렉터리 ▶ Role 자체의 이름을 의미
- 하위 디렉터리 ▶ tasks 및 handler 등 Role에서 목적에 따라 정의
하위 디렉터리 | 기능 |
defaults | main.yml 파일에는 role이 사용될 때 덮어쓸 수 있는 role 변수의 기본값이 포함 이러한 변수는는 우선순위가 낮으며 플레이에서 변경 가능 |
files | role 작업에서 참조한 정적 파일 |
handlers | main.yml 파일에는 role의 핸들러 정의가 포함 |
meta | main.yml 파일에는 작성자, 라이센스, 플랫폼 및 옵션, role 종속성을 포함한 role에 대한 정보 |
tasks | main.yml 파일에는 role 작업 정의가 포함 |
templates | role 작업에서 참조핳 jinja2 템플릿 |
tests | role 테스트하는 데 사용할 수 있는 인베토리와 test.yml 플레이북이 포함 |
vars | main.yml 파일은 role의 변수 값을 정의 이러한 변수는 role 내에서 내부 목적으로 사용 우선 순위가 높으며, 플레이북에서 사용될 때 변경되지 않음 |
- 사용 가능한 서브 명령어와 의미 확인
- my-role 이라는 role 생성
- my-role 구조를 확인하기 위해 먼저 tree 설치
- my-role 구조를 확인
💠 role 을 이용한 playbook 개발vars
- 프로세스
- role 호출 > 현재 호스트의 운영체제 버전이 지원 운영체제 목록에 포함되는지 확인
- 운영체제가 CentOS 이거나 Rocky 이면 httpd 관련 패키지를 dnf 모듈로 설치
- 설치 완료 > 제어 노트의 files 디렉터리 안에 있는 index.html 파일을 관리 노드의 /var/www/html 디렉터리에 복사
- 파일 복사 완료 > httpd 서비스 재시작
- role 구조
- role 이름 ▶ my-role
- tasks
- install service ▶ httpd 관련 패키지 설치
- copy html file ▶ index.html 파일 복사
- files (정적 파일)
- index.html
- handlers (핸들러)
- restart service ▶ httpd 서비스 재시작
- defaults (가변 변수) ▶ 메인 태스크에서 사용된 변수 선언
- service_title
- vars (불변 변수) ▶ 메인 태스크와 핸들러에서 사용된 변수 선언
- service_name ▶ 서비스명
- src_file_path ▶ 복사할 파일 경로
- dest_file_path ▶파일이 복사될 디렉터리 경로
- httpd_packages ▶ httpd 관련 패키지 목록
- supported_distros ▶ 지원 os 목록
- tasks/main.yml
- 1번째 태스크 install service
- 변수로 정의한 서비스 명을 함께 출력
- ansible.builtin.dnf 모듈로 httpd 관련 패키지 설치
- 관련 패키지는 여러 개이며 loop 사용
- 2번째 태스크 copy html file
- ansible.builtin.copy 모듈로 파일 복사
- 복사가 끝나면 restart service 핸들러 호출
- 1번째 태스크 install service
# tasks file for my-role
- name: install service {{ service_title }}
ansible.builtin.dnf:
name: "{{ item }}"
state: latest
loop: "{{ httpd_packages }}"
when: ansible_facts.distribution in supported_distros
- name: copy html file
ansible.builtin.copy:
src: "{{ src_file_path }}"
dest: "{{ dest_file_path }}"
notify:
- restart service
- files/index.html
Hello Ansible
- handlers/main.yml
- 특정 태스크가 끝나고 그 다음에 실행되는 태스크
- ansible.builtin.service 모듈로 서비스 재시작
# handlers file for my-role
- name: restart service
ansible.builtin.service:
name: "{{ service_name }}"
state: restarted
- defaults/main.yml
- 외부로부터 재정의될 수 있는 가변 변수
- service_title을 외부에서 받아 수정이 가능
- 기본값은 "apache web server"
# defaults file for my-role
service_title: "apache web server"
- vars/main.yml
- 한 번 정의되면 외부로부터 변수 값을 수정
- role 내의 playbook 에서만 사용되는 변수로 정의
# vars file for my-role
service_name: httpd
src_file_path: ../files/index.html
dest_file_path: /var/www/html
httpd_packages:
- httpd-tools
- httpd-filesystem
- httpd
supported_distros:
- CentOS
- Rcoky
💠 playbook 에 role 추가하기
- role 을 실행하기 위해서는 role을 호출하는 playbook 필요
- ansible.builtin.import_role 모듈 이용 ▶ role을 정적으로 추가 ▶ 고정된 role을 추가
- ansible.builtin.include_role 모듈 이용 ▶ role을 동적으로 추가 ▶반복문이나 조건문에 의해 role 변경
- role-example.yml
- ansible.builtin.import_role 모듈을 이용 my-role 롤 추가
- hosts: tnode1-centos.exp.com
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
- ansible-playbook 실행
- default/main.yml 파일에 정의된 가변변수 service_title을 role을 호출하는 곳에서 재정의하는 playbook으로 수정
- hosts: tnode1-centos.exp.com
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
vars:
service_title: Httpd
- ansible-playbook 실행
💠 playbook 에서 role 섹션 사용하기
- role 섹션에 role 을 나열
- role 섹션
- task 섹션과 유사하나 작업 목록이 아닌 role 목록으로 구성
- my-role2 새로운 role 생성
- my-role2/tasks/main.yml
- firewalld 방화벽 서비스에 httpd 서비스를 추가하는 태스크
- firewalld 서비스를 다시 로딩하는 태스크
# tasks file for my-role2
- name: config firewalld
ansible.builtin.firewalld:
service: "{{ item }}"
permanent: true
state: enabled
loop: "{{ service_port }}"
- name: reload firewalld
ansible.builtin.service:
name: firewalld
state: reloaded
- my-role2/vars/main.yml
- service_port 변수를 정의
# vars file for my-role2
service_port:
- http
- https
- role-example2.yml
- hosts 섹션과 task 섹션 사이에 roles 섹션을 추가
- hosts: tnode1-centos.exp.com
roles:
- my-role
- my-role2
tasks:
- name: print finish role play
ansible.builtin.debug:
msg: "Finish role play"
- -- check
- playbook 실제 수행하기 전에 어떻게 play 될지 미리 시뮬레이션
- 1번째 my-role 태스크 실행 ▶ 2번째 my-role2 태스트 실행
- role-example3.yml
- defults/main.yml 파일에 가변 변수의 값 service_title: "Httpd Web" 함께 적용
- hosts: tnode1-centos.exp.com
roles:
- role: my-role
service_title: "Httpd Web"
- role: my-role2
tasks:
- name: print finish role play
ansible.builtin.debug:
msg: "Finish role play"
- ansible-playbook --check 실행
💠 특수 작업 섹션
- pre_tasks ▶ role 또는 일반 태스크 전에 실행
- post_tasks ▶ tasks 및 tasks에서 알림을 받은 핸들러 다음에 실행
- special_role.yml
- hosts: tnode1-centos.exp.com
pre_tasks:
- name: print start role
ansible.builtin.debug:
msg: "let's start role play"
roles:
- role: my-role
- role: my-role2
tasks:
- name: curl test
ansible.builtin.uri:
url: http://tnode1-centos.exp.com
return_content: true
register: curl_result
notify: print result
changed_when: true
post_tasks:
- name: print finish role
ansible.builtin.debug:
msg: "finish role play"
handlers:
- name: print result
ansible.builtin.debug:
msg: "{{ curl_result.content }}"
- ansible-playbook --check 실행
- 가장 먼저 pre_tasks 섹션 실행
- role 섹션 : my-role, my-role2 차례대로 실행
- "curl test" task 섹션 실행
- notify 구문에 의해 handlers 섹션의 "print result" 실행
- 가장 마지막 post_tasks 섹션 실행
- ansible-playbook 실행
'Ansible 101 Study' 카테고리의 다른 글
[ Part-3 ] 앤서블 활용 - 시스템 구축 자동 (0) | 2024.02.03 |
---|---|
[ Part-2 ] 앤서블 기본 사용법 - 핸들러 및 작업 실패 처리 (0) | 2024.01.20 |
[ Part-2 ] 앤서블 기본 사용법 - 조건문 (0) | 2024.01.20 |
[ Part-2 ] 앤서블 기본 사용법 - 반복문 (0) | 2024.01.15 |
[ Part-2 ] 앤서블 기본 사용법 - 팩트 (0) | 2024.01.14 |
Comments