LabHub
배우기 러닝패스 코스

Ansible 기초 · 파일을 상태로 다룬다 · 실습

권한 640 이 1204 로 나간 날 — 파일을 상태로 다루기

LabHub 에서 이어서 보기

목표

파일과 디렉터리를 명령이 아니라 상태로 선언합니다. 따옴표 없는 8진수가 남기는 권한을 직접 재고, 백업과 검증으로 되돌릴 근거와 깨진 설정 차단을 붙이고, 표식이 붙은 구획·링크·상태 보고서·경로 점검기까지 만듭니다.

왜 중요한가

셸로 mkdir·cp·chmod·sed -i 네 줄을 그대로 옮겨 놓으면 자동화처럼 보이지만 세 가지가 동시에 무너집니다. 두 번째 실행이 첫 번째와 달라지고, 무엇을 덮어썼는지 아무 데도 남지 않고, 깨진 설정이 그대로 올라갑니다. Ansible 의 파일 모듈은 이 셋을 각각 statebackupvalidate 로 답합니다. 여기에 여러 줄 구획을 안전하게 관리하는 blockinfile 의 표식, 배포에 쓰는 링크의 두 종류, 그리고 아무것도 바꾸지 않고 사실만 읽는 stat 이 더해지면 설정 배포의 골격이 완성됩니다. 이 실습은 그 골격을 한 번에 한 조각씩 손으로 세우고, 마지막에는 '지금 이 경로가 어떤 상태인가' 를 판정하는 도구를 직접 만들어 봅니다.

단계

1. /root/ans/files/hosts.iniweb 그룹의 호스트 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/out0755, /root/ans/files/tree/secrets0700 입니다.
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 %adecimal.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 변수에서 오고 기본값은 serviceweb, port8080 인 JSON 이며, copyvalidate 를 붙여 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 web110.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.jsonpath·exists·mode·size·checksum 다섯 키를 담은 JSON 을 남기세요. 이어서 /root/ans/files/tree/conf/app.jsonfetch 로 가져와 /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 에 저장하세요.

참고

단계 8개

  1. 디렉터리 트리를 상태로 선언하기
  2. 따옴표 없는 8진수가 남기는 권한 직접 재기
  3. 덮어쓰기 전의 내용을 남기기
  4. 검사를 통과한 설정만 제자리에 놓기
  5. 표식이 붙은 구획만 갈아 끼우기
  6. 심볼릭 링크와 하드 링크, 그리고 follow
  7. 상태를 읽어 보고서로 남기고 컨트롤러로 가져오기
  8. 치우는 것도 상태다 — 그리고 경로 점검기 만들기