소개
인벤토리와 액세스 설정이 완료되면, 다음으로 흔히 수행하는 작업은 기준 (baseline) 파일을 배포하는 것입니다. 기준 파일에는 배너, 서비스 스니펫 또는 규정 준수 마커 등이 포함될 수 있으며, 이는 호스트 전반에서 일관성을 유지하면서도 호스트별 고유 값을 포함해야 합니다.
이번 실습에서는 소규모 다중 호스트 인벤토리를 생성하고, 그룹 변수를 정의하며, 템플릿을 작성하고, 플레이북을 실행한 뒤 호스트별 기준 파일이 올바르게 생성되었는지 확인합니다.
기준 배포 프로젝트 생성
이 단계에서는 인벤토리, 템플릿, 파일 및 플레이북을 포함하는 프로젝트를 생성합니다. 이 구조는 재사용 가능한 소스 콘텐츠와 플레이북 로직을 분리합니다.
프로젝트를 생성하고 해당 디렉토리로 이동합니다.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,playbooks,files,templates,managed}
cd rhce-ansible
ansible.cfg 파일을 생성합니다.
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF
이 디렉토리들은 워크플로우 내에서 역할을 구분합니다. files는 변경 없이 복사될 콘텐츠를, templates는 변수가 적용되어 렌더링될 콘텐츠를, playbooks는 자동화 로직을 담고 있으며, managed 디렉토리에는 최종적으로 호스트별 결과물이 저장됩니다.
인벤토리 및 기준 변수 생성
이 단계에서는 두 개의 관리형 호스트 별칭과 공유 기준 변수를 정의합니다. 이 변수들은 나중에 템플릿에서 사용됩니다.
이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오. 이렇게 하면 LabEx 가 각 단계를 개별적으로 실행하더라도 명령이 안정적으로 유지됩니다.
cd /home/labex/project/rhce-ansible
인벤토리를 생성합니다.
cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_connection=local
node2 ansible_connection=local
EOF
두 개의 별칭을 사용하면 하나의 플레이북으로 두 개의 개별 관리형 출력물을 생성할 수 있습니다. 두 별칭 모두 동일한 VM 에서 실행되지만, Ansible 은 각 호스트에 대해 inventory_hostname을 다르게 렌더링합니다.
관리형 호스트를 위한 그룹 변수를 생성합니다.
cat > inventory/group_vars/managed.yml <<'EOF'
baseline_owner: labex
baseline_environment: training
EOF
이 변수들은 managed 그룹의 모든 호스트에 적용됩니다. 이는 기준 설정 전반에서 공유되어야 하는 값을 나타내며, 호스트 이름은 호스트별로 고유하게 유지됩니다.
소스 파일 및 템플릿 생성
이 단계에서는 소스 콘텐츠를 생성합니다. 일반 파일은 변경 없이 복사되며, Jinja2 템플릿은 inventory_hostname 및 baseline_environment와 같은 변수를 사용하여 호스트별 출력물을 렌더링합니다.
이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.
cd /home/labex/project/rhce-ansible
공유 배너 파일을 생성합니다.
cat > files/banner.txt <<'EOF'
Managed by RHCE Ansible Prep
EOF
배너는 일반 소스 콘텐츠입니다. 작성된 그대로 복사되므로 호스트별로 달라지지 않아야 하는 텍스트에 유용합니다.
템플릿을 생성합니다.
cat > templates/baseline.conf.j2 <<'EOF'
host={{ inventory_hostname }}
environment={{ baseline_environment }}
owner={{ baseline_owner }}
EOF
템플릿에는 Jinja2 표현식이 포함되어 있습니다. Ansible 이 이를 렌더링할 때 inventory_hostname은 node1 또는 node2가 되며, 기준 변수는 inventory/group_vars/managed.yml에서 가져옵니다.
기준 배포 플레이북 작성
이 단계에서는 호스트 별칭마다 하나의 디렉토리를 생성하고 공유 배너와 렌더링된 템플릿을 모두 배포하는 플레이북을 작성합니다. 플레이북이 playbooks 디렉토리에 저장되므로 소스 경로는 ../files 및 ../templates를 사용합니다.
이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.
cd /home/labex/project/rhce-ansible
플레이북을 생성합니다.
cat > playbooks/deploy-baseline.yml <<'EOF'
---
- name: Deploy baseline files to managed aliases
hosts: managed
gather_facts: false
tasks:
- name: Create per-host baseline directory
ansible.builtin.file:
path: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}"
state: directory
mode: '0755'
- name: Copy shared banner
ansible.builtin.copy:
src: ../files/banner.txt
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/banner.txt"
mode: '0644'
- name: Render baseline configuration
ansible.builtin.template:
src: ../templates/baseline.conf.j2
dest: "/home/labex/project/rhce-ansible/managed/{{ inventory_hostname }}/baseline.conf"
mode: '0644'
EOF
세 가지 작업을 전체 배포 시퀀스로 이해하십시오. 먼저 각 호스트 별칭에 대한 대상 디렉토리가 생성되고, 정적 배너가 복사된 다음, 마지막으로 템플릿이 호스트별 구성 파일로 렌더링됩니다.
구문 검사를 실행합니다.
ansible-playbook playbooks/deploy-baseline.yml --syntax-check
구문 검사는 playbook: 라인을 출력해야 합니다. 이는 플레이북이 관리형 파일을 작성하기 전에 Ansible 이 상대 소스 경로를 올바르게 해석할 수 있음을 확인해 줍니다.
기준 배포 실행 및 확인
이 단계에서는 플레이북을 실행하고 렌더링된 파일을 검사합니다. 렌더링된 구성은 공유 환경 및 소유자 값은 유지하면서 호스트 이름에 따라 달라져야 합니다.
이 단계의 명령을 실행하기 전에 Ansible 프로젝트 디렉토리로 돌아가십시오.
cd /home/labex/project/rhce-ansible
플레이북을 실행합니다.
ansible-playbook playbooks/deploy-baseline.yml
첫 번째 실행 시 관리형 디렉토리와 파일이 아직 존재하지 않으므로 변경 사항이 보고되어야 합니다. failed=0으로 성공적인 요약이 표시되면 모든 호스트 별칭이 기준 파일을 성공적으로 수신한 것입니다.
배포된 파일을 검사합니다.
find managed -maxdepth 3 -type f -print
cat managed/node1/banner.txt managed/node1/baseline.conf managed/node2/banner.txt managed/node2/baseline.conf
banner.txt 파일은 서로 정확히 일치해야 합니다. baseline.conf 파일은 동일한 environment 및 owner 값을 공유하지만 host= 라인은 달라야 합니다.
요약
인벤토리 변수, 공유 소스 파일 및 Jinja2 템플릿을 사용하여 관리형 호스트 별칭에 기준 파일을 배포했습니다. 이것으로 반복 가능한 관리형 노드 상태 변경을 위한 기초 작업이 완료되었습니다.


