변수 우선순위 문제 디버깅

AnsibleBeginner
지금 연습하기

소개

동일한 변수가 여러 곳에 정의되어 있을 때, Ansible 은 우선순위 규칙을 적용합니다. 플레이북을 변경하기 전에 최종 값을 디버깅하는 것은 매우 중요합니다.

이 실습에서는 all, group, host 및 extra-var 수준에서 동일한 변수를 정의한 다음, 어떤 수준의 값이 우선 적용되는지 확인하는 보고서를 생성해 봅니다.

우선순위 실습 프로젝트 생성

이 단계에서는 all, group 및 host 변수 디렉터리가 포함된 프로젝트를 생성합니다.

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 이 선택한 최종 값을 직접 확인할 수 있습니다.

All 및 Group 변수 정의

이 단계에서는 group_vars/all.yml에 기본값을 정의한 다음, web 그룹에 대해 이를 재정의합니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉터리로 돌아가십시오. 이렇게 하면 LabEx 가 각 단계를 개별적으로 실행하더라도 명령이 안정적으로 유지됩니다.

cd /home/labex/project/rhce-ansible
cat > inventory/group_vars/all.yml <<'EOF'
app_port: 8000
app_source: all
EOF
cat > inventory/group_vars/web.yml <<'EOF'
app_port: 8080
app_source: group
EOF

group_vars/all.yml은 모든 호스트에 적용되며, group_vars/web.yml은 web 그룹에만 적용됩니다. web1과 web2는 모두 웹 호스트이므로, 그룹 값이 전체 호스트 기본값을 재정의해야 합니다.

cat inventory/group_vars/all.yml inventory/group_vars/web.yml

호스트 변수 재정의

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

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

이 파일은 web2에만 적용되므로 해당 호스트의 웹 그룹 값을 재정의해야 합니다. web1은 여전히 그룹 값을 사용해야 합니다.

ansible-inventory --host web2

플레이북을 실행하기 전에 인벤토리 출력을 사용하여 결정된 값을 확인하십시오. web2의 app_port가 9090으로 표시되어야 합니다.

결정된 변수 값 출력

이 단계에서는 각 호스트에 대해 Ansible 이 선택한 최종 값을 기록하는 플레이북을 작성하고 실행합니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉터리로 돌아가십시오.

cd /home/labex/project/rhce-ansible
cat > playbooks/show-precedence.yml <<'EOF'
---
- name: Show resolved variable precedence
  hosts: web
  gather_facts: false
  tasks:
    - name: Write resolved variable report
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: |
          host={{ inventory_hostname }}
          app_port={{ app_port }}
          app_source={{ app_source }}
        mode: '0644'
EOF

플레이북은 최종 결정된 값을 파일에 기록합니다. 이를 통해 우선순위를 시각적으로 확인할 수 있습니다. 각 보고서는 선택된 포트와 어떤 계층이 우선 적용되었는지 알려주는 소스 레이블을 모두 기록합니다.

ansible-playbook playbooks/show-precedence.yml | tee reports/normal-run.txt
cat reports/web1.txt reports/web2.txt

web1은 app_source=group을, web2는 app_source=host를 보여야 합니다. 이는 호스트 변수가 그룹 변수보다 더 구체적임을 증명합니다.

Extra 변수로 재정의

이 단계에서는 -e 옵션을 사용하여 추가 변수 (extra variables) 를 전달합니다. 추가 변수는 우선순위가 매우 높으며, 이번 실행에 한해 그룹 및 호스트 변수를 모두 재정의합니다. 이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉터리로 돌아가십시오.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/show-precedence.yml -e app_port=10080 -e app_source=extra | tee reports/extra-run.txt

추가 변수는 의도적으로 강력하게 설계되었습니다. 이번 실행 동안 그룹 및 호스트 변수를 모두 재정의하지만, 디스크에 있는 변수 파일 자체를 수정하지는 않습니다.

cat reports/web1.txt reports/web2.txt

이제 두 보고서 모두 추가 변수 값을 보여야 합니다. 만약 한 호스트만 변경되었다면 -e 옵션이 올바르게 입력되었는지 다시 확인하십시오.

요약

all, group, host 및 extra 변수를 비교하고, 생성된 보고서를 통해 각 우선순위 수준에서 Ansible 이 어떤 값을 적용하는지 확인했습니다.