소개

이 랩에서는 Ansible 코드를 모듈화하고 재사용 가능한 방식으로 구성하고 구조화할 수 있는 강력한 기능인 Ansible Role 을 탐구합니다. Role 은 알려진 파일 구조를 기반으로 관련 변수 (vars), 파일, 태스크 (tasks), 핸들러 (handlers) 및 기타 Ansible 아티팩트를 자동으로 로드하는 방법을 제공합니다. 이 랩을 마치면, 더 유지 관리 가능하고 확장 가능한 자동화 코드를 작성하는 데 도움이 되는 Ansible Role 을 생성, 사용 및 구성하는 방법을 이해하게 될 것입니다.

Ansible Roles 구조 이해

자체 Role 을 생성하기 전에 Ansible Role 의 구조를 이해해 보겠습니다.

Ansible Role 은 8 개의 주요 표준 디렉토리를 가진 정의된 디렉토리 구조를 가지고 있습니다. 각 디렉토리는 관련 내용을 포함하는 main.yml 파일을 포함해야 합니다. 각 디렉토리에 대한 간략한 개요는 다음과 같습니다.

  1. tasks - Role 에 의해 실행될 주요 태스크 목록을 포함합니다.
  2. handlers - 이 Role 또는 Role 외부에서 사용될 수 있는 핸들러를 포함합니다.
  3. defaults - Role 에 대한 기본 변수입니다.
  4. vars - Role 에 대한 기타 변수입니다.
  5. files - 이 Role 을 통해 배포할 수 있는 파일을 포함합니다.
  6. templates - 이 Role 을 통해 배포할 수 있는 템플릿을 포함합니다.
  7. meta - 이 Role 에 대한 일부 메타 데이터를 정의합니다.
  8. tests - Role 에 대한 테스트를 포함합니다.

간단한 Role 구조를 생성하는 것으로 시작해 보겠습니다. 먼저, 프로젝트 디렉토리로 이동합니다.

cd ~/project

이제 Role 을 위한 디렉토리를 생성해 보겠습니다.

mkdir -p roles/example_role
cd roles/example_role

mkdir 명령의 -p 플래그는 필요에 따라 상위 디렉토리를 생성합니다.

이제 Role 에 대한 기본 구조를 생성해 보겠습니다.

mkdir {tasks,handlers,defaults,vars,files,templates,meta}

이 명령은 Role 에 필요한 모든 디렉토리를 한 번에 생성합니다. 여러 디렉토리를 한 번에 생성하는 bash 의 편리한 바로 가기입니다.

이제 tasks 디렉토리에 main.yml 파일을 생성해 보겠습니다.

nano tasks/main.yml

이 파일에 다음 내용을 추가합니다.

---
- name: Print a message
  debug:
    msg: "This is a task from our example role!"

nano 편집기를 저장하고 종료합니다 (Ctrl+X, Y, Enter).

이제 간단한 태스크가 있는 기본 Role 구조를 생성했습니다. 다음 단계에서는 이를 확장하고 Role 을 사용하는 방법을 배우겠습니다.

Role 확장

이제 기본적인 Role 구조가 있으므로, 일반적인 Ansible Role 의 더 많은 구성 요소를 포함하도록 확장해 보겠습니다. 변수, 핸들러 및 템플릿을 추가할 것입니다.

먼저, 기본 변수를 추가해 보겠습니다. defaults 디렉토리에 main.yml 파일을 생성합니다.

nano defaults/main.yml

다음 내용을 추가합니다.

---
example_variable: "This is a default value"

이렇게 하면 Role 을 사용할 때 재정의할 수 있는 example_variable의 기본값이 설정됩니다.

다음으로, 핸들러를 생성해 보겠습니다. handlers 디렉토리에 main.yml 파일을 생성합니다.

nano handlers/main.yml

다음 내용을 추가합니다.

---
- name: Restart example service
  debug:
    msg: "This would restart a service in a real scenario"

