공통 모듈을 사용한 멱등성 (Idempotent) 플레이북 작성

AnsibleBeginner
지금 연습하기

소개

멱등성 (Idempotence) 이란 플레이북을 반복적으로 실행하더라도, 원하는 상태가 이미 존재하거나 변경이 필요 없는 경우 시스템에 아무런 영향을 주지 않는 성질을 의미합니다.

이번 실습에서는 일반적인 Ansible 모듈을 사용하여 호스트 별칭을 위한 디렉토리와 설정 파일을 생성하고, 플레이북을 두 번 실행하여 두 번째 실행 시 시스템이 안정적으로 유지됨을 확인합니다.

멱등성 실습 프로젝트 생성

이 단계에서는 두 개의 로컬 관리 호스트 별칭을 포함하는 작은 Ansible 프로젝트를 생성합니다. 각 별칭은 자체 디렉토리에 기록되므로, 하나의 RHEL 10 VM 환경 내에서도 호스트별 결과를 개별적으로 확인할 수 있습니다.

기본 LabEx 작업 공간에서 시작합니다.

cd /home/labex/project

-p 옵션은 mkdir 명령어가 필요할 때 상위 디렉토리를 생성하도록 하며, 디렉토리가 이미 존재하더라도 오류 없이 성공하도록 합니다.

mkdir -p rhce-ansible/{inventory/group_vars,playbooks,managed,reports}
cd rhce-ansible

Ansible 이 인벤토리를 참조하고 재시도 (retry) 파일 생성을 비활성화하도록 프로젝트 기본 설정을 생성합니다.

cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF

managed 디렉토리에는 플레이북에 의해 생성된 파일들이 저장되며, reports 디렉토리에는 저장된 플레이북 실행 결과가 보관됩니다. 이들을 분리하여 관리하면 원하는 상태와 Ansible 실행 결과 간의 비교가 훨씬 쉬워집니다.

로컬 관리 호스트 및 변수 정의

이 단계에서는 인벤토리와 그룹 변수를 생성합니다. 별칭들은 ansible_connection=local을 사용하는데, 이는 Ansible 이 이 VM 내부에서 안전하게 실행되면서 지정된 호스트를 대상으로 작업함을 의미합니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오. 이렇게 하면 LabEx 가 각 단계를 별도로 실행하더라도 명령어가 안정적으로 유지됩니다.

cd /home/labex/project/rhce-ansible

하나의 그룹에 두 개의 앱 호스트 별칭을 생성합니다.

cat > inventory/hosts <<'EOF'
[app]
app1 ansible_connection=local
app2 ansible_connection=local
EOF

그룹 변수는 그룹 내 모든 호스트가 공유하는 원하는 상태를 정의합니다.

cat > inventory/group_vars/app.yml <<'EOF'
app_owner: labex
app_environment: training
app_message: Managed by Ansible common modules
EOF

Ansible 이 두 호스트를 인식하는지 확인합니다.

ansible app --list-hosts

출력 결과에 app1과 app2가 나열되어야 합니다. app 그룹을 대상으로 하는 플레이는 인벤토리에서 해당 그룹으로 해석되는 호스트에만 영향을 미칠 수 있으므로, 플레이북을 작성하기 전에 이 확인 과정을 거치는 것이 좋습니다.

원하는 상태의 플레이북 작성

이 단계에서는 file, copy, lineinfile 모듈을 사용하는 플레이북을 작성합니다. 이 모듈들은 쉘 명령어를 수동으로 실행하는 대신 최종 상태를 기술합니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.

cd /home/labex/project/rhce-ansible

플레이북을 생성합니다. 경로에 {{ inventory_hostname }}을 포함하여 각 별칭이 고유한 출력 디렉토리를 갖도록 합니다.

cat > playbooks/common-modules.yml <<'EOF'
---
- name: Configure app host directories with common modules
  hosts: app
  gather_facts: false
  tasks:
    - name: Ensure host directory exists
      ansible.builtin.file:
        path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
        state: directory
        mode: '0755'

    - name: Install base application configuration
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/app.conf"
        content: |
          owner={{ app_owner }}
          environment={{ app_environment }}
          message={{ app_message }}
        mode: '0644'

    - name: Ensure managed message is present
      ansible.builtin.lineinfile:
        path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/app.conf"
        line: "message={{ app_message }}"
        create: true
        mode: '0644'
EOF

file 태스크는 디렉토리를 생성하고, copy 태스크는 전체 설정을 작성하며, lineinfile 태스크는 특정 라인을 강제로 유지하는 방법을 보여줍니다. 이 모듈들은 현재 상태와 원하는 상태를 비교하기 때문에 멱등성을 가질 수 있습니다.

새 플레이북을 실행하기 전에 구문 검사를 수행합니다.

ansible-playbook playbooks/common-modules.yml --syntax-check

플레이북 실행 및 파일 검사

이 단계에서는 원하는 상태를 적용하는 플레이북을 처음으로 실행합니다. 대상 파일이 아직 존재하지 않으므로 첫 번째 실행에서는 변경 사항이 보고되어야 합니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.

cd /home/labex/project/rhce-ansible

플레이북을 실행하고 나중에 비교할 수 있도록 결과를 저장합니다.

ansible-playbook playbooks/common-modules.yml | tee reports/first-run.txt

호스트 디렉토리와 app.conf 파일이 새로 생성되므로 첫 번째 실행에서는 변경 사항이 보고됩니다. tee 명령어를 사용하면 실행 과정을 화면으로 확인하면서 동시에 멱등성 검사를 위한 출력 결과를 파일로 저장할 수 있습니다.

Ansible 이 생성한 호스트별 파일을 검사합니다.

cat managed/app1/app.conf managed/app2/app.conf

두 파일 모두 동일한 소유자, 환경, 메시지 값을 포함하고 있어야 하지만, 각 호스트 별칭 디렉토리 아래에 각각 생성되었습니다. 이는 플레이북이 각 인벤토리 호스트에 동일한 원하는 상태를 성공적으로 적용했음을 보여줍니다.

멱등성 검증을 위한 플레이북 재실행

이 단계에서는 동일한 플레이북을 다시 실행합니다. 파일들이 이미 원하는 상태와 일치하므로, Ansible 은 두 호스트 모두에 대해 변경 사항이 없음을 보고해야 합니다. 이 단계의 명령어를 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.

cd /home/labex/project/rhce-ansible

플레이북을 두 번째로 실행하고 결과를 저장합니다.

ansible-playbook playbooks/common-modules.yml | tee reports/second-run.txt

요약 라인에서 changed=0을 확인합니다.

grep -E 'app[12].*changed=0' reports/second-run.txt

두 번째 실행에서 changed=0이 나타나는 것은 멱등성의 핵심 신호입니다. 이는 모듈이 기존 파일을 검사한 결과, 수정이 필요 없음을 확인했음을 의미합니다.

요약

Ansible 프로젝트를 구축하고, 공통 모듈을 사용하여 원하는 상태를 기술하고, 플레이북을 실행한 뒤, 두 번째 실행에서 변경 사항이 없음을 확인하여 멱등성을 성공적으로 검증했습니다.