그룹 및 변수를 사용한 정적 인벤토리 구축

AnsibleBeginner
지금 연습하기

소개

인벤토리는 Ansible 이 관리할 수 있는 호스트와 해당 호스트가 속한 그룹을 정의합니다. 체계적인 인벤토리 구조를 갖추면 호스트를 명확하게 타겟팅하고 적절한 범위에서 변수를 할당할 수 있습니다.

이번 실습에서는 호스트 별칭, 그룹, 하위 그룹, 그룹 변수, 호스트 변수를 포함하는 정적 인벤토리를 구축하고, 변수가 예상대로 적용되는지 확인하는 간단한 플레이북을 작성해 봅니다.

인벤토리 프로젝트 생성

이 단계에서는 인벤토리 실습에 사용할 프로젝트 디렉토리를 생성합니다. 본 실습에서는 RHEL 10 VM 내부에서 인벤토리 동작을 안전하게 학습할 수 있도록 로컬 호스트 별칭을 사용합니다.

프로젝트 디렉토리를 생성하고 이동합니다.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible

Ansible 이 기본적으로 해당 인벤토리를 사용하도록 ansible.cfg 파일을 생성합니다.

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

이 실습에서는 변수 파일을 inventory/group_vars 및 inventory/host_vars 아래에 배치합니다. 이러한 구조를 사용하면 인벤토리 데이터를 한곳에서 관리할 수 있으며, 변수가 inventory/hosts에 정의된 호스트에 속한다는 점을 명확히 할 수 있습니다.

호스트, 그룹 및 하위 그룹 정의

이 단계에서는 정적 인벤토리를 생성합니다. 각 호스트 별칭은 ansible_connection=local을 사용하므로, 명령은 현재 VM 에서 실행되면서도 관리 대상 호스트처럼 동작합니다. 하위 그룹을 사용하면 한 그룹 안에 다른 그룹을 포함시킬 수 있습니다.

이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아오십시오. 이렇게 하면 LabEx 가 각 단계를 개별적으로 실행하더라도 명령이 안정적으로 유지됩니다.

cd /home/labex/project/rhce-ansible

inventory/hosts 파일을 생성합니다.

cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local

[db]
db1 ansible_connection=local

[prod:children]
web
db
EOF

그룹 그래프를 확인합니다.

ansible-inventory --graph

web 및 db 섹션은 일반 그룹을 정의합니다. [prod:children] 섹션은 부모 그룹을 정의하므로, 그래프에는 prod 그룹이 두 그룹과 세 개의 호스트 별칭을 모두 포함하고 있는 모습이 나타나야 합니다.

그룹 및 호스트 변수 추가

이 단계에서는 그룹과 개별 호스트에 변수를 할당합니다. 그룹 변수는 해당 그룹의 모든 호스트에 적용되며, 호스트 변수는 특정 호스트에 대한 값을 재정의하거나 보완합니다.

이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아오십시오.

cd /home/labex/project/rhce-ansible

웹 호스트를 위한 변수를 생성합니다.

cat > inventory/group_vars/web.yml <<'EOF'
service_role: web
service_port: 8080
EOF

이 값들은 web 그룹의 모든 호스트에 적용됩니다. 이 인벤토리에서 web1과 web2는 모두 웹 역할과 포트를 상속받게 됩니다.

데이터베이스 호스트를 위한 변수를 생성합니다.

cat > inventory/group_vars/db.yml <<'EOF'
service_role: database
service_port: 5432
EOF

데이터베이스 호스트는 일반적으로 다른 서비스 설정이 필요하므로 데이터베이스 그룹에는 다른 값이 할당됩니다. 그룹별로 파일을 분리하면 모든 플레이북 작업에 조건문을 넣을 필요가 없어집니다.

web2를 위한 호스트 전용 변수를 생성합니다.

cat > inventory/host_vars/web2.yml <<'EOF'
rack: rack-b
EOF

호스트 변수는 이 실습에서 사용하는 가장 좁은 범위의 변수입니다. rack 값은 web2에만 적용되므로, 그룹 전체에 적용되는 데이터와 호스트 전용 데이터의 차이를 쉽게 확인할 수 있습니다.

확인된 호스트 변수 검사

이 단계에서는 Ansible 을 사용하여 선택한 호스트에 대해 해석된 변수 값을 확인합니다. 이는 플레이북을 작성하기 전에 인벤토리를 디버깅하는 안전한 방법입니다.

이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아오십시오.

cd /home/labex/project/rhce-ansible

web1을 검사합니다.

ansible-inventory --host web1

web1은 웹 역할과 포트를 보여주지만 rack 변수는 없어야 합니다. 이 변수가 없다는 것은 web2의 호스트 전용 파일이 그룹 전체에 실수로 적용되지 않았음을 보여주는 유용한 증거입니다.

web2를 검사하여 호스트 전용 rack 값이 있는지 확인합니다.

ansible-inventory --host web2 | grep -E 'service_role|service_port|rack'

db1을 검사합니다.

ansible-inventory --host db1 | grep -E 'service_role|service_port'

플레이북을 작성하기 전에 세 호스트를 모두 비교해 보십시오. 이것이 일반적인 인벤토리 디버깅 흐름입니다. 먼저 상속된 그룹 값을 확인한 다음, 호스트 전용 값이 존재하는지 확인하는 방식입니다.

변수 보고서 플레이북 작성

이 단계에서는 인벤토리 호스트당 하나의 보고서 파일을 작성하는 간단한 플레이북을 생성합니다. 작업 시 inventory_hostname을 사용하므로 모든 별칭이 로컬에서 실행되더라도 각 별칭마다 고유한 파일이 생성됩니다.

이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아오십시오.

cd /home/labex/project/rhce-ansible

플레이북을 생성합니다.

cat > playbooks/write-inventory-report.yml <<'EOF'
---
- name: Write inventory variable reports
  hosts: prod
  gather_facts: false
  tasks:
    - name: Write report for each inventory host
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: "{{ inventory_hostname }} role={{ service_role }} port={{ service_port }} rack={{ rack | default('none') }}\n"
        mode: '0644'
EOF

{{ inventory_hostname }} 표현식은 현재 호스트 별칭으로 확장되므로, 하나의 작업으로 web1, web2, db1에 대한 개별 보고서 파일을 생성할 수 있습니다. default('none') 필터는 rack이 정의되지 않은 호스트에서 오류가 발생하는 것을 방지합니다.

플레이북을 실행하고 보고서를 확인합니다.

ansible-playbook playbooks/write-inventory-report.yml

이 플레이는 웹 및 데이터베이스 호스트를 모두 포함하는 부모 그룹인 prod를 대상으로 합니다. 결과 요약에는 세 개의 별칭이 모두 포함되어야 하며 failed=0으로 완료되어야 합니다.

cat reports/*.txt

보고서 파일은 인벤토리 변수가 올바르게 해석되었음을 보여주는 최종 증거입니다. web2.txt에는 rack-b가 포함되어야 하며, 다른 호스트들은 rack=none으로 표시되어야 합니다.

요약

그룹, 하위 그룹, 그룹 변수 및 호스트 변수를 사용하여 정적 인벤토리를 구축했습니다. 또한 ansible-inventory와 간단한 플레이북을 사용하여 변수 해석 결과를 검증했습니다.