실제 시나리오에서는 이 핸들러가 서비스를 다시 시작할 수 있지만, 이 예제에서는 메시지를 출력하기만 합니다.

이제 템플릿을 생성해 보겠습니다. templates 디렉토리에 example_template.j2라는 파일을 생성합니다.

nano templates/example_template.j2

다음 내용을 추가합니다.

This is an example template.
The value of example_variable is: {{ example_variable }}

이 템플릿은 Jinja2 구문을 사용하여 example_variable의 값을 포함합니다.

마지막으로, 이러한 새 구성 요소를 사용하도록 tasks/main.yml을 업데이트해 보겠습니다.

nano tasks/main.yml

기존 내용을 다음으로 바꿉니다.

---
- name: Print a message
  debug:
    msg: "This is a task from our example role!"

- name: Use our variable
  debug:
    msg: "The value of example_variable is: {{ example_variable }}"

- name: Create a file from our template
  template:
    src: example_template.j2
    dest: /tmp/example_file.txt
  notify: Restart example service

이 업데이트된 태스크 목록은 이제 변수를 사용하고, 템플릿에서 파일을 생성하며, 핸들러에 알립니다.

플레이북에서 역할 사용하기

이제 역할을 생성했으니, 플레이북에서 사용해 보겠습니다. 먼저 프로젝트 루트로 돌아갑니다:

cd ~/project

플레이북을 생성하기 전에 localhost 를 지정하는 간단한 인벤토리 파일을 생성해 보겠습니다:

nano inventory.ini

인벤토리 파일에 다음 내용을 추가합니다:

[local]
localhost ansible_connection=local

이 인벤토리 파일은 로컬 연결을 사용하는 localhost 를 멤버로 하는 local이라는 그룹을 정의합니다.

이제 use_role.yml이라는 새 플레이북 파일을 생성합니다:

nano use_role.yml

다음 내용을 추가합니다:

---
- name: Use our example role
  hosts: localhost
  roles:
    - example_role

이 플레이북은 단순히 localhost 에 example_role을 적용합니다.

이제 이 플레이북을 실행해 보겠습니다:

ansible-playbook -i inventory.ini use_role.yml

역할에서 정의한 작업 실행을 보여주는 출력이 표시되어야 합니다.

무슨 일이 일어났는지 자세히 살펴보겠습니다:

  1. Ansible 은 roles 디렉토리에서 example_role이라는 역할을 찾았습니다.
  2. 역할을 찾았고 tasks/main.yml에 정의된 작업을 실행했습니다.
  3. defaults/main.yml에 설정한 example_variable의 기본값을 사용했습니다.
  4. 템플릿을 사용하여 /tmp/example_file.txt에 파일을 생성했습니다.
  5. 마지막으로 디버그 메시지를 출력한 핸들러를 호출했습니다.

이것은 역할이 관련 작업, 변수 및 파일을 함께 패키징하여 Ansible 코드를 더 체계적이고 재사용 가능하게 만드는 방법을 보여줍니다.

Role 변수 재정의

Ansible Role 의 강력한 기능 중 하나는 기본 변수를 재정의하는 기능입니다. 이를 통해 다양한 시나리오에서 사용할 수 있는 유연한 Role 을 생성할 수 있습니다.

example_variable을 재정의하는 새 Playbook 을 생성해 보겠습니다. override_role_var.yml이라는 파일을 생성합니다.

nano override_role_var.yml

다음 내용을 추가합니다.

---
- name: Use our example role with a custom variable
  hosts: localhost
  vars:
    example_variable: "This is a custom value"
  roles:
    - example_role

이 Playbook 에서는 Role 을 적용하기 전에 example_variable을 사용자 지정 값으로 설정하고 있습니다.

이제 이 Playbook 을 실행해 보겠습니다.

ansible-playbook -i inventory.ini override_role_var.yml

