Ansible 기초 · 파일을 상태로 다룬다 · 실습
권한 640 이 1204 로 나간 날 — 파일을 상태로 다루기
목표
파일과 디렉터리를 명령이 아니라 상태로 선언합니다. 따옴표 없는 8진수가 남기는 권한을 직접 재고, 백업과 검증으로 되돌릴 근거와 깨진 설정 차단을 붙이고, 표식이 붙은 구획·링크·상태 보고서·경로 점검기까지 만듭니다.
왜 중요한가
셸로 mkdir·cp·chmod·sed -i 네 줄을 그대로 옮겨 놓으면 자동화처럼 보이지만 세 가지가 동시에 무너집니다. 두 번째 실행이 첫 번째와 달라지고, 무엇을 덮어썼는지 아무 데도 남지 않고, 깨진 설정이 그대로 올라갑니다. Ansible 의 파일 모듈은 이 셋을 각각 state 와 backup 과 validate 로 답합니다. 여기에 여러 줄 구획을 안전하게 관리하는 blockinfile 의 표식, 배포에 쓰는 링크의 두 종류, 그리고 아무것도 바꾸지 않고 사실만 읽는 stat 이 더해지면 설정 배포의 골격이 완성됩니다. 이 실습은 그 골격을 한 번에 한 조각씩 손으로 세우고, 마지막에는 '지금 이 경로가 어떤 상태인가' 를 판정하는 도구를 직접 만들어 봅니다.
단계
1. /root/ans/files/hosts.ini 에 web 그룹의 호스트 web1(ansible_host=127.0.0.1, ansible_port=2222, ansible_user=root)을 적고, /root/ans/files/p01.yml 로 네 디렉터리를 만드세요 — /root/ans/files/tree/conf 와 /root/ans/files/tree/logs 와 /root/ans/files/out 은 0755, /root/ans/files/tree/secrets 는 0700 입니다.
2. /root/ans/files/p02.yml 로 세 파일을 만드세요 — /root/ans/files/tree/secrets/api.key 는 "0600", /root/ans/files/tree/conf/motd.txt 는 "0644", 그리고 /root/ans/files/scratch/decimal.txt 는 따옴표 없이 mode: 644 로 적습니다. 그런 다음 stat -c %a 가 decimal.txt 에 대해 내놓는 값을 /root/ans/files/out/mode-trap.txt 에 한 줄로 적으세요.
3. /root/ans/files/p03.yml 로 /root/ans/files/tree/conf/app.conf 를 배치하세요. 내용은 listen_port={{ app_port }} 와 env=prod 두 줄이고 app_port 의 기본값은 8080, 권한은 "0644", backup 을 켭니다. 같은 플레이북이 /root/ans/files/tree/conf/deprecated.conf 와 /root/ans/files/tree/logs/archive/old.log 도 만들게 하세요. 먼저 기본값으로 한 번 돌린 뒤 -e app_port=9090 으로 다시 돌려 백업이 생기게 하고, 그 백업 경로가 /root/ans/files/out/backup-path.txt 에 남게 하세요.
4. /root/ans/files/p04.yml 로 /root/ans/files/tree/conf/app.json 을 배치하세요. 내용은 app_json 변수에서 오고 기본값은 service 가 web, port 가 8080 인 JSON 이며, copy 에 validate 를 붙여 JSON 문법을 검사하게 합니다. 그런 다음 같은 플레이북을 -e "app_json=not json at all" 로 한 번 더 돌려 실패한 출력을 /root/ans/files/out/validate-fail.txt 에 남기세요.
5. /root/ans/files/p05.yml 로 /root/ans/files/tree/conf/hosts.block 을 다루세요. 파일이 없을 때만 127.0.0.1 localhost 한 줄로 만들고(이미 있으면 덮지 않습니다), blockinfile 로 표식 # {mark} ANSIBLE MANAGED BLOCK: web pool 을 쓰는 구획에 10.10.0.11 web1 과 10.10.0.12 web2 두 줄을 넣으세요. 플레이북을 두 번 돌려도 블록이 한 벌이어야 합니다.
6. /root/ans/files/p06.yml 로 네 가지를 하세요 — 없을 때만 /root/ans/files/tree/logs/app.log 를 만들고, /root/ans/files/tree/logs/latest.log 가 그 파일을 가리키는 심볼릭 링크가 되게 하고, /root/ans/files/tree/conf/motd.hard 가 /root/ans/files/tree/conf/motd.txt 의 하드 링크가 되게 하고, 마지막으로 latest.log 경로에 "0640" 을 걸되 링크를 따라가게 해서 app.log 의 권한이 바뀌게 하세요.
7. /root/ans/files/p07.yml 로 /root/ans/files/tree/conf/app.conf 의 상태를 stat 으로 확인하되 체크섬은 sha256 으로 받고, /root/ans/files/out/stat-report.json 에 path·exists·mode·size·checksum 다섯 키를 담은 JSON 을 남기세요. 이어서 /root/ans/files/tree/conf/app.json 을 fetch 로 가져와 /root/ans/files/fetched/app.json 한 파일로 떨어지게 하세요.
8. /root/ans/files/p08.yml 로 /root/ans/files/tree/conf/deprecated.conf 와 /root/ans/files/tree/logs/archive 를 없는 상태로 만드세요. 그리고 경로 목록 파일을 인자로 받아 경로마다 <경로> LINK <가리키는 곳> · <경로> DIR <권한> · <경로> FILE <권한> · <경로> ABSENT 중 하나를 한 줄로 내는 /root/ans/files/audit.sh 를 쓰세요. /root/ans/files/paths.txt 에 위의 두 경로와 /root/ans/files/tree/conf/app.conf, /root/ans/files/tree/logs/latest.log, /root/ans/files/tree/secrets 를 적고 결과를 /root/ans/files/out/state-report.txt 에 저장하세요.
참고
- 작업 디렉터리는
/root/ans/files입니다. 인벤토리의 호스트는 이 파드 안 127.0.0.1:2222 의 sshd 로 붙으므로 대상과 컨트롤러가 같은 파일 시스템을 봅니다. - 모듈을 찾을 때는
ansible-doc ansible.builtin.file처럼 부르면 인자와 예시가 그 자리에서 나옵니다. - 흔한 실수:
mode를 따옴표 없이 적는 것. 2단계에서 그 결과를 직접 재 봅니다. - 흔한 실수: 이미 있는 남의 파일에
copy를 덮어쓰기로 걸어, 앞서 넣은 블록이 매 실행마다 사라졌다 붙는 것. - 흔한 실수:
state: file로 없는 파일을 만들려고 하는 것. 그 값은 이미 있는 파일의 속성만 맞춥니다. - [file 모듈](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html) · [copy 모듈](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html) · [blockinfile 모듈](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/blockinfile_module.html) · [stat 모듈](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/stat_module.html) · [fetch 모듈](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/fetch_module.html)
단계 8개
- 디렉터리 트리를 상태로 선언하기
- 따옴표 없는 8진수가 남기는 권한 직접 재기
- 덮어쓰기 전의 내용을 남기기
- 검사를 통과한 설정만 제자리에 놓기
- 표식이 붙은 구획만 갈아 끼우기
- 심볼릭 링크와 하드 링크, 그리고 follow
- 상태를 읽어 보고서로 남기고 컨트롤러로 가져오기
- 치우는 것도 상태다 — 그리고 경로 점검기 만들기