관리형 노드에 기준 파일 배포하기

AnsibleBeginner
지금 연습하기

소개

인벤토리와 액세스 설정이 완료되면, 다음으로 흔히 수행하는 작업은 기준 (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 템플릿을 사용하여 관리형 호스트 별칭에 기준 파일을 배포했습니다. 이것으로 반복 가능한 관리형 노드 상태 변경을 위한 기초 작업이 완료되었습니다.