이제 태스크가 기본 값 대신 example_variable에 대한 사용자 지정 값을 사용하는 것을 볼 수 있습니다.

이것은 합리적인 기본값을 가진 Role 을 생성하면서도 필요할 때 동작을 사용자 지정할 수 있는 유연성을 갖는 방법을 보여줍니다.

Role 종속성

Ansible Role 은 다른 Role 에 종속될 수 있습니다. 이를 통해 더 간단한 Role 을 결합하여 더 복잡한 Role 을 구축할 수 있습니다. example_role에 종속된 새 Role 을 생성해 보겠습니다.

먼저, 새 Role 구조를 생성합니다.

cd ~/project/roles
mkdir -p dependent_role/{tasks,meta}

이제 Role 종속성을 정의해 보겠습니다. meta 디렉토리에 main.yml 파일을 생성합니다.

nano dependent_role/meta/main.yml

다음 내용을 추가합니다.

---
dependencies:
  - role: example_role

이것은 dependent_roleexample_role에 종속된다는 것을 지정합니다.

이제 dependent_role에 태스크를 추가해 보겠습니다. tasks 디렉토리에 main.yml 파일을 생성합니다.

nano dependent_role/tasks/main.yml

다음 내용을 추가합니다.

---
- name: Task from dependent role
  debug:
    msg: "This task is from the dependent role"

이제 dependent_role을 사용하기 위한 Playbook 을 생성해 보겠습니다. 프로젝트 루트로 돌아갑니다.

cd ~/project
nano use_dependent_role.yml

다음 내용을 추가합니다.

---
- name: Use our dependent role
  hosts: localhost
  roles:
    - dependent_role

마지막으로, 이 Playbook 을 실행해 보겠습니다.

ansible-playbook -i inventory.ini use_dependent_role.yml

example_roledependent_role의 태스크가 모두 실행되는 것을 볼 수 있습니다. 이것은 Role 종속성을 통해 더 간단한 Role 을 결합하여 더 복잡한 자동화를 구축하는 방법을 보여줍니다.

요약

이 Lab 에서 Ansible Role 에 대해 배웠습니다. Ansible 코드를 구성하고 구조화하기 위한 강력한 기능입니다. 주요 내용은 다음과 같습니다.

  1. Ansible Role 은 알려진 파일 구조를 기반으로 관련 변수, 파일, 태스크, 핸들러 및 기타 Ansible 아티팩트를 자동으로 로드하는 방법을 제공합니다.
  2. Role 의 기본 구조에는 태스크, 핸들러, 기본값, 변수, 파일, 템플릿 및 메타 정보를 위한 디렉토리가 포함됩니다.
  3. Role 을 사용하면 Role 이 사용될 때 재정의될 수 있는 기본 변수를 설정하여 유연성과 재사용성을 제공할 수 있습니다.
  4. Role 내에서 템플릿을 사용하여 동적 콘텐츠가 있는 파일을 생성할 수 있습니다.
  5. Role 은 Playbook 에 쉽게 포함될 수 있으므로 한 줄로 복잡한 구성을 적용할 수 있습니다.
  6. Playbook 에서 Role 변수를 재정의하여 Role 자체를 수정하지 않고도 Role 의 동작을 사용자 정의할 수 있습니다.
  7. Role 은 다른 Role 에 종속될 수 있으므로 더 간단한 Role 을 결합하여 더 복잡한 자동화를 구축할 수 있습니다.

Ansible Role 은 유지 관리 가능하고 재사용 가능한 Ansible 코드를 작성하기 위한 기본적인 개념입니다. 복잡한 자동화 작업을 더 작고 관리하기 쉬운 조각으로 나누고, 조직 전체에서 코드 재사용을 촉진할 수 있습니다. Ansible 을 계속 사용하면서 Role 은 특히 더 크고 복잡한 프로젝트에서 자동화 도구 상자의 필수 도구가 될 것입니다.