재사용 가능한 역할 (Role) 생성 및 적용

AnsibleBeginner
지금 연습하기

소개

역할 (Role) 은 기본값, 작업 (Task), 템플릿, 파일 및 핸들러를 재사용 가능한 구조로 패키징합니다. 역할을 사용하면 플레이북을 간결하게 유지할 수 있으며 자동화 코드를 더 쉽게 공유할 수 있습니다.

이번 실습에서는 직접 역할을 생성하고, 기본값과 템플릿, 작업을 추가한 뒤 두 개의 호스트 별칭에 적용해 보겠습니다.

역할 실습 프로젝트 생성

이 단계에서는 roles 디렉터리와 두 개의 로컬 웹 호스트 별칭이 포함된 프로젝트를 생성합니다.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,roles,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
roles_path = ./roles
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF

roles_path = ./roles 설정은 플레이북에서 사용하는 역할 이름을 Ansible 이 어디에서 찾을지 알려줍니다. 이 설정이 없으면 Ansible 은 시스템 또는 사용자 수준의 역할 경로만 검색할 수 있습니다.

역할 디렉터리 구조 생성

이 단계에서는 핵심 역할 디렉터리를 생성합니다. defaults는 우선순위가 낮은 변수를 저장하고, tasks는 작업 로직을, templates는 Jinja2 템플릿을 저장합니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉터리로 돌아가십시오. 이렇게 하면 LabEx 가 각 단계를 개별적으로 실행하더라도 명령어가 안정적으로 유지됩니다.

cd /home/labex/project/rhce-ansible
mkdir -p roles/web_banner/{defaults,tasks,templates}
find roles/web_banner -maxdepth 2 -type d | sort

출력 결과에는 역할 루트와 함께 defaults, tasks, templates가 표시되어야 합니다. 이러한 이름은 Ansible 에서 중요한 의미를 갖습니다. 예를 들어, tasks/main.yml은 해당 역할의 작업 진입점입니다.

역할 기본값 및 템플릿 추가

이 단계에서는 기본 변수와 템플릿을 추가합니다. 플레이북이나 인벤토리에서 값을 재정의하지 않는 한, 역할은 이 기본값을 사용합니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉터리로 돌아가십시오.

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/defaults/main.yml <<'EOF'
---
banner_message: Welcome to RHCE Ansible Prep
EOF
cat > roles/web_banner/templates/banner.txt.j2 <<'EOF'
Host: {{ inventory_hostname }}
Message: {{ banner_message }}
EOF

기본값 (Defaults) 은 우선순위가 낮은 역할 변수입니다. 플레이북이나 인벤토리에서 값을 제공하지 않을 때 역할이 사용할 수 있는 값을 제공하며, 나중에 호출자가 이를 재정의할 수 있도록 허용합니다.

cat roles/web_banner/defaults/main.yml roles/web_banner/templates/banner.txt.j2

템플릿은 현재 호스트 별칭과 기본 메시지를 결합합니다. 두 호스트에 대해 역할을 실행하면 동일한 템플릿이 두 개의 서로 다른 Host: 라인을 렌더링하게 됩니다.

역할 작업 추가 및 역할 적용

이 단계에서는 tasks/main.yml과 역할을 적용하는 플레이북을 추가합니다. 이 역할은 호스트 디렉터리를 생성하고 호스트당 하나의 배너 파일을 렌더링합니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉터리로 돌아가십시오.

cd /home/labex/project/rhce-ansible
cat > roles/web_banner/tasks/main.yml <<'EOF'
---
- name: Ensure host banner directory exists
  ansible.builtin.file:
    path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
    state: directory
    mode: '0755'

- name: Render host banner
  ansible.builtin.template:
    src: banner.txt.j2
    dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
    mode: '0644'
EOF
cat > playbooks/apply-role.yml <<'EOF'
---
- name: Apply reusable web banner role
  hosts: web
  gather_facts: false
  roles:
    - role: web_banner
EOF

역할 작업 파일에는 구현 내용이 포함되어 있으며, playbooks/apply-role.yml은 간결하게 유지되면서 역할 이름만 명시합니다. 이것이 바로 역할의 핵심 가치입니다. 모든 플레이북에서 모든 작업을 반복할 필요 없이 재사용 가능한 구조를 제공하는 것입니다.

ansible-playbook playbooks/apply-role.yml --syntax-check

역할 기반 플레이북 실행

이 단계에서는 플레이북을 실행하고 렌더링된 파일을 검사합니다. 역할이 재사용 가능한 구현을 담고 있기 때문에 플레이북은 간결하게 유지됩니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉터리로 돌아가십시오.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/apply-role.yml | tee reports/role-run.txt

실행 시 web 그룹의 각 호스트 별칭에 대해 역할이 한 번씩 실행되어야 합니다. failed=0으로 성공적인 요약이 표시된다면, roles_path를 통해 역할을 성공적으로 찾았고 작업이 완료되었음을 의미합니다.

cat managed/web1/banner.txt managed/web2/banner.txt

렌더링된 파일들은 동일한 메시지를 공유하지만 서로 다른 Host: 라인을 가져야 합니다. 이는 역할이 동일한 로직을 재사용하면서도 호스트별 데이터를 올바르게 렌더링했음을 증명합니다.

요약

재사용 가능한 역할 구조를 구축하고, 기본값, 작업, 템플릿을 추가했으며, 플레이북에서 역할을 적용하고 렌더링된 출력을 확인했습니다.