Ssoon

[ Part-2 ] 앤서블 기본 사용법 - Role 본문

Ansible 101 Study

[ Part-2 ] 앤서블 기본 사용법 - Role

구구달스 2024. 1. 20. 16:31
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 핸들러 호출
# 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 실행

 
Comments