소개
신뢰할 수 있는 파일 자동화는 컨트롤러의 소스, 관리 사본, 점검을 위해 되가져온 산출물을 구분합니다. 올바른 파일 이름만으로는 콘텐츠 무결성, 권한, 호스트 신원을 확인할 수 없습니다.
배너를 배포하고 stat과 register로 실제 SHA-256 메타데이터를 점검한 다음 호스트별 운영 보고서를 생성하여 별도의 컨트롤러 경로로 가져옵니다. 준비된 두 호스트 SSH 환경과 권한 모델은 앞서 연습한 것과 같습니다.
관리 권한을 명시하여 파일 배포하기
이 단계에서는 비공개 컨트롤러 소스를 보호된 관리 디렉터리에 복사하고 원격 소유권과 권한을 명시적으로 선택합니다.
Terminal을 열고 프로젝트로 이동합니다.
cd /home/labex/project
마지막 줄바꿈을 포함하여 재사용 가능한 컨트롤러 소스를 만듭니다.
printf 'Managed service banner\n' > site-banner.txt
chmod는 로컬 파일의 권한을 변경합니다. 권한 0600은 소유자에게 읽기/쓰기를 허용하고 그룹과 다른 사용자에게는 접근을 허용하지 않습니다. 컨트롤러 소스는 비공개로 유지하면서 관리 권한은 의도적으로 다르게 선택합니다.
chmod 0600 site-banner.txt
배포 플레이북을 작성합니다.
cat > deploy-banner.yml <<'EOF'
- name: Distribute the managed banner
hosts: all
gather_facts: false
become: true
tasks:
- name: Prepare the managed site directory
ansible.builtin.file:
path: /srv/ansible-site
state: directory
owner: root
group: automation
mode: "0750"
- name: Copy the controller banner with explicit managed permissions
ansible.builtin.copy:
src: /home/labex/project/site-banner.txt
dest: /srv/ansible-site/banner.txt
owner: root
group: automation
mode: "0640"
EOF
플레이 수준의 become은 /srv 아래에 쓰고 root 소유권을 할당하는 데 필요한 관리 노드의 권한 상승을 요청합니다. 컨트롤러에서 소스를 읽는 프로세스를 root 로그인으로 바꾸지는 않습니다.
디렉터리는 root 소유, automation 그룹, 권한 0750입니다. 배너는 root 소유, automation 그룹, 권한 0640입니다. 따라서 일반 automation 계정은 쓰기 권한 없이 디렉터리를 통과하고 배너를 읽을 수 있습니다. 명시적인 관리 mode는 컨트롤러 소스의 0600 권한과 독립적입니다.
플레이북을 확인하고 적용합니다.
ansible-playbook deploy-banner.yml --syntax-check
ansible-playbook deploy-banner.yml
두 호스트 모두 실패 없이 완료되어야 합니다. become 없이 일반 읽기 접근을 테스트합니다.
ansible all -m ansible.builtin.command -a 'cat /srv/ansible-site/banner.txt'
각 호스트는 Managed service banner를 출력해야 합니다. 이는 소스와 관리 사본을 별도 파일로 유지하면서 의도한 원격 그룹 읽기 접근을 보여 줍니다.
구조화된 파일 메타데이터 등록 및 사용하기
이 단계에서는 실제 관리 배너를 점검하고 메타데이터로 호스트별 운영 보고서를 씁니다.
stat 모듈은 파일을 복사하는 대신 정보를 반환합니다. checksum_algorithm: sha256은 콘텐츠 검증에 SHA-256을 선택합니다. register는 같은 호스트의 이후 태스크를 위해 해당 태스크 결과를 저장하며 stat 필드에 파일 메타데이터가 담깁니다.
점검 플레이북을 만듭니다.
cat > inspect-and-collect.yml <<'EOF'
- name: Inspect the banner and prepare host reports
hosts: all
gather_facts: true
tasks:
- name: Inspect managed content and permissions
ansible.builtin.stat:
path: /srv/ansible-site/banner.txt
checksum_algorithm: sha256
register: banner_info
- name: Display the structured file metadata
ansible.builtin.debug:
var: banner_info.stat
- name: Write the per-host report from real metadata
become: true
ansible.builtin.copy:
dest: /srv/ansible-site/node-report.txt
content: |
host={{ inventory_hostname }}
distribution={{ ansible_facts.distribution }}
banner_sha256={{ banner_info.stat.checksum }}
owner: root
group: automation
mode: "0640"
EOF
debug 모듈은 var로 기존 변수를 표시하므로 banner_info.stat에서 exists, mode, 소유자/그룹 이름, size, checksum 같은 필드를 볼 수 있습니다. 메타데이터 표시는 파일을 만들거나 이후 작업의 성공을 증명하지 않습니다.
copy 태스크는 inventory_hostname 및 배포판 팩트와 함께 banner_info.stat.checksum을 사용합니다. root 소유 보고서를 쓰려면 태스크 수준의 become이 필요합니다. 점검 태스크 자체는 일반 읽기 접근을 사용합니다.
점검 및 보고서 생성을 실행합니다.
ansible-playbook inspect-and-collect.yml
메타데이터에는 권한 0640, 소유자 root, 그룹 automation인 일반 파일이 표시되어야 합니다. 각 보고서는 고유한 호스트 이름과 실제 원격 배너에서 얻은 SHA-256 값을 가집니다.
sha256sum은 로컬 파일의 SHA-256 다이제스트를 계산하고 다이제스트 뒤에 이름을 출력합니다. 컨트롤러 소스 다이제스트를 메타데이터 및 보고서 값과 비교합니다.
sha256sum site-banner.txt
두 원격 보고서를 읽습니다.
ansible all -m ansible.builtin.command -a 'cat /srv/ansible-site/node-report.txt'
각 결과에는 host=web1 또는 host=web2, distribution=Ubuntu, banner_sha256 뒤에 일치하는 64자 다이제스트가 있어야 합니다. 관찰 결과를 고정된 debug 메시지로 대체하지 말고 각 실제 호스트에 연결하여 유지하세요.
별도 보고서를 컨트롤러로 가져오기
이 단계에서는 한 호스트의 결과가 다른 호스트의 결과를 덮어쓰지 않도록 두 관리 보고서를 수집합니다.
copy는 보통 컨트롤러 소스를 관리 대상으로 보냅니다. fetch는 반대 방향으로 작동합니다. src는 관리 노드에 있고 dest는 컨트롤러 디렉터리입니다. flat이 false이면 fetch는 dest 아래에 인벤토리 호스트 이름과 원격 경로를 포함합니다.
기존 점검 플레이북에 다음 태스크를 덧붙입니다. 다른 태스크 항목과 들여쓰기를 맞추세요. >>는 이전 stat, register, 보고서 태스크를 대체하지 않고 추가합니다.
cat >> inspect-and-collect.yml <<'EOF'
- name: Collect each managed report without flattening host paths
ansible.builtin.fetch:
src: /srv/ansible-site/node-report.txt
dest: /home/labex/project/reports/
flat: false
EOF
전체 점검 및 수집 흐름을 실행합니다.
ansible-playbook inspect-and-collect.yml
첫 fetch는 두 컨트롤러 사본을 만들어야 합니다. 보고서의 그룹 권한이 이미 읽기를 허용하므로 각 대상에서 일반 automation 계정으로 실행됩니다.
로컬에서 수집된 각 산출물을 확인합니다.
cat reports/web1/srv/ansible-site/node-report.txt
cat reports/web2/srv/ansible-site/node-report.txt
경로는 독립된 호스트 신원을 보존합니다. 각 보고서의 host 필드는 경로와 일치해야 하며 두 checksum 필드 모두 배포된 소스와 일치해야 합니다. 두 결과를 하나의 공용 파일 이름으로 평탄화하면 한 호스트의 산출물을 잃게 됩니다.
전체 흐름을 반복합니다.
ansible-playbook inspect-and-collect.yml
소스, 팩트, 파일 상태가 바뀌지 않았다면 두 호스트 모두 changed=0과 실패/연결 불가 결과 없음을 보고해야 합니다. 이제 실제 관리 메타데이터에 근거한 보고서를 각각 수집했습니다.
요약
컨트롤러와 관리 파일 상태를 구분하고 원격 소유권과 권한을 선언했으며, 단순히 성공 메시지를 출력하는 대신 등록된 stat 메타데이터를 사용했습니다. 호스트별 보고서는 실제 SHA-256 무결성 정보를 기록했고 fetch는 안정적인 반복 실행과 함께 두 호스트의 산출물을 별도 컨트롤러 경로에 보존했습니다.


