카테고리 없음

[Ansible] Role 기초

★용호★ 2024. 1. 28. 01:21

 

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 웹 실행해보기

  1. Role 작성을 위해 초기 디렉토리 구성
    ansible-galaxy role init yongho.httpd
    cd yongho.httpd
  1. 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
  1. httpd 웹의 메인 페이지인 index.html 파일 작성
    echo "Hello! Ansible" > files/index.html
  1. 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
  1. 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
  1. Playbook 실행
    ansible-playbook -i inventory role-example.yml
  1. 결과 확인
    curl tnode1
    
    # 결과
    Hello! Ansible

실습2 - 앤서블 갤럭시에서 Role 사용해보기

  1. Ansible Galaxy 접속
  1. 역할(Role) 메뉴에서 원하는 키워드 입력 후 검색. 여기서는 Wordpress 설치
  1. 정렬 기준을 다운로드 순으로하면 많이 활용되고 있는 Role이 무엇인지 알 수 있음. 상위에 있는 Role 중에 적합한 Role 선택
  1. 선택한 Role의 문서 탭으로 이동하면 설치 방법과 Playbook 작성 방법을 확인할 수 있음
  1. 설치 및 Playbook 파일 작성
    ansible-galaxy role install inmotionhosting.wordpress
    
    cat << EOF > wordpress.yml
    - hosts: all
      roles:
        - role: inmotionhosting.wordpress
    EOF
  1. Playbook 실행 및 결과 확인
    ansible-playbook -i inventory wordpress.yml