새소식

IaC/Ansible

[A101 Study 2주차] Ansible (Role)

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 A101 Study 2주차 스터디 내용 정리

 

 

해당 스터디는 '앤서블로 시작하는 인프라 자동화' 책을 기반으로 진행하였습니다.
실습 환경은 저번주와 마찬가지로 'Control Node 1 대 + Target Node 3대' 로 구성하였습니다.



1. Ansible 롤 (Role)

 

앤서블 롤은 플레이북 내용을 기능 단위로 나누어 공통 부품으로 관리/재사용하기 위한 구조 입니다.
모듈이나 라이브러리같은 개념과 비슷하며, 기존에 만들어 놓은 롤을 현재 플레이북에 추가하여 사용할 수 있습니다.

 

앤서블 롤의 장점

 

  1. 콘텐츠를 그룹화하여 코드를 다른 사용자와 쉽게 공유
  2. 웹 서버, 데이터베이스 서버 또는 깃 리포지터리와 같은 시스템 유형의 필수 요소 정의
  3. 대규모 프로젝트를 쉽게 관리
  4. 다른 사용자와 동시 개발 가능
  5. 앤서블 갤럭시를 통해 공유하거나 다른 사람이 공유한 롤을 가져올 수 있음



1.1. 롤 생성 및 롤 구조

 

롤은 하위 디렉터리 및 파일의 표준화된 구조에 의해 정의됩니다.

 

하위 디렉터리 기능
defaults 이 디렉터리의 main.yml 파일에는 롤이 사용될 때 덮어쓸 수 있는 롤 변수의 기본값이 포함되어 있습니다.
이러한 변수는 우선순위가 낮으며 플레이에서 변경할 수 있습니다.
files 이 디렉터리에는 롤 작업에서 참조한 정적 파일이 있습니다.
handlers 이 디렉터리의 main.yml 파일에는 롤의 핸들러 정의가 포함되어 있습니다.
meta 이 디렉터리의 main.yml 파일에는 작성자, 라이센스, 플랫폼 및 옵션, 롤 종속성을 포함한 롤에 대한 정보가 들어 있습니다.
tasks 이 디렉터리의 main.yml 파일에는 롤의 작업 정의가 포함되어 있습니다.
templates 이 디렉터리에는 롤 작업에서 참조할 Jinja2 템플릿이 있습니다.
tests 이 디렉터리에는 롤을 테스트하는 데 사용할 수 있는 인벤토리와 test.yml 플레이북이 포함될 수 있습니다.
vars 이 디렉터리의 main.yml 파일은 롤의 변수 값을 정의합니다. 종종 이러한 변수는 롤 내에서 내부 목적으로 사용됩니다.
또한 우선순위가 높으며, 플레이북에서 사용될 때 변경되지 않습니다.

 

롤 생성

 

'ansible-galaxy role' 명령어를 사용한 후, tree 명령어를 통해 role 구조를 확인합니다.

ansible-galaxy role init my-role

 

tree ./my-role/

# 다음 결과가 출력됨
./my-role/
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml



1.2. 롤을 이용한 플레이북 개발

 

앞서 생성한 롤을 이용하여 플레이북을 개발해보겠습니다.
개발하고자 하는 플레이북의 프로세스는 다음과 같습니다.

 

  1. 롤이 호출되면 현재 호스트 OS 버전이 지원 OS 목록에 포함되는 지 확인
  2. OS 가 CentOS 나 레드햇일 경우, dnf 모듈을 활용하여 httpd 패키지를 설치
  3. 설치 후, 제어 노드의 files/index.html 파일을 관리 노드의 /var/www/html 디렉터리에 복사
  4. 복사 후 httpd 서비스 재시작

 

main task 작성 ( tasks/main.yml )

 

'task/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

- name: copy conf file
  ansible.builtin.copy:
    src: "{{ src_file_path }}"
    dest: "{{ dest_file_path }}"
  notify: 
    - restart service

 

index.html 파일 생성 ( files/index.html )

 

'files/index.html' 에는 롤 작업에서 참조할 정적 파일이 정의됩니다.

echo "Hello! Ansible" > my-role/files/index.html

 

핸들러 작성 ( handlers/main.yml )

 

'handlers/main.yml' 에는 해당 롤 작업에서 사용될 핸들러를 정의합니다.
task/main.yml 의 'restart service' 'notify' 에 의해 호출됩니다.

---
# handlers file for my-role

- name: restart service
  ansible.builtin.service:
    name: "{{ service_name }}"
    state: restarted

 

가변 변수 작성 ( defaults/main.yml )

 

'defaults/main.yml' 에는 외부로부터 재정의 될 수 있는 가변 변수를 정의합니다.
여기서는 serivce_title 을 외부에서 받아 수정할 수 있도록 합니다.

echo 'service_title: "Apache Web Server"' >> my-role/defaults/main.yml

 

불변 변수 작성 ( vars/main.yml )

 

'vars/main.yml' 에는 외부로부터 변수 값을 수정할 수 없는 변수를 정의합니다.
롤 내의 플레이북에서만 사용되는 변수로 정의하는 것이 좋습니다.

 

---
# vars file for my-role

service_name: apache2
src_file_path: ../files/index.html
dest_file_path: /var/www/html
httpd_packages:
  - apache2
  - apache2-doc

supported_distros:
  - Ubuntu



 

1.3. 플레이북에 롤 추가

 

앤서블 롤을 실행하기 위해서는 롤을 호출해주는 플레이북이 필요합니다.

 

앤서블 롤을 추가하기 위한 2가지 방법

 

  1. ansible.builtin.import_role 모듈 - 정적 롤 추가
  2. ansible.builtin.include_role 모듈 - 동적 롤 추가

 

import_role 사용

 

---
- 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

 

 

 


 

참고 문서

 

 

 

Contents

포스팅 주소를 복사했습니다