그룹 변수, 호스트 변수 및 팩트 관리

AnsibleBeginner
지금 연습하기

소개

변수를 사용하면 작업 로직 외부에서 데이터를 관리할 수 있습니다. 그룹 변수는 공유 값을 제공하고, 호스트 변수는 개별 호스트의 설정을 재정의하며, 팩트는 시스템에서 자동으로 탐색된 데이터를 추가합니다.

이번 실습에서는 그룹 변수와 호스트 변수를 정의하고, RHEL 팩트를 수집하며, 호스트 별칭마다 하나의 보고서를 생성하는 과정을 진행합니다.

변수 실습 프로젝트 생성

이 단계에서는 웹 호스트 별칭과 변수 디렉토리가 포함된 프로젝트를 생성합니다.

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

두 호스트 모두 로컬 별칭이지만, Ansible 은 각 인벤토리 이름에 대해 변수를 별도로 해석합니다. 이를 통해 추가적인 VM 없이도 호스트별 재정의 (override) 를 연습할 수 있습니다.

공유 그룹 변수 설정

이 단계에서는 web 그룹의 모든 호스트에 적용되는 값을 정의합니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오. 이렇게 하면 LabEx 가 각 단계를 개별적으로 실행하더라도 명령이 안정적으로 유지됩니다.

cd /home/labex/project/rhce-ansible
cat > inventory/group_vars/web.yml <<'EOF'
service_name: demo-web
service_port: 8080
EOF

이 값들은 web 그룹의 모든 호스트에 적용됩니다. 현재 시점에서 web1과 web2 모두 포트 8080을 사용하게 됩니다.

cat inventory/group_vars/web.yml

호스트 변수 재정의

이 단계에서는 web2에 대해서만 service_port를 재정의합니다. 호스트 변수는 그룹 변수보다 우선순위가 높습니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.

cd /home/labex/project/rhce-ansible
cat > inventory/host_vars/web2.yml <<'EOF'
service_port: 9090
EOF

이 파일은 group_vars/web.yml보다 구체적이므로 web2만 9090을 사용하게 됩니다. web1은 계속해서 그룹 값을 사용합니다.

ansible-inventory --host web2

해석된 호스트 출력을 검사하고 service_port를 확인하십시오. 이 명령은 플레이북이 실행되기 전에 Ansible 이 사용할 최종 값을 보여줍니다.

팩트 기반 보고서 플레이북 작성

이 단계에서는 인벤토리 변수와 수집된 팩트를 결합하는 플레이북을 작성합니다. ansible_distribution_major_version 팩트는 관리 대상 호스트에서 가져옵니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.

cd /home/labex/project/rhce-ansible
cat > playbooks/report-vars.yml <<'EOF'
---
- name: Render variable and fact reports
  hosts: web
  gather_facts: true
  tasks:
    - name: Write per-host variable report
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: |
          host={{ inventory_hostname }}
          service={{ service_name }}
          port={{ service_port }}
          rhel_major={{ ansible_distribution_major_version }}
        mode: '0644'
EOF

이 보고서는 service_port와 같은 인벤토리 변수와 ansible_distribution_major_version과 같은 수집된 팩트라는 두 가지 데이터 소스를 결합합니다. 이는 구성이 선언된 의도와 발견된 시스템 세부 정보 모두에 의존할 때 흔히 사용하는 패턴입니다.

ansible-playbook playbooks/report-vars.yml --syntax-check

변수 보고서 실행

이 단계에서는 플레이북을 실행하고 보고서를 비교합니다. 공유 값은 일치해야 하며, web2의 포트는 달라야 합니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.

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

실행 시 먼저 팩트를 수집한 다음 각 호스트에 대한 보고서를 작성합니다. failed=0으로 성공적인 요약이 표시되면 두 호스트 별칭 모두 보고서가 성공적으로 생성된 것입니다.

cat reports/web1.txt reports/web2.txt

port= 라인을 비교해 보십시오. web1은 8080을, web2는 9090을 표시해야 합니다. 공유된 service= 값은 두 보고서 모두에서 동일해야 합니다.

요약

그룹 변수를 정의하고, 호스트 변수로 값을 재정의하며, 팩트를 수집하고, Ansible 이 각 값을 어떻게 해석했는지 증명하는 보고서를 생성해 보았습니